数学建模社区-数学中国
标题:
图像的加噪与去噪(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, s
import cv2 as cv #导入openCV库
- N6 b6 W9 Z9 }, v
import 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' s
import 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 v
def 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, |! p
def 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
##############################################3
8 j: o& u4 B6 a/ b3 o
# add gaussian noise
4 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 image
6 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
2020-4-28 15:39 上传
下载附件
(264.67 KB)
* R6 H' O6 Z4 A; J$ L' _4 G% @3 c
( q2 p, M, E+ S/ M" v& u
使用10%的高斯噪声、椒盐噪声,以及中值滤波为3 结果图如下
添加10%高斯噪声后的图片
2020-4-28 15:40 上传
下载附件
(405.19 KB)
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
2020-4-28 15:40 上传
下载附件
(352.86 KB)
! d" O! z9 E* q# c
: H# Z1 e% @- L
使用中值滤波3滤波后的高斯噪声图
3 ]. p' m9 C* b: t9 a* q' S
2020-4-28 15:41 上传
下载附件
(318.37 KB)
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
2020-4-28 15:42 上传
下载附件
(239.79 KB)
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
2020-4-28 15:42 上传
下载附件
(234.62 KB)
* y* K2 P) A9 }+ _: Q0 Q
7 d& O. {% O$ P
滤波后的椒盐噪声图
- p7 i m( F" \$ \. U
, K1 E* ], [. @
2020-4-28 15:43 上传
下载附件
(185.09 KB)
" 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