数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理

本文主要介绍给图像添加椒盐噪声高斯噪声,以及其代码实现除噪的方法

若要获取更多数字图像处理,python,深度学习,机器学习,计算机视觉等高清PDF以及 更多有意思的 分享,可搜一搜 微信公共号 “分享猿” 免费获取资源。也可扫描下面的二维码关注,期待你的到来~
数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理
一、椒盐噪声

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

如下图一幅电路图像以及加了椒盐噪声后的图像
           原图                  加椒盐噪声后的图像
数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理

二、高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。除常用抑制噪声的方法外,对高斯噪声的抑制方法常常采用数理统计方法。

下列是一幅加了高斯噪声的图像
数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理
三、代码实现

下列是实现椒盐噪声和高斯噪声的python代码
需要已经安装numpy和opencv-python库

import numpy as np
import cv2

#定义添加椒盐噪声的函数
def SaltAndPepperNoise(img,percetage):
    SP_NoiseImg=img
    SP_NoiseNum=int(percetage*img.shape[0]*img.shape[1])
    for i in range(SP_NoiseNum):
        randX=np.random.random_integers(0,img.shape[0]-1)
        randY=np.random.random_integers(0,img.shape[1]-1)
        if np.random.random_integers(0,1)==0:
            SP_NoiseImg[randX,randY]=0   #0为胡椒噪声
        else:
            SP_NoiseImg[randX,randY]=255    #1为盐粒噪声
    return SP_NoiseImg

#定义添加高斯噪声的函数
def addGaussianNoise(image,percetage):
    G_Noiseimg = image
    G_NoiseNum=int(percetage*image.shape[0]*image.shape[1])
    for i in range(G_NoiseNum):
        temp_x = np.random.randint(0,G_Noiseimg.shape[0])
        temp_y = np.random.randint(0,G_Noiseimg.shape[1])
        G_Noiseimg[temp_x][temp_y] = 255
    return G_Noiseimg


def main():
    img = cv2.imread(r"F:\image\Circuit.tif",1)
    cv2.namedWindow("Original image")
    cv2.imshow("Original image", img)
    grayImg = cv2.imread(r"F:\image\Circuit.tif",0)
    cv2.imshow("grayimage", grayImg)

    gauss_noiseImage = addGaussianNoise(grayImg, 0.1)  # 添加10%的高斯噪声
    cv2.imshow("Add_GaussianNoise Image", gauss_noiseImage)
    cv2.imwrite(r"C:\Users\xxx\Desktop\GaussianNoise Image1.jpg", gauss_noiseImage)

    SaltAndPepper_noiseImage = SaltAndPepperNoise(grayImg, 0.1)  # 添加10%的椒盐噪声
    cv2.imshow("Add_SaltAndPepperNoise Image", SaltAndPepper_noiseImage)
    cv2.imwrite(r"C:\Users\xxx\Desktop\SaltAndPepper_noiseImage1.jpg", gauss_noiseImage)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

main()

四、去噪处理

下面是给出对前文中 加过 椒盐噪声和高斯噪声的图像 分别进行图像去噪 处理
这里主要介绍下中值滤波均值滤波,并附带四种滤波的比较

中值滤波和均值滤波都可以起到平滑图像,具有去噪声的功能。
中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。
均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。

下列图像中左侧右侧分别是对上述加过椒盐噪声图像和加过高斯噪声图像使用特定滤波进行去噪处理 
 
中值滤波

mbImg = cv2.medianBlur(noise_im,3)

数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理  数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理
均值滤波

meanImg = cv2.blur(noise_im,(3,3))

数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理  数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理
高斯滤波

Img_GaussianBlur=cv2.GaussianBlur(noise_im,(3,3),0)

数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理  数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理
双边滤波

img_bilateralFilter=cv2.bilateralFilter(noise_im,40,75,75)

数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理   数字图像处理 - 椒盐噪声&高斯噪声介绍及代码实现并对其进行去噪处理

搜索公众号“分享猿”,并回复关键词“代码”,获取本文全部代码

留言或者公众号关注我,我们一起分享数字图像处理心得,一起交流学习吧~