( [ q D4 O6 ^ ] 图像的加噪与去噪(python)高斯噪声(Gaussiannoise)和椒盐噪声(salt-and-peppernoise)均可通过Python库:skimage实现。 + D3 n' P7 [4 F7 `5 i9 k + _6 j' M1 F7 ]#import os #import语句的作用是用来导入模块,可以出现在程序任何位置+ G: U2 p9 [7 S' ^5 ~0 {/ y# g
import cv2 as cv #导入openCV库 " j# h: N# J5 s+ p: B timport skimage #导入skimage模块.scikit-image是一个图像处理算法的集合。它是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,方便进行后续运算。 4 T7 `( d8 g' l7 o #必须首先安装numpy,scipy,matplotlib J; B* V# _$ i* ~7 cimport numpy as np #导入numpy模块。numpy是python扩展程序库,支持数组和矩阵运算,针对数组运算提供大量数学函数库。# j' d. `2 J7 i1 x5 j
9 M0 L- }# c/ I: d; Y; `
7 L x; m& y1 R' W1 V
def boxBlur(img): & \9 _5 ]; Q# k3 t) s& | # 使用5x5的滤波核进行平滑& k9 u. V$ ~1 A4 n
blur = cv.boxFilter(img,-1,(5, 5)) 9 |+ ]! r+ q) F. d m9 @. q
return blur T7 a5 r. t( \
8 X, O0 k) @7 |, B/ y0 @' Q
, f2 J7 ^, ^/ x) _9 Q; Q/ W
def gaussianBlur(img): 4 R. c7 J4 ^. C1 V+ q # 使用高斯核进行平滑- ?, ^% ~$ F2 H' d7 T
blur = cv.GaussianBlur(img,(5, 5),1.5) . s, j& @: R0 X% ^; Y! Q* A return blur' \2 n# U& R' _8 T9 a
( x! c, @$ I/ c9 f `
+ e( [1 g7 R! O6 a: m5 u# |2 }& ldef main(): " G4 M4 e) R, n$ q9 Z6 A- b # 2. 定义图片类img ' K* b$ x+ Z8 E path = r"C:\Users\98238\Desktop\Lenna.jpg"1 i* C& K/ i5 l% Q8 W( R: v
img = cv.imread(path)( }$ V8 ^6 p, H% o
start_t = cv.getTickCount() 7 m# p8 f* U# u5 K4 D6 I # 5. 加噪声,绘图( j0 S% t4 a) z
##############################################3 ; i0 K1 I) H& }! o5 o( M3 i # add gaussian noise ( J. ^# w- `# U/ n# A6 K& z0 S. r7 w4 b
gauss_noiseImg = skimage.util.random_noise(img, mode='gaussian')# 添加10%的高斯噪声) k- }" u5 W+ n4 F" o
gauss_noiseImg=gauss_noiseImg0 ~( x+ p9 l2 d9 m* B \3 k" z
salt_noiseImg = skimage.util.random_noise(img, mode='salt') # 添加椒盐噪声0 M8 T* @7 V$ n: _, ]0 |% \8 p
; z+ I- f- p) |6 Q' \# w; i lb_gauss=cv.medianBlur(gauss_noiseImg.astype('float32'), 1)#中值滤波 # X! v" p) j5 u& w3 U' z" @. [6 c 4 u: q1 q+ G4 d R5 F# X6 \2 h lb_salt=cv.medianBlur(salt_noiseImg.astype('float32'), 1)#中值滤波 + h1 J* e$ ^5 Q+ q print(gauss_noiseImg.dtype, "gaussian noisy image dtype")#输出一个注释 * V- p( ?2 L) K print(gauss_noiseImg.shape, "gaussian noisy image shape")#输出一个注释 , p g6 G2 _* L) P" d: i, S0 ~0 ]& O6 p. Y t! T9 o
print(salt_noiseImg.dtype, "salt noisy image dtype")#输出一个注释8 T& ] @5 L, @6 e+ w! M+ f+ ?" a
print(salt_noiseImg.shape, "salt noisy image shape")#输出一个注释+ B* n& W5 u& U9 M# X& J
, s: L" L8 z0 L: t+ p; |/ M0 b+ V' V1 x5 I& J" F* _
cv.namedWindow("Original Image", cv.WINDOW_NORMAL)#输出原图片的标题/ U! n5 I( Z H0 p# n0 P: T
cv.imshow('Original Image', img)#输出原图片 ( a9 v" L @1 d7 S* b' o 4 |" Q6 \1 ?% A # Gaussian noisy image 2 E! v f8 p0 B5 X% d& S9 d* Y cv.namedWindow("Added Gaussian Noise Image", cv.WINDOW_NORMAL)#输出高斯噪声图片的标题 ; W# @. A0 U+ M! ^ cv.imshow('Added Gaussian Noise Image', gauss_noiseImg)#输出高斯噪声图片 & X/ K! n8 o+ B1 m% n) r# X$ C0 r" b/ }) |8 v" I
# Salt noisy image " \5 _* Q, u7 H, c cv.namedWindow("Added Salt Noise Image", cv.WINDOW_NORMAL)#输出椒盐噪声图片的标题; Y$ q3 T: S/ c6 p9 g
cv.imshow('Added Salt Noise Image', salt_noiseImg)#输出椒盐噪声图片) t& R2 F6 X. J$ _: z1 \# W
: \* `2 @* N# E- v+ c9 B
#滤波后的图像 . h2 `0 }, s& J) B- t# \6 z cv.namedWindow("lbguass Image", cv.WINDOW_NORMAL)#输出滤波后高斯噪声图片标题1 c/ y4 V- T: |2 E6 F! a5 M
cv.imshow('lbguass Image', lb_gauss)#输出滤波后高斯噪声图片 }: y( M7 k, N1 r cv.namedWindow("lbsalt Image", cv.WINDOW_NORMAL)#输出滤波后椒盐噪声图片标题( B# o3 u" g! |
cv.imshow('lbsalt Image', lb_salt)#输出滤波后椒盐噪声图片) i& @% M4 W( z% z/ I
1 d+ M, t. ~0 P7 y9 ^ #####################################################* z; D. @/ u' {- N3 [4 |( i- L0 P
" G( M' K: y: R. N) ] stop_t = ((cv.getTickCount() - start_t) / cv.getTickFrequency()) * 1000#运行时间) \7 X1 b t) S" L, N
9 D4 w2 k( a! R: h1 y2 _
print(stop_t, "ms")#输出时间并加上单位4 |; Z3 J( g6 M
- }1 v" |1 k [" }" d
cv.waitKey(0) # P9 Y: y* \* M0 R# `7 x' c# i& e- A cv.destroyAllWindows() S) d1 I- [+ c" F6 e: G" C
( \% `( G k1 ~' O, P, C1 x, u& I# h f4 Z+ U1 ~( }. R# U
if __name__ == "__main__":# s% f, [) y n3 m
main()8 D5 `* B0 r( y( O# T$ w" F. A& z
a7 f1 c2 J! B. }
原图如下 + b( [% i1 T& G . K0 m( j- P( g& _1 L$ i/ A