数学建模社区-数学中国

标题: 图像的加噪与去噪(python) [打印本页]

作者: 杨利霞    时间: 2020-4-28 15:43
标题: 图像的加噪与去噪(python)
7 k5 o+ H( C! }
图像的加噪与去噪(python)高斯噪声(Gaussiannoise)和椒盐噪声(salt-and-peppernoise)均可通过Python库:skimage实现。
8 v, P  _0 W/ h0 H- Y
* F9 U! G/ I. H1 R; [: G0 c#import os              #import语句的作用是用来导入模块,可以出现在程序任何位置
; Y! c) p* g  b, simport cv2 as cv        #导入openCV库
- N6 b6 W9 Z9 }, vimport skimage          #导入skimage模块.scikit-image是一个图像处理算法的集合。它是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,方便进行后续运算。1 w0 r+ R# f5 b9 f7 T& c: e
                        #必须首先安装numpy,scipy,matplotlib
% f& x2 n% a! t5 r! `9 M2 S' simport numpy as np      #导入numpy模块。numpy是python扩展程序库,支持数组和矩阵运算,针对数组运算提供大量数学函数库。  l0 N% x. w- L2 C: v$ U# A5 s
6 s% X8 e' y& W8 {3 U

& U/ @0 g& M! O% d9 vdef boxBlur(img):
0 o  E0 C! H9 U. O    # 使用5x5的滤波核进行平滑
8 @8 h% o  P( {" _, ~4 P6 S+ a    blur = cv.boxFilter(img,-1,(5, 5))    4 p% L5 l+ k( U% {4 l
    return blur
( `, ~) k, _2 n9 J& W
& `# e( @# K$ @, }+ S" _7 d  B, @% s4 P; n9 y# g* M1 t
def gaussianBlur(img):0 F2 }+ v0 z9 @! y+ U( Q
    #     使用高斯核进行平滑
6 b6 ~' W- ~- d! e$ ^8 M0 K( W6 D    blur = cv.GaussianBlur(img,(5, 5),1.5)1 Z* n# p" W6 I3 {8 Z2 ~
    return blur* i4 y1 @4 S8 I# i" M0 R6 ~" P
6 C5 D% L* e) y0 D6 b8 R" G1 p# D" S

& Q7 i+ i! n8 N7 I, b, |! pdef main():
. z4 |: _2 Y3 [3 m    # 2. 定义图片类img  x3 h9 ]0 {/ H& E& w
    path = r"C:\Users\98238\Desktop\Lenna.jpg"2 u+ q6 y7 v; f( H9 n
    img = cv.imread(path)
# J5 {* h  {# n1 Q    start_t = cv.getTickCount()7 U# L! J/ m; N1 u+ g' E
    # 5. 加噪声,绘图
# z! w% I) ^0 u+ V- q    ##############################################38 j: o& u4 B6 a/ b3 o
    # add gaussian noise4 d4 q+ G+ K0 O; q4 i
) w0 L+ [  F1 T# v' ~
    gauss_noiseImg = skimage.util.random_noise(img, mode='gaussian')# 添加10%的高斯噪声
' H& f% J" o- g9 T4 z    gauss_noiseImg=gauss_noiseImg
8 y; f% e- {5 C+ j$ Q' S1 f# u- D4 a8 H. R    salt_noiseImg = skimage.util.random_noise(img, mode='salt')  # 添加椒盐噪声1 d# h7 S0 p4 [6 }
# J0 f3 k3 z6 ?. M# q
    lb_gauss=cv.medianBlur(gauss_noiseImg.astype('float32'), 1)#中值滤波
8 L8 Y3 x( }  y/ x: `
, O% o/ @$ I& t8 i, ^    lb_salt=cv.medianBlur(salt_noiseImg.astype('float32'), 1)#中值滤波
) X( @  [' v1 T  a5 s1 O. [! p    print(gauss_noiseImg.dtype, "gaussian noisy image dtype")#输出一个注释; J3 t  g) \7 z) R- W% e
    print(gauss_noiseImg.shape, "gaussian noisy image shape")#输出一个注释
5 `- f3 n) H" J( T7 K" p- n2 G' A- v/ m, S
    print(salt_noiseImg.dtype, "salt noisy image dtype")#输出一个注释! U- e6 L9 h9 N  B! h  `* Z2 a
    print(salt_noiseImg.shape, "salt noisy image shape")#输出一个注释
' V+ _  D* O7 j2 m- E. P8 c' a  N# s1 D% f8 L* G, w

6 z# m, ]1 f$ A) _6 l/ t& A& f    cv.namedWindow("Original Image", cv.WINDOW_NORMAL)#输出原图片的标题
+ A; g# u9 N! J9 K, n! ~+ Y4 c    cv.imshow('Original Image', img)#输出原图片; \$ }$ T- C0 X! A/ L! E
8 R9 t/ c0 \4 \; ^
    # Gaussian noisy image6 Z6 ?5 O$ w3 u3 s
    cv.namedWindow("Added Gaussian Noise Image", cv.WINDOW_NORMAL)#输出高斯噪声图片的标题
, K0 Q7 |* X: b6 }/ r* C# B7 }    cv.imshow('Added Gaussian Noise Image', gauss_noiseImg)#输出高斯噪声图片' T/ F; H# p  g# }

- P6 w7 M0 Z% F& L    # Salt noisy image
: p5 t' }2 m/ h! j/ M2 ]- q1 [0 p9 c    cv.namedWindow("Added Salt Noise Image", cv.WINDOW_NORMAL)#输出椒盐噪声图片的标题
, t1 I1 j: c( [8 z    cv.imshow('Added Salt Noise Image', salt_noiseImg)#输出椒盐噪声图片
( W! x% x/ p* n) I$ a
! t! Z/ M3 C2 e- L) A    #滤波后的图像* B# G3 e0 g2 l6 O8 s
    cv.namedWindow("lbguass Image", cv.WINDOW_NORMAL)#输出滤波后高斯噪声图片标题, i: `, u8 d( p- Y* [1 V6 j
    cv.imshow('lbguass Image', lb_gauss)#输出滤波后高斯噪声图片% \$ ?* e; V$ J
    cv.namedWindow("lbsalt Image", cv.WINDOW_NORMAL)#输出滤波后椒盐噪声图片标题
* R7 v- ]1 f5 R# g    cv.imshow('lbsalt Image', lb_salt)#输出滤波后椒盐噪声图片3 j# U% c1 b: Z  ^3 I$ x
8 e6 ^4 Q( t! |; ^2 \! d
    #####################################################
, X( D0 n# Y' e7 l! w& t
- ?4 I. m9 }/ J3 L4 g8 B& X; |    stop_t = ((cv.getTickCount() - start_t) / cv.getTickFrequency()) * 1000#运行时间
" k. D! Y. o+ X" I  I+ e$ Y
4 V, r2 t: }& K/ G    print(stop_t, "ms")#输出时间并加上单位
6 M4 P; Q  f5 {4 B% n
7 @# [4 k4 H$ U: j0 j    cv.waitKey(0)8 j9 F# h) C) x
    cv.destroyAllWindows()( ~, M3 ]) n7 ~+ @+ s" A4 c

3 B8 c! x# F8 ?! x1 B( {% r, y8 B8 q# _2 T- o! i
if __name__ == "__main__":0 O8 E, F$ D; _5 |4 y  X2 _
    main()' u) B1 s' ]6 O& t) B& t, l' S- E
7 b3 X+ m( H! v+ D
原图如下1 O- Y; I( N* |0 i# F+ K! ~1 u. W4 I9 I
+ X* K; t6 g  Y0 ^& ?; @! f- M& v+ P
1.png
* R6 H' O6 Z4 A; J$ L' _4 G% @3 c
( q2 p, M, E+ S/ M" v& u

使用10%的高斯噪声、椒盐噪声,以及中值滤波为3 结果图如下

添加10%高斯噪声后的图片

2.png 5 ^" s3 F! o: q# x. O

2 F7 s. c& r8 j5 G- j添加椒盐后的图片# E9 z( l2 x- u0 D5 V- F
: g+ t. [$ ^5 C. N. i
3.png
! d" O! z9 E* q# c
: H# Z1 e% @- L使用中值滤波3滤波后的高斯噪声图3 ]. p' m9 C* b: t9 a* q' S
4.png 4 j! G0 z  a7 r+ v" q5 S' S4 m
" Q6 x4 ]! X8 }: q  t- q# h6 y
使用中值滤波3滤波后的椒盐噪声图+ O. K: `( n7 ~4 G
5.png 9 k5 w& e! P, G8 e  B1 }

4 O7 M) b( O4 O改用中值滤波5 滤波滤波后的高斯噪声图$ F. H; m; S. D6 Y7 H
3 c: ~% c. X; a2 H' `7 ~3 u% u
6.png
* y* K2 P) A9 }+ _: Q0 Q7 d& O. {% O$ P
滤波后的椒盐噪声图- p7 i  m( F" \$ \. U

, K1 E* ], [. @ 7.png
" f5 v& x3 Z; C+ f' x1 x" X- B4 j; K  ?/ |8 y
结论:+ }, |# ?6 N  V& d8 ]% f+ l( d* j
经过中值滤波5的滤波后噪声比中值滤波3滤波后的图像少,但是图像也更模糊一些。: l  X- `5 B& t2 D, D$ P+ _# Q

! g* X0 \; H  T




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5