数字图像处理之椒盐噪声和中值滤波

0、所有的代码基于python3 + opecv3.3
1、椒盐噪声和中值滤波
  椒盐噪声(salt-and-pepper noise)是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。
  所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声,产生该噪声的算法也比较简单。
  椒盐噪声往往由图像切割引起,去除脉冲干扰及椒盐噪声最常用的算法是中值滤波。大量的实验研究发现,由摄像机拍摄得到的图像受离散的脉冲、椒盐噪声和零均值的高斯噪声的影响较严重。噪声给图像处理带来很多困难,对图像分割、特征提取、图像识别等具有直接影响。因此,实时采集的图像需进行滤波处理。消除图像中的噪声成份叫做图像的平滑化或滤波操作。滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;二是为适应计算机处理的要求,消除图像数字化时所混入的噪声。对滤波处理的要求有两条:一是不能损坏图像轮廓及边缘等重要信息;二是使图像清晰,视觉效果好。
  我们使用信噪比(Signal NoiseRate)衡量图像噪声,图象的信噪比应该等于信号与噪声的功率谱之比,但通常功率谱难以计算,有一种方法可以近似估计图象信噪比,即信号与噪声的方差之比(其实在均值为零的情况下,功率就是方差)。首先计算图象所有像素的局部方差,将局部方差的最大值认为是信号方差,最小值是噪声方差,求出它们的比值,再转成dB数,最后用经验公式修正。
  如果是灰度图像的话,SNR=(洁净图片中的像素点的灰度值之和)/abs(噪声图片的灰度值之和-洁净图片中的灰度值之和)为该图像的信噪比。
  给一副数字图像加上椒盐噪声的步骤如下:

  1. 指定信噪比 SNR (其取值范围在[0, 1]之间)
  2. 计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * (1-SNR)
  3. 随机获取要加噪的每个像素位置P(i, j)
  4. 指定像素值为255或者0。
  5. 重复3,4两个步骤完成所有像素的NP个像素
  6. 输出加噪以后的图像
import cv2
import numpy as np

filename = "d:/1.jpg"
winname = "figure"
img = cv2.imread(filename)

def addSaltNoise():
    # 指定信噪比
    SNR = 0.9
    # 获取总共像素个数
    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
    cv2.imshow(winname, img)
    cv2.waitKey(0)

def main():
    addSaltNoise()

if __name__ == '__main__':
    main()

执行效果如下
原始图像:
这里写图片描述
信噪比为0.9的时候:
这里写图片描述
信噪比为0.7的时候:
这里写图片描述
信噪比为0.5的时候:
这里写图片描述
信噪比为0.1的时候:
这里写图片描述

通过对已经被椒盐噪声污染的图片进行中值滤波

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 = "d:/1.jpg"
    # 得到加噪声之后的图像
    img = addSaltNoise(cv2.imread(filename),0.9)
    # 进行中值滤波
    lbimg = cv2.medianBlur(img, 3)
    cv2.imshow('src', img)
    cv2.imshow('dst', lbimg)
    cv2.waitKey(0)

def main():
    removeSaltNoise()

if __name__ == '__main__':
    main()

效果如下:
被污染之后的图像(信噪比0.9的椒盐噪声):
这里写图片描述
经过中值滤波之后的图像:
这里写图片描述
真实的图像:
这里写图片描述
显然仅仅通过中值滤波还不够。因此调整中值滤波器,也就是cv2.medianBlur(img, 3)这个函数的参数,首先说一下中值滤波。
  中值滤波(Median filter)是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节,中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点,对于斑点噪声(speckle noise)和椒盐噪声(salt-and-pepper noise)来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值。中值滤波器在处理连续图像窗函数时与线性滤波器的工作方式类似,但滤波过程却不再是加权运算。
  中值滤波在一定的条件下可以克服常见线性滤波器如最小均方滤波、方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。这个函数的定义是

def medianBlur(src,ksize,dst=None)  
其中src代表原图像,dst代表输出文件,缺省值为None,ksize代表孔径的线性尺寸,是int类型的大于一的奇数

以上程序ksize的值比较小,效果不太好,现在进行调整效果如下
ksize = 5的时候(貌似更清晰了):
这里写图片描述
ksize = 7的时候(更清晰了,是不是ksize的值越大越好呢):
这里写图片描述
ksize = 9的时候:
这里写图片描述
ksize = 21的时候(虽然椒盐噪声没了,但是图像也变的模糊了,因为ksize太大了,把有用的信息也用中值代替了,误差就逐渐显现出来了):
这里写图片描述
来个极端的,ksize = 101的时候(已经模糊不清了。。。):
这里写图片描述
虽然ksize(模板大小为ksize * ksize)越大可以有效的消除噪声,但是会使边界模糊,因此对ksize的选择直接影响图片的质量。

  • 48
    点赞
  • 283
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
图像在采集和传输过程中,往往会引入不同程度的噪声,这就为后面的边缘检测、图像分割和形状识别等带来很大的难度,所以图像去噪是图像处理中非常重要的一环。影啊图像质量的噪声中最常见的是高斯噪声和脉冲噪声,本文主要针对脉冲噪声提出新的滤波算法。中值滤波及其各种改进方法是常用的去除脉冲噪声的滤波方法,它对去除脉冲噪声具有较好的性能,去噪后在人眼敏感的平滑区域不存在或有较少的噪声,但是现存的中值滤波算法在图像的结构细节保护上较差,尤其是在高密度脉冲哑声污染下,复原引起的失真较严重本文针对高密度脉冲噪声提出两种改进型的中值滤波算法。一种滤波方法命名为 HSADMF是针对高密度椒盐噪声污染情况下的改进中值滤波法。ISADUF是基于序列图像的椒盐噪声去除的算法,利用椒盐噪声的正负脉冲特性,提出点对点的检测算法,把像素点分为信息点和可疑噪声点,仅对噪声点进行滤波处理,充分利用每幅图像的有用信息来恢复受污染的图像,取得了良好的恢复效。分灰度图像和彩色图像分析该滤波方法的特性及其滤波效果图。第二种滤波方法命名为SAD-WW是根据ADW滤波方法的思想,提出针对高密度随机值脉冲噪声的滤波处理方法,该旅波方法首先对图像效果影响较大的极限值噪声用 HSADMMF方法处理,在此基础上再对箱机脉冲噪声进行矢量中值滤波处理。两种滤波方法得到的峰值信噪比(PSNR)与其他经典的滤波方法相比最大,平均绝对误差OMAE最小,即其去噪效果最好,细节处理效果最佳。
数字图像处理是指利用计算机对数字图像进行处理和分析的过程。而MATLAB是一种常用的图像处理工具,且具有强大的图像处理功能。 图像滤波是数字图像处理中常用的一种处理方法,它可以用于图像降噪和图像增强等多个方面。其中,高斯噪声和椒盐噪声是常见的两种图像噪声,而高斯滤波和中值滤波则是两种常用的图像滤波算法。 高斯噪声是一种服从高斯分布的随机噪声,会对图像的亮度和颜色造成影响。在MATLAB中,可以通过调用imnoise函数来为图像添加高斯噪声。对于已经添加了高斯噪声的图像,可以使用高斯滤波来进行滤波处理。高斯滤波基于高斯函数,将图像中每个像素点的值根据其邻域内像素的值进行加权平均。 椒盐噪声是指在图像中随机出现的白点和黑点,会对图像的质量造成较大的影响。同样,在MATLAB中可以通过imnoise函数为图像添加椒盐噪声。针对添加了椒盐噪声的图像,可以使用中值滤波进行滤波处理。中值滤波是基于中值运算,将图像中每个像素点的值替换为邻域内像素的中值。 总的来说,基于MATLAB的数字图像处理中,图像滤波算法可以用于去除图像中的噪声,提升图像的质量。高斯滤波适用于去除高斯噪声,中值滤波适用于去除椒盐噪声。在实际应用中,可以根据图像的噪声类型选择合适的滤波算法以达到更好的滤波效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值