Opencv学习(四)图像的噪声处理(椒盐噪声)

椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。

常用的去除这种噪声的有效手段是使用中值滤波器

图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。

中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。

 一副数字图像生成椒盐噪声的步骤如下:

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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章