Python+OpenCV添加椒盐噪声

椒盐噪声也叫脉冲噪声,即在一幅图像里随机将一个像素点变为椒噪声或盐噪声,其中椒噪声像素值为“0”,盐噪声像素值为“255”。
生成(添加)椒盐噪声算法步骤如下:
(1)输入一幅图像并自定义信噪比 SNR (其取值范围在[0, 1]之间);
(2)计算图像像素点个数 SP, 进而得到椒盐噪声的像素点数目 NP = SP * (1-SNR);
(3)随机获取要加噪的每个像素位置img[i, j];
(4)随机生成[0,1]之间的一个浮点数;
(5)判定浮点数是否大于0.5,并指定像素值为255或者0;
(6)重复3,4,5三个步骤完成所有像素的NP个像素加粗样式;
(7)输出加噪以后的图像。
代码如下:

import cv2 as cv
import numpy as np

def rgb2gray(img):
    h=img.shape[0]
    w=img.shape[1]
    img1=np.zeros((h,w),np.uint8)
    for i in range(h):
        for j in range(w):
            img1[i,j]=0.144*img[i,j,0]+0.587*img[i,j,1]+0.299*img[i,j,2]
    return img1

def noise(img,snr):
    h=img.shape[0]
    w=img.shape[1]
    img1=img.copy()
    sp=h*w   # 计算图像像素点个数
    NP=int(sp*(1-snr))   # 计算图像椒盐噪声点个数
    for i in range (NP):
        randx=np.random.randint(1,h-1)   # 生成一个 1 至 h-1 之间的随机整数
        randy=np.random.randint(1,w-1)   # 生成一个 1 至 w-1 之间的随机整数
        if np.random.random()<=0.5:   # np.random.random()生成一个 0 至 1 之间的浮点数
            img1[randx,randy]=0
        else:
            img1[randx,randy]=255
    return img1

image=cv.imread("D:/Testdata/selina.png")
grayimage=rgb2gray(image)
noiseimage=noise(grayimage,0.6)   # 将信噪比设定为0.6
cv.imshow("image",image)
cv.imshow("grayimage",grayimage)
cv.imshow("noiseimage",noiseimage)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果:

Note:
(1)本文只限于对灰度图的添加椒盐噪声,并未对彩色图像进行添加(本文是为后面的中值滤波做准备),希望同各位交流彩色图像添加椒盐噪声的方法;
(2)信噪比:如果是灰度图像的话,SNR=(洁净图片中的像素点的灰度值之和)/abs(噪声图片的灰度值之和-洁净图片中的灰度值之和)为该图像的信噪比。信噪比在其它大声博文中有详细解释,在此就不过多阐述,其中,信噪比越大,椒盐噪声数量越少,反之越多。

你可能感兴趣的:(添加椒盐噪声)