数学建模社区-数学中国

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

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

0 e( ~! W1 q6 Y, ~' s图像的加噪与去噪(python)高斯噪声(Gaussiannoise)和椒盐噪声(salt-and-peppernoise)均可通过Python库:skimage实现。- s2 b/ Y0 v, V* m. N
1 A% Y& a  |* J; P9 J, Y4 e2 _
#import os              #import语句的作用是用来导入模块,可以出现在程序任何位置- B: }: k9 A6 y$ v# G: X
import cv2 as cv        #导入openCV库
! J0 Q6 i+ H6 d8 A* V5 J8 x- ]! ]import skimage          #导入skimage模块.scikit-image是一个图像处理算法的集合。它是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,方便进行后续运算。& x1 H9 s; u! W  w  ?$ l5 X9 A
                        #必须首先安装numpy,scipy,matplotlib5 f0 H8 U. o4 ?1 J+ o3 f1 f
import numpy as np      #导入numpy模块。numpy是python扩展程序库,支持数组和矩阵运算,针对数组运算提供大量数学函数库。( ?" `1 R+ t! ~$ R3 f/ E0 V

. Z3 y2 I( I$ T4 [9 H3 E& o  F/ W; ^( U5 w; `' q* c7 E* E
def boxBlur(img):" A8 p6 y; h* P/ p, A
    # 使用5x5的滤波核进行平滑
# Y4 N) F3 F; d0 H* c    blur = cv.boxFilter(img,-1,(5, 5))    + X/ \! w9 k* c: `: l
    return blur( g! Q5 ^& ~8 _; n

5 ~( ]6 I/ F! V1 e5 f/ U: \! m4 U, w
* B  R! @2 S% E; _6 V2 d  Odef gaussianBlur(img):# {2 O; C6 @6 F; @8 ^+ J
    #     使用高斯核进行平滑
, `3 h4 t( H/ I, R: [6 y2 Y    blur = cv.GaussianBlur(img,(5, 5),1.5)" t# b  }, |- [4 @
    return blur( G8 O$ t8 G$ `
$ \6 p! ^; e* v7 ~9 g: f' C

% E1 B8 n/ Z% r9 w9 d! Y0 f& l. Pdef main():# ^3 K9 F" W- @# T! D' v, |
    # 2. 定义图片类img9 t/ S8 M- H8 L* H- o5 K/ v
    path = r"C:\Users\98238\Desktop\Lenna.jpg"
6 T& O$ ]( K/ \( L& K    img = cv.imread(path)
- \2 h8 v8 ~3 ]3 P, X: z' U& \  M- S    start_t = cv.getTickCount()
. `) K' [* D- c5 F$ S9 N    # 5. 加噪声,绘图
4 o6 L) h* J  x; W# j' j    ##############################################3
& R7 Z& h" _9 q8 d' q    # add gaussian noise. p7 Q# w# F* }5 }9 L! s0 T) D
- A' X+ [; s# C  u
    gauss_noiseImg = skimage.util.random_noise(img, mode='gaussian')# 添加10%的高斯噪声3 b# [0 _; |+ B& b5 s
    gauss_noiseImg=gauss_noiseImg
& a7 o- l1 }1 H    salt_noiseImg = skimage.util.random_noise(img, mode='salt')  # 添加椒盐噪声* ]8 [; N+ ~& s/ l" t3 j
# r  F& m* Q5 m
    lb_gauss=cv.medianBlur(gauss_noiseImg.astype('float32'), 1)#中值滤波
; a2 r7 w6 x, m: f/ T1 W/ F" V: |! F. \* f- @/ V) w
    lb_salt=cv.medianBlur(salt_noiseImg.astype('float32'), 1)#中值滤波0 u, R4 J7 l# P  m
    print(gauss_noiseImg.dtype, "gaussian noisy image dtype")#输出一个注释& B. ]4 j" ]3 H
    print(gauss_noiseImg.shape, "gaussian noisy image shape")#输出一个注释6 b6 V& ]2 h+ F# z7 a

2 i5 M& n( V: L5 Z5 z2 T    print(salt_noiseImg.dtype, "salt noisy image dtype")#输出一个注释! T. @* g! c3 m4 M" e
    print(salt_noiseImg.shape, "salt noisy image shape")#输出一个注释3 L% U1 h( P) q& d
1 D7 J9 I- F# I& L; X, _* m

' n1 t/ Q4 X9 u5 y9 K' ^    cv.namedWindow("Original Image", cv.WINDOW_NORMAL)#输出原图片的标题% N/ |$ Q' B6 }" t7 s7 j+ T
    cv.imshow('Original Image', img)#输出原图片8 ~3 o* H6 o4 t8 M$ B

: l; E- k9 f3 u4 D    # Gaussian noisy image
  R& d8 W* Z6 _5 o1 U    cv.namedWindow("Added Gaussian Noise Image", cv.WINDOW_NORMAL)#输出高斯噪声图片的标题
- a! H2 s( \7 v8 _2 |# p& |# v, \    cv.imshow('Added Gaussian Noise Image', gauss_noiseImg)#输出高斯噪声图片
5 B) s( k8 W# V
% J9 N; b. H: @0 l' }$ t( P, e/ h    # Salt noisy image
* _1 N+ ^6 N+ v8 O) ]- F) E# S    cv.namedWindow("Added Salt Noise Image", cv.WINDOW_NORMAL)#输出椒盐噪声图片的标题
" v% N6 B" F' I7 ~9 f9 S    cv.imshow('Added Salt Noise Image', salt_noiseImg)#输出椒盐噪声图片0 I/ g& Y% _+ {! V

$ L" x. u6 ?& a1 V# S/ b    #滤波后的图像
+ r3 i- ?; z* O) y  p8 i    cv.namedWindow("lbguass Image", cv.WINDOW_NORMAL)#输出滤波后高斯噪声图片标题
5 x6 Z. O1 N: a% q9 i. P    cv.imshow('lbguass Image', lb_gauss)#输出滤波后高斯噪声图片
) O6 u( a1 M/ B, A! Z    cv.namedWindow("lbsalt Image", cv.WINDOW_NORMAL)#输出滤波后椒盐噪声图片标题' y7 S8 F- E. Y: T" k
    cv.imshow('lbsalt Image', lb_salt)#输出滤波后椒盐噪声图片6 |0 i/ i, h/ J' w

$ y3 X0 j8 O' c    #####################################################- N9 y2 U% E+ c( K% B
, _1 ?: ~( l4 L  Z: W' Z2 w7 V
    stop_t = ((cv.getTickCount() - start_t) / cv.getTickFrequency()) * 1000#运行时间, z% |# A3 J9 ], P; P" Z

% ~7 F7 G0 ]! V* |    print(stop_t, "ms")#输出时间并加上单位$ z3 y* Y% Z, A# I2 W- `

' c& ]; U* ]9 V5 m: Q2 t9 |* K    cv.waitKey(0)
0 a! I; l; i* @    cv.destroyAllWindows()
+ N1 Z8 x* ^: {6 m" R
( E5 R: b$ u0 q- b! c$ A0 ]& w5 _- m# C0 [" b
if __name__ == "__main__":3 q3 Y, \, I1 T! q, ?
    main()
' C5 s' j- E+ A0 R  x* _3 |. x8 K; z7 N; R
原图如下
' E  e, V9 X/ A; P3 \0 ~. o9 m% ~2 }/ y* J1 x
1.png ) W! o: D2 y9 G0 {, P& {; w
2 T: d' t; E- J! |8 p7 O- k

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

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

2.png ) P2 D9 T1 T/ V5 H" k6 ^( j
5 M" [4 Q1 a) L. K# F7 o/ t" ^( O/ Q- v
添加椒盐后的图片
; @0 Y6 i4 `/ N; r  k3 t9 P
" B6 X( ?' n$ D- ?; l. j 3.png
# J. d9 [& [7 Z* k! d) ]1 t& `! k* I8 h3 G. Q* Z
使用中值滤波3滤波后的高斯噪声图
; |0 n. F$ g! c- d: C! J 4.png 8 F! y: A1 G0 W5 n! l
3 W% C' v1 f  |7 a) r; F  [
使用中值滤波3滤波后的椒盐噪声图% P' Y- ~7 r8 X1 c; F
5.png ( d0 z) u) b7 i/ ~' A
4 J7 O$ r1 U( o: Y$ n1 N* B- u
改用中值滤波5 滤波滤波后的高斯噪声图) K) g) Y, a' }
" o; V4 B2 s9 W. D
6.png / e& p' c# M( C2 P0 x9 g1 y( B; X  U
4 P, R" m0 K4 A: L9 u
滤波后的椒盐噪声图
  w  Z1 [0 i5 P5 _  p" f
3 A5 I& T9 `' V 7.png ( P5 w& N" @9 _4 R1 a$ ?9 K# N# L

0 H& [* `  X; @6 I7 p( \  _! a结论:+ _8 i. X# G  {: k$ a) H' ^3 l: Y
经过中值滤波5的滤波后噪声比中值滤波3滤波后的图像少,但是图像也更模糊一些。& |- e2 R2 R' m9 q' i
8 N2 b; H& [) G2 v( z( v





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