数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-4-28 15:43
标题: 图像的加噪与去噪(python)

- z. y6 B4 K+ z3 @7 N" h% k图像的加噪与去噪(python)高斯噪声(Gaussiannoise)和椒盐噪声(salt-and-peppernoise)均可通过Python库:skimage实现。
% r$ K3 k7 G9 c; [& G
7 Q4 t. r0 d$ P4 @#import os              #import语句的作用是用来导入模块,可以出现在程序任何位置6 A1 M" j/ G5 D( @8 Z$ p) G
import cv2 as cv        #导入openCV库  j- }$ p$ ^5 y7 D- s
import skimage          #导入skimage模块.scikit-image是一个图像处理算法的集合。它是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,方便进行后续运算。
0 y1 z( {6 \$ X0 J* o& P                        #必须首先安装numpy,scipy,matplotlib3 x' [3 I: O$ }" T4 S5 e: g/ q
import numpy as np      #导入numpy模块。numpy是python扩展程序库,支持数组和矩阵运算,针对数组运算提供大量数学函数库。
. d5 q& b0 G, g% z0 i3 b  T2 r8 i1 x/ C& l5 n; y6 y
# k: n% A/ z: x9 W
def boxBlur(img):
, d9 H" l1 j4 E2 p    # 使用5x5的滤波核进行平滑4 C1 z1 u5 t- o. _; g
    blur = cv.boxFilter(img,-1,(5, 5))   
. |' c1 {* R, z* R9 p$ c$ A    return blur* j/ H, q: m. I  R+ f' c0 A

& z$ g6 V* Z1 m  Z3 P7 t! w: ?+ }; p% s, S3 \$ X) U3 X: Y* G/ i
def gaussianBlur(img):
8 O9 v* J" [3 c' |) M    #     使用高斯核进行平滑0 v  x; K' |: b
    blur = cv.GaussianBlur(img,(5, 5),1.5)
5 e9 G; |) y7 X. g2 v, x    return blur
1 o. K0 a) d- @' [. Z  Z' o# ?. B& S* u0 T- `1 C  Q9 H# k

; H" l  p# V* U8 x% k  K7 W: g' M. Ldef main():- ^4 r! G9 J4 N% p( ~7 @
    # 2. 定义图片类img
( m' @. h/ @: `' D- Z2 a3 f    path = r"C:\Users\98238\Desktop\Lenna.jpg"5 p. Q+ o5 L+ a+ v
    img = cv.imread(path)' O; x0 p% d4 P' B
    start_t = cv.getTickCount()9 L; t  z2 ]# H7 e2 N# {6 u
    # 5. 加噪声,绘图
  J% @1 E9 `% L$ q8 s+ W    ##############################################3. w- X1 y6 m" O. _  b, \! D3 |
    # add gaussian noise6 H( h5 ?2 H  u% T! O( F
- w0 o9 ]' S4 ]
    gauss_noiseImg = skimage.util.random_noise(img, mode='gaussian')# 添加10%的高斯噪声
7 L& _/ F- y, A. P    gauss_noiseImg=gauss_noiseImg# _& ~; a: `$ x" z* m6 X. V
    salt_noiseImg = skimage.util.random_noise(img, mode='salt')  # 添加椒盐噪声
4 G1 K/ O  K+ h# L9 {8 D" n6 _; H, k) I6 `: A4 b
    lb_gauss=cv.medianBlur(gauss_noiseImg.astype('float32'), 1)#中值滤波
/ Q& V& v0 G8 n9 Y( x! j8 E, D& D7 ]' F: O' Q# L
    lb_salt=cv.medianBlur(salt_noiseImg.astype('float32'), 1)#中值滤波% v" f" I% z  B) d( I  b
    print(gauss_noiseImg.dtype, "gaussian noisy image dtype")#输出一个注释1 r; |( u; t+ c
    print(gauss_noiseImg.shape, "gaussian noisy image shape")#输出一个注释
/ J. j4 H; X+ o6 I6 E- v8 `) k$ n" Z. p6 p$ p% {
    print(salt_noiseImg.dtype, "salt noisy image dtype")#输出一个注释
$ E# e- ~& T8 L# m    print(salt_noiseImg.shape, "salt noisy image shape")#输出一个注释, q) m0 [* H+ \, K' l- h7 ^: d3 m

' |/ c1 C. r5 n; C" [6 f) o5 P0 u# H6 I% m0 w; F$ O4 O- ^3 y! N
    cv.namedWindow("Original Image", cv.WINDOW_NORMAL)#输出原图片的标题
- b$ N! i* j& y) Q    cv.imshow('Original Image', img)#输出原图片' P7 P  j1 D7 a# P$ f
/ v, ^1 C& `# g4 |" k3 Z, r  z
    # Gaussian noisy image, i' q' c  v$ y. L2 f
    cv.namedWindow("Added Gaussian Noise Image", cv.WINDOW_NORMAL)#输出高斯噪声图片的标题
1 m- |9 N9 k9 i) p% W% c    cv.imshow('Added Gaussian Noise Image', gauss_noiseImg)#输出高斯噪声图片9 _; P+ A* X6 ^4 }+ Q& g+ G
$ [# h  E+ s7 K1 f8 s% c! P9 N
    # Salt noisy image
3 K7 D7 G5 d8 t    cv.namedWindow("Added Salt Noise Image", cv.WINDOW_NORMAL)#输出椒盐噪声图片的标题+ D8 @& S5 p6 u6 L
    cv.imshow('Added Salt Noise Image', salt_noiseImg)#输出椒盐噪声图片, t6 j; |+ R: Q$ S+ Q5 h3 `3 P
3 Q* F/ ^8 g8 B) ?4 B0 S% q  E0 I
    #滤波后的图像
# h' |/ x8 E$ R& @, F6 t    cv.namedWindow("lbguass Image", cv.WINDOW_NORMAL)#输出滤波后高斯噪声图片标题
2 I2 I' v  q7 b# z6 r    cv.imshow('lbguass Image', lb_gauss)#输出滤波后高斯噪声图片
' j% v) X) x6 n2 D& i- y6 v    cv.namedWindow("lbsalt Image", cv.WINDOW_NORMAL)#输出滤波后椒盐噪声图片标题' e4 w3 |4 j$ u; M5 n& p
    cv.imshow('lbsalt Image', lb_salt)#输出滤波后椒盐噪声图片
  L6 ^, H4 |2 d# N! e8 a8 s7 U2 i7 N. @
    #####################################################
+ Y6 L: G3 N4 H% ?
( J3 W* e  D5 }' Y; [    stop_t = ((cv.getTickCount() - start_t) / cv.getTickFrequency()) * 1000#运行时间! r$ J! c0 T* b8 L$ N
4 y! |+ E; o# [* h
    print(stop_t, "ms")#输出时间并加上单位: z. ~- t) D" S9 `- A
+ x5 _+ C, Z  i: E
    cv.waitKey(0)+ g0 P& Q! b; F( s7 M, F' q/ Q
    cv.destroyAllWindows()
! `: L/ |) r; J8 M
* y$ Y( w  `$ K1 v
. G+ X9 D* F2 V" Uif __name__ == "__main__":
7 Z; t8 k; v7 v/ C2 X4 I+ j, s    main()( w( \- l* d! j5 g, D: X
3 r( p1 Z7 z. U9 |! w4 B, H! Y
原图如下, U4 x0 ?" w0 _
9 k- ^: H7 a6 U. w8 G  \
1.png
" Q( E6 ]$ ^9 y9 @( b& e) @% x2 F& n; L0 J& }# s

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

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

2.png # w& Y5 j2 {% U, x, \
4 A) I- [/ c' j6 a
添加椒盐后的图片
2 s8 E0 L& y8 }" Q, U8 K8 i9 k. s3 k
3.png
% _% m' |5 L' F
, s7 s/ \+ t- Z. b5 \9 d使用中值滤波3滤波后的高斯噪声图, |; D5 R) g! x! J3 L' G' h
4.png
- U4 c% I2 e% B8 K) Q" w2 V
8 b" E: T: E1 C" ^使用中值滤波3滤波后的椒盐噪声图( B- l# L$ c" u: V& a
5.png 4 t9 E! y( F+ ]/ a1 I
* ^0 D+ ^4 B' Q+ s& I
改用中值滤波5 滤波滤波后的高斯噪声图5 B# S  |* W) j" U$ k8 @" X
) ^, K1 G! b3 y1 T5 b0 K
6.png 4 _% [" L8 D3 X) I' p1 G$ ?
6 }* _: }! N0 H/ [
滤波后的椒盐噪声图
3 F7 c* Z; Q8 H" e9 A, t$ B1 }" s2 f. F
7.png
. p. M4 P) a4 ~  o( d$ H6 O# q5 L: \# w" [) K9 T" p3 g7 Z
结论:
! u2 u8 j9 j- p# m0 Y% d经过中值滤波5的滤波后噪声比中值滤波3滤波后的图像少,但是图像也更模糊一些。. L/ x4 t* w0 Y( k  m
, |8 I/ g, S: h





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