python—添加噪声|均值滤波|中值滤波|高斯滤波|cv2.blur|cv2.medianBlur|skimage

文章目录

  • 添加噪声
  • 均值滤波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')

在这里插入图片描述