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

本文介绍椒盐噪声的产生及如何使用中值滤波进行去除的方法。通过Python和OpenCV实现图像噪声添加与滤波处理,并讨论信噪比及滤波器参数对图像质量的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的选择直接影响图片的质量。

<think>嗯,用户想了解图像处理中的椒盐噪声的定义特点。首先,我需要回忆一下椒盐噪声的基本概念。根据引用[1],椒盐噪声数字图像中的常见噪声,通常由图像传感器、传输信道或解码处理等环节产生。它分为盐噪声噪声,盐噪声是高灰度的白色点,而椒噪声是低灰度的黑色点,通常在图像上表现为黑白杂点。 接下来,用户可能想知道椒盐噪声的特点。引用[1]提到椒盐噪声是脉冲噪声的一种,表现为突发的黑白点,这可能随机出现的像素值突变有关。另外,引用[4]指出标准中值滤波在处理椒盐噪声时需要进行大量排序,计算量大,这说明椒盐噪声的特点可能对滤波算法有特定要求,比如中值滤波的有效性以及窗口尺寸的影响。 另外,引用[3]提到椒盐噪声在彩色图像中的表现,可能需要考虑不同颜色通道的影响。而引用[2]强调去噪算法的重要性,说明椒盐噪声对图像质量的影响较大,需要选择合适的处理方法。 用户可能还需要知道椒盐噪声与其他噪声(如高斯噪声)的区别。比如,椒盐噪声是极端的像素值变化,而高斯噪声是每个像素值的小幅度随机变化。这可以帮助用户更好地区分不同的噪声类型。 在定义部分,需要明确椒盐噪声的组成成因,可能还需要提到其随机性对图像视觉效果的影响。特点方面应包括高对比度、随机分布、对局部细节的影响以及处理方法的选择,比如中值滤波的有效性。 需要确保回答中使用正确的LaTeX格式,比如行内数学表达式用$...$,独立公式用$$...$$,但这个问题可能不涉及太多数学公式,所以可能重点放在定义特点的清晰描述上。同时,生成的相关问题要围绕椒盐噪声的应用、去噪方法、与其他噪声的比较等,帮助用户进一步学习。</think>### 图像处理椒盐噪声的定义与特点 #### **1. 定义** 椒盐噪声数字图像中的一种**脉冲噪声**,由随机分布的黑白像素点构成。其名称来源于“椒”(黑色噪点,低灰度值,如$0$)“盐”(白色噪点,高灰度值,如$255$)的视觉特征[^1]。这种噪声通常由图像传感器故障、传输信道干扰或存储介质损坏导致,例如电路瞬时击穿、电磁干扰等[^3]。 #### **2. 特点** 1. **极值特性** 椒盐噪声表现为像素值的极端跳变:盐噪声对应最大亮度值(如$255$),椒噪声对应最小亮度值(如$0$),与周围像素形成高对比度。 2. **随机分布** 噪声点以**独立随机**的形式出现在图像任意位置,密度可通过概率模型控制(例如设定噪声比例为$p$)。 3. **局部破坏性** 噪声点会完全覆盖原始像素值,导致局部信息丢失。例如,若噪声点出现在边缘区域,可能破坏图像的结构特征[^4]。 4. **中值滤波有效性** 由于椒盐噪声的极值特性,**中值滤波**(非线性滤波)能有效去除噪声,因为它通过邻域像素的中间值替代噪声点,避免线性滤波(如均值滤波)导致的模糊。 --- ### **数学建模示例** 若图像$I$的椒盐噪声比例为$p$,则噪声图像$I_{\text{noisy}}$可表示为: $$I_{\text{noisy}}(x,y) = \begin{cases} 0 & \text{以概率 } p/2 \\ 255 & \text{以概率 } p/2 \\ I(x,y) & \text{以概率 } 1-p \end{cases}$$ ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值