椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。
常用的去除这种噪声的有效手段是使用中值滤波器。
在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪。中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。
中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。
一副数字图像生成椒盐噪声的步骤如下:
1.指定信噪比 SNR (其取值范围在[0, 1]之间)
2.计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * (1-SNR)
3.随机获取要加噪的每个像素位置P(i, j)
4.指定像素值为255或者0。
5.重复3,4两个步骤完成所有像素的NP个像素
6.输出加噪以后的图像
中值滤波cv2.medianBlur(img, 3)这个函数的参数可以调节!!!!!!!!
import cv2
import numpy as np
def addSaltNoise(img,snr):
# 指定信噪比
SNR = snr
# 获取总共像素个数
size = img.size
# 因为信噪比是 SNR ,所以噪声占据百分之10,所以需要对这百分之10加噪声
noiseSize = int(size * (1 - SNR))
# 对这些点加噪声
for k in range(0, noiseSize):
# 随机获取 某个点
xi = int(np.random.uniform(0, img.shape[1]))
xj = int(np.random.uniform(0, img.shape[0]))
# 增加噪声
if img.ndim == 2:
img[xj, xi] = 255
elif img.ndim == 3:
img[xj, xi] = 0
return img
def removeSaltNoise():
filename = "C:/Users/hanyufeng/Desktop/3.jpg"
# 得到加噪声之后的图像
img = addSaltNoise(cv2.imread(filename),0.9)
# 进行中值滤波
#一开始参数值是3,不是7
dstimg = cv2.medianBlur(img, 7)
cv2.imshow('src', img)
cv2.imshow('dst', dstimg)
cv2.waitKey(0)
def main():
removeSaltNoise()
if __name__ == '__main__':
main()