文章目录
- 添加噪声
- 均值滤波cv2.blur
- 中值滤波 cv2.medianBlur()
- 高斯滤波
- skimage中的滤波函数
- 高斯滤波器
- 中值滤波器模板
添加噪声
用到了scikit-image,
详见:https://blog.csdn.net/u013044310/article/details/80114689
相关函数:
https://blog.csdn.net/zh_jessica/article/details/77967650
skimage.util.random_noise(image, mode=’gaussian’, seed=None, clip=True, **kwargs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | def random_noise(image, mode='gaussian', seed=None, clip=True, **kwargs): 功能:为浮点型图片添加各种随机噪声 参数: image:输入图片(将会被转换成浮点型),ndarray型 mode: 可选择,str型,表示要添加的噪声类型 gaussian:高斯噪声 localvar:高斯分布的加性噪声,在“图像”的每个点处具有指定的局部方差。 poisson:泊松再生 salt:盐噪声,随机将像素值变成1 pepper:椒噪声,随机将像素值变成0或-1,取决于矩阵的值是否带符号 s&p:椒盐噪声 speckle:均匀噪声(均值mean方差variance),out=image+n*image seed: 可选的,int型,如果选择的话,在生成噪声前会先设置随机种子以避免伪随机 clip: 可选的,bool型,如果是True,在添加均值,泊松以及高斯噪声后,会将图片的数据裁剪到合适范围内。如果谁False,则输出矩阵的值可能会超出[-1,1] mean: 可选的,float型,高斯噪声和均值噪声中的mean参数,默认值=0 var: 可选的,float型,高斯噪声和均值噪声中的方差,默认值=0.01(注:不是标准差) local_vars:可选的,ndarry型,用于定义每个像素点的局部方差,在localvar中使用 amount: 可选的,float型,是椒盐噪声所占比例,默认值=0.05 salt_vs_pepper:可选的,float型,椒盐噪声中椒盐比例,值越大表示盐噪声越多,默认值=0.5,即椒盐等量 -------- 返回值:ndarry型,且值在[0,1]或者[-1,1]之间,取决于是否是有符号数 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # -*- coding: utf-8 -*- from PIL import Image import numpy as np import matplotlib.pyplot as plt import skimage import cv2 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False lina = cv2.cvtColor(cv2.imread('lina.jpg'),cv2.COLOR_BGR2RGB) #lina = np.array(Image.open('lina.jpg').convert('L')) gaussi = skimage.util.random_noise(lina, mode='gaussian', seed=None, clip=True,) gaussi = gaussi*255 #由于输出是[0,1]的浮点型,先转成灰度图(我的输入就是灰度图) gaussi = gaussi.astype(np.int) #再变成整型数组 # plt.imshow(gaussi,'gray') # plt.show() salypepper = skimage.util.random_noise(lina, mode='s&p', seed=None, clip=True,) salypepper = salypepper*255 #由于输出是[0,1]的浮点型,先转成灰度图(我的输入就是灰度图) salypepper = salypepper.astype(np.int) #再变成整型数组 # plt.imshow(salypepper,'gray') # plt.show() junyun = skimage.util.random_noise(lina, mode='speckle', seed=None, clip=True,mean=0,var=0.01) junyun = junyun*255 #由于输出是[0,1]的浮点型,先转成灰度图(我的输入就是灰度图) junyun = junyun.astype(np.int) #再变成整型数组 # plt.imshow(junyun,'gray') # plt.show() imgs=[lina,gaussi,salypepper,junyun] titiles = ['source','gaussi','salt & peppet','mul'] for i in range(4): plt.subplot(2,2,i+1) plt.imshow(imgs[i],'gray') plt.axis('off') plt.title(titiles[i]) plt.show() |
过程:中间的变化
均值滤波cv2.blur
1.cv2.blur(img, (3, 3)) 进行均值滤波
参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小
2. cv2.boxfilter(img, -1, (3, 3), normalize=True) 表示进行方框滤波,
参数说明当normalize=True时,与均值滤波结果相同, normalize=False,表示对加和后的结果不进行平均操作,大于255的使用255表示
3. cv2.Guassianblur(img, (3, 3), 1) 表示进行高斯滤波,
参数说明: 1表示σ, x表示与当前值得距离,计算出的G(x)表示权重值
4. cv2.medianBlur(img, 3) #中值滤波,相当于将9个值进行排序,取中值作为当前值
参数说明:img表示当前的图片,3表示当前的方框尺寸
对椒盐噪声使用不同大小的模板均值滤波
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | from PIL import Image import numpy as np import matplotlib.pyplot as plt import skimage import cv2 import scipy.signal as signal plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False # coding=utf-8 lina = np.array(Image.open('lina.jpg').convert('L')) #添加椒盐噪声 saltpepper = skimage.util.random_noise(lina, mode='s&p', seed=None, clip=True,) saltpepper = saltpepper*255 #由于输出是[0,1]的浮点型,先转成灰度图(我的输入就是灰度图) saltpepper = saltpepper.astype(np.int) #再变成整型数组 #均值滤波 img1 = cv2.blur(saltpepper,(3,3)) img2 = cv2.blur(saltpepper,(5,5)) plt.subplot(131);plt.imshow(saltpepper,'gray');plt.title('saltpepper') plt.subplot(132);plt.imshow(img1,'gray');plt.title('3*3') plt.subplot(133);plt.imshow(img2,'gray');plt.title('5*5') |
对高斯噪声使用不同大小模板的均值滤波
1 2 3 4 5 | img1 = cv2.blur(gaussi,(3,3)) img2 = cv2.blur(gaussi,(5,5)) plt.subplot(131);plt.imshow(gaussi,'gray');plt.title('gaussi') plt.subplot(132);plt.imshow(img1,'gray');plt.title('3*3') plt.subplot(133);plt.imshow(img2,'gray');plt.title('5*5') |
中值滤波 cv2.medianBlur()
注意输入的矩阵必须是uint8
对椒盐噪声使用不同大小的模板中值滤波
1 2 3 4 5 | img1 = cv2.medianBlur(saltpepper.astype(np.uint8),3) img2 = cv2.medianBlur(saltpepper.astype(np.uint8),5) plt.subplot(131);plt.imshow(saltpepper,'gray');plt.title('saltpepper') plt.subplot(132);plt.imshow(img1,'gray');plt.title('3*3') plt.subplot(133);plt.imshow(img2,'gray');plt.title('5*5') |
对椒盐噪声使用不同大小的模板中值滤波
1 2 3 4 5 | img1 = cv2.medianBlur(gaussi.astype(np.uint8),3) img2 = cv2.medianBlur(gaussi.astype(np.uint8),5) plt.subplot(131);plt.imshow(gaussi,'gray');plt.title('gaussi') plt.subplot(132);plt.imshow(img1,'gray');plt.title('3*3') plt.subplot(133);plt.imshow(img2,'gray');plt.title('5*5') |
高斯滤波
注意输入的矩阵必须是uint8
1 2 3 4 5 | img1 = cv2.GaussianBlur(saltpepper.astype(np.uint8),(3,3),1.5) img2 = cv2.GaussianBlur(saltpepper.astype(np.uint8),(5,5),1.5) plt.subplot(131);plt.imshow(saltpepper,'gray');plt.title('saltpepper') plt.subplot(132);plt.imshow(img1,'gray');plt.title('3*3') plt.subplot(133);plt.imshow(img2,'gray');plt.title('5*5') |
skimage中的滤波函数
高斯滤波器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | from PIL import Image import numpy as np import matplotlib.pyplot as plt import skimage from scipy.ndimage import filters plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False lina = np.array(Image.open('lina.jpg').convert('L')) plt.subplot(131);plt.imshow(lina,'gray');plt.title('source') #将原图添加高斯噪声 gaussi = skimage.util.random_noise(lina, mode='gaussian', seed=None, clip=True,) gaussi = gaussi*255 #由于输出是[0,1]的浮点型,先转成灰度图(我的输入就是灰度图) gaussi = gaussi.astype(np.int) #再变成整型数组 plt.subplot(132);plt.imshow(gaussi,'gray');plt.title('add gaussian filter') im2 = filters.gaussian_filter(gaussi,1) pil_im2 = im2.astype(np.int) plt.subplot(133);plt.imshow(pil_im2,'gray');plt.title('after gaussian filter') plt.show() |
中值滤波器模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | from PIL import Image import numpy as np import matplotlib.pyplot as plt import skimage import cv2 import scipy.signal as signal plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False # coding=utf-8 lina = np.array(Image.open('lina.jpg').convert('L')) #添加椒盐噪声 saltpepper = skimage.util.random_noise(lina, mode='s&p', seed=None, clip=True,) saltpepper = saltpepper*255 #由于输出是[0,1]的浮点型,先转成灰度图(我的输入就是灰度图) saltpepper = saltpepper.astype(np.int) #再变成整型数组 # plt.imshow(salypepper,'gray') # plt.show() # 采用scipy.signalS #中值滤波器模板3*3 img1 = signal.medfilt(saltpepper,(3,3)) # plt.imshow(img1,'gray') # plt.show() img2 = signal.medfilt(saltpepper,(5,5)) plt.subplot(131);plt.imshow(saltpepper,'gray');plt.title('saltpepper') plt.subplot(132);plt.imshow(img1,'gray');plt.title('3*3') plt.subplot(133);plt.imshow(img2,'gray');plt.title('5*5') |