8 J+ t* f1 J3 r" w# C) _#import os #import语句的作用是用来导入模块,可以出现在程序任何位置2 u% s% E2 v# F, T
import cv2 as cv #导入openCV库! c. p& O- `/ [# |
import skimage #导入skimage模块.scikit-image是一个图像处理算法的集合。它是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,方便进行后续运算。% g0 k7 Q, g6 x
#必须首先安装numpy,scipy,matplotlib ) t2 q) J$ S3 g' cimport numpy as np #导入numpy模块。numpy是python扩展程序库,支持数组和矩阵运算,针对数组运算提供大量数学函数库。! D& i1 I: Z6 [
) h" X; O! C( u9 v! S: h 9 y0 @+ V8 L" X, O- ?def boxBlur(img):% ]3 v. s2 c& S
# 使用5x5的滤波核进行平滑, O7 {4 ]% J+ o5 A0 L7 d1 u; q, ^
blur = cv.boxFilter(img,-1,(5, 5)) : z" h* C. x3 M4 H1 k
return blur : S: y! O' e1 K3 e - A! N0 }; M" Y6 C- c& V% ?- w0 e- e! g1 y
def gaussianBlur(img):6 v" [ A' c- V5 k( \0 T
# 使用高斯核进行平滑6 l! F9 M/ [/ @( e/ w; M4 J
blur = cv.GaussianBlur(img,(5, 5),1.5) , i( g1 j9 P6 m! G' _; _& W; ? return blur ( D: h9 b* q ]- P7 f# _ ( z9 M+ c$ m0 r* ~4 l+ ]1 V " ~/ @/ l" v$ H4 W5 Gdef main():6 T. ^% ?$ I" [. ^# g; N U
# 2. 定义图片类img 1 J$ K5 I5 d. v# j path = r"C:\Users\98238\Desktop\Lenna.jpg" 6 e8 c' f" [( B$ P) V$ m" @7 |) [ img = cv.imread(path)4 x0 m9 H' ]# G. |# N9 f" x
start_t = cv.getTickCount(): G% W8 P, U+ \4 d9 D
# 5. 加噪声,绘图 ; p7 U# x' V C! N- |* l ##############################################3 + ]8 K% l( P/ S. S. B # add gaussian noise 3 K3 |' @) X; {( B" A, h 4 [$ I0 m; v) G: [ gauss_noiseImg = skimage.util.random_noise(img, mode='gaussian')# 添加10%的高斯噪声- v' a% v* t. F% ~
gauss_noiseImg=gauss_noiseImg $ P+ h# x" Z+ ^8 p6 X, T1 @ salt_noiseImg = skimage.util.random_noise(img, mode='salt') # 添加椒盐噪声 9 U4 @2 N/ W+ c$ P $ t+ ]* j1 o7 y: p% u, G lb_gauss=cv.medianBlur(gauss_noiseImg.astype('float32'), 1)#中值滤波 : @' Z/ a/ K6 {) a+ t* p7 ?% w7 R5 R! s9 Z
lb_salt=cv.medianBlur(salt_noiseImg.astype('float32'), 1)#中值滤波9 q- z1 E8 h S2 \6 z, R
print(gauss_noiseImg.dtype, "gaussian noisy image dtype")#输出一个注释6 v# G% ]9 s8 F3 W4 `. R
print(gauss_noiseImg.shape, "gaussian noisy image shape")#输出一个注释 * e# Y2 W6 d1 l4 w* Z6 B& |$ G! r9 H1 r. `- u
print(salt_noiseImg.dtype, "salt noisy image dtype")#输出一个注释1 Z8 U& S! J& n# b) z7 `5 u
print(salt_noiseImg.shape, "salt noisy image shape")#输出一个注释$ c) Y' R7 @! N" o/ S1 K
; s+ P" j2 g1 Z& P& G& v* X9 ?3 F
; |+ s Y! g# |" D cv.namedWindow("Original Image", cv.WINDOW_NORMAL)#输出原图片的标题 9 T- w) H8 T, ?% K2 l. s% _, s cv.imshow('Original Image', img)#输出原图片 % p+ h. I! @4 Z3 u. k9 e8 h2 m8 x. b# X% F
# Gaussian noisy image* o* ]: n F L- m8 m' G- ~! A
cv.namedWindow("Added Gaussian Noise Image", cv.WINDOW_NORMAL)#输出高斯噪声图片的标题 8 N! ^; c ?2 `+ n# A cv.imshow('Added Gaussian Noise Image', gauss_noiseImg)#输出高斯噪声图片 W& n0 a/ W) ^" o0 @7 h
( C/ I. ^8 P* }( C( U* y # Salt noisy image" q0 a; M, V- v1 b. R v, c1 D3 K
cv.namedWindow("Added Salt Noise Image", cv.WINDOW_NORMAL)#输出椒盐噪声图片的标题 8 O) K5 s4 T, n9 M5 ^1 i1 T cv.imshow('Added Salt Noise Image', salt_noiseImg)#输出椒盐噪声图片" M" { }1 ?3 d3 n
5 {. I" J- Y7 M #滤波后的图像* n! Y! b4 ?& H9 j! m6 Q5 F
cv.namedWindow("lbguass Image", cv.WINDOW_NORMAL)#输出滤波后高斯噪声图片标题2 D( `, n* O$ b( I5 S/ y
cv.imshow('lbguass Image', lb_gauss)#输出滤波后高斯噪声图片$ Y: Z0 ?1 ~5 ^; S d0 V
cv.namedWindow("lbsalt Image", cv.WINDOW_NORMAL)#输出滤波后椒盐噪声图片标题 6 Q0 v0 I8 z* G( P; ~9 J5 A, a) R cv.imshow('lbsalt Image', lb_salt)#输出滤波后椒盐噪声图片& p9 z5 s4 Q' T3 o# k/ f* \9 v
: ~7 n' O8 y( t5 X3 G
##################################################### % M' S2 y' Y6 S5 M) ?: P6 p6 H# F6 v9 k) O$ `2 H
stop_t = ((cv.getTickCount() - start_t) / cv.getTickFrequency()) * 1000#运行时间! t I# N* x3 ?6 d% e
6 w/ S i6 Z4 I6 z2 t print(stop_t, "ms")#输出时间并加上单位8 H( C+ M- l" F0 A
% |4 X* D, r* _, F4 w
cv.waitKey(0) $ n4 B& M+ w* g cv.destroyAllWindows()* h" i8 q; r( k
. E* x6 y2 ~" C* F3 S/ e2 J3 f
, G* R" g' n$ w& a; n1 \3 ~* h
if __name__ == "__main__": ) x6 w+ e; a' `* ? main()$ B3 a- r' j3 M) l! [6 A
; T7 N& }1 Q, A# F7 g, Z, t, i原图如下 : m' D, Q: Y+ `! V2 Y* h2 m 8 P. {7 a2 ]* K