机器视觉学习-day11-图像噪点消除

图像噪点消除技术详解

1 噪声

噪声指的是图像中的一些干扰因素,通常由于图像的采集设备或传输过程中导致的,表现为图像中部分像素点出现随机亮度,也可以理解为一些像素点与周围的像素点格格不入。

常见噪声分为两类:

高斯噪声是一种符合正态分布的噪声,会使图像变得有明暗不均的噪点,如果是彩图可能还会出现颜色的分布不均。

椒盐噪声:是一些黑色像素值分布在原图像中,可以把椒盐噪声理解为斑点,随机出现在画面中。

2 滤波器

滤波器:实际上就是之前的卷积核,与自适应二值化中的核一样,本身是一个小区域,有这特定的核值,并且工作原理也实在原图上从左向右、从上到下进行滑动计算。

滤波器可以分为两类:

线性滤波:对卷积核中的邻域像素进行线性计算,例如计算求和等,常见的线性滤波器有均值滤波、高斯滤波等。

非线性滤波:利用原始图像与模板之间的一种逻辑关系得到结果,常见的非线性滤波器有中值滤波、双边滤波等。

2.1 均值滤波

均值滤波是一种最简单的滤波器,它直接计算卷积核区域内元素的平均值。例如3x3的卷积核:

原始图像:1.jpg  (高斯噪声图像)

import cv2

if __name__ == '__main__':
    # 1.图片输入
    image_np = cv2.imread("1.jpg")  # cv2.imread(): OpenCV的图像读取函数
    # 2.滤波算法
    no_noise_image = cv2.blur(  # cv.blur(): OpenCV的均值滤波函数,用于模糊图像/降噪
        image_np,  # 原图
        (5, 5)  # 核
    )
    """
    均值滤波原理:用一个小窗口(核)在图像上滑动,用窗口内所有像素的平均值代替中心像素
    (5, 5): 核的大小,这里表示使用5×5的窗口进行计算
    核大小越大,模糊效果越明显,但计算量也越大
    """

    # 3. 图片输出
    cv2.imshow('no_noise_image', no_noise_image)
    cv2.waitKey(0)
    cv2.imwrite('junzhi.png', no_noise_image)
    cv2.destroyAllWindows()  # 关闭所有由OpenCV创建的窗口,释放资源

均值滤波修改后的图像:junzhi.png

2.2 方框滤波

方框滤波与均值滤波非常像。如3x3的滤波核如下:

参数与均值滤波有相同的也有不同的,只讲解不同的(后文同),新参数:

        ddepth 输出图像的深度

-1表示使用原图的深度,即每个像素点占用的位数,最常用的位数是cv2.CV_8U,即8位无符号整数:0-255

        normalize 控制a的数值

当此参数为True时,方框滤波就是均值滤波;

当此参数为False时,a=1,相当于在区域内求像素和。

原始图片:2.jpg (暗)   方框滤波在消除噪声的同时会提高图片的亮度

import cv2

if __name__ == '__main__':
    # 1. 图片输入
    image_np = cv2.imread('2.jpg')

    # 2. 滤波算法
    # 方框滤波
    no_noise_image = cv2.boxFilter(
        image_np,  # 原图
        -1, # 位深度
        (3, 3),  # 核
        normalize=False # 标准化参数
    )

    # 3. 图片输出
    cv2.imshow('no_noise_image', no_noise_image)
    cv2.waitKey(0)
    cv2.imwrite('fangkuang.png', no_noise_image)

代码运行后:fangkuang.png

2.3 高斯滤波

高斯滤波的核权重计算与自适应二值化的《高斯加权求和》过程完全相同。

当时以3x3为例,计算出核为:

原始图片同上:1.jpg

import cv2
import numpy as np

if __name__ == '__main__':
    # 1. 图片输入
    image_np = cv2.imread('1.jpg')

    # 2. 滤波算法
    # 高斯滤波
    no_noise_image = cv2.GaussianBlur(
        image_np,  # 原图
        (5, 5),  # 核大小
        1  # SigmaX与中心像素的权重成反比
    )

    """
    cv2.GaussianBlur(): OpenCV的高斯滤波函数
    高斯滤波原理: 使用高斯函数计算权重,对图像进行加权平均模糊
    与均值滤波不同,高斯滤波给中心像素附近的像素分配更高的权重
    权重分布遵循高斯分布(钟形曲线),中心权重最高,向外逐渐减小

    参数详解:
    image_np: 输入图像
    (5, 5): 核大小,必须是正奇数,如(3,3)、(5,5)等
    1: SigmaX,高斯核在X方向的标准差
    注意:如果只指定SigmaX,SigmaY会自动设为与SigmaX相同
    """

    # 3. 图片输出
    cv2.imshow('no_noise_image', no_noise_image)
    cv2.waitKey(0)
    cv2.imwrite("gaosi.png", no_noise_image)

"""
高斯滤波的特点与优势
高斯滤波是一种非常常用的线性滤波器,具有以下特点:
    平滑效果好: 能有效去除高斯噪声
    保留边缘: 相比均值滤波,能更好地保留图像边缘
    可调节性: 通过调整核大小和Sigma值可以控制模糊程度
    各向同性: 在各个方向上具有相同的平滑效果

参数详解与调节
    核大小 (ksize):
        必须是正奇数,如(3,3)、(5,5)、(7,7)等
        值越大,模糊效果越明显,但计算量也越大
        如果设为(0,0),OpenCV会根据Sigma值自动计算核大小
    SigmaX:
        高斯核在X方向的标准差
        值越大,高斯分布越平坦,模糊效果越明显
        如果设为0,OpenCV会根据核大小自动计算Sigma值
    SigmaY:
        高斯核在Y方向的标准差
        如果设为0,则与SigmaX相同
        如果SigmaX和SigmaY都为0,则根据核大小自动计算
"""

运行后图片效果:gaosi.png

2.4 中值滤波

中值就是中位数,是核中对应的像素排序后的中间值,因此核本身没有数值,也不需要新增的参数。需要注意的是,默认的边界填充算法是边界复制。

原始图像:3.jpg    (椒盐噪声)

import cv2

if __name__ == '__main__':
    # 1. 图片输入
    image_np = cv2.imread('3.jpg')  # 读取名为'123.jpg'的图片,并将其存储在变量image_np中

    # 2. 滤波算法
    # 中值滤波
    no_noise_image = cv2.medianBlur(  # 调用中值滤波函数
        image_np,  # 输入的原图像
        3  # 滤波核的大小,这里是3x3的窗口
    )

    # 3. 图片输出
    cv2.imshow('no_noise_image', no_noise_image)  # 创建一个窗口显示处理后的图像
    cv2.waitKey(0)  # 等待用户按下任意键继续
    cv2.imwrite('zhongzhi.png', no_noise_image)
    """
    中值滤波是一种非线性数字滤波技术,
    常用于去除图像中的"椒盐噪声"(随机出现的黑白点),
    同时能较好地保留图像边缘信息。
    
    中值滤波步骤:
    定义滑动窗口:选择一个窗口(通常是奇数大小的正方形,如3×3、5×5)    
    遍历图像像素:将窗口中心对准图像的每一个像素    
    收集邻域值:获取窗口覆盖范围内的所有像素值    
    排序并取中值:将这些像素值按大小排序,取中间值    
    替换中心像素:用这个中值替换窗口中心的原始像素值
    """

代码运行:zhongzhi.png

2.5 双边滤波

前面的滤波器都丢失了一些图像信息,使图像边缘变得更加难以处理,边缘是图像处理中非常重要的特征,因此可以使用双边滤波保留更多的边缘信息。

原始图片同上:3.jpg 

import cv2
import numpy as np

if __name__ == '__main__':
    # 1. 图片输入
    image_np = cv2.imread('3.jpg')

    # 2. 滤波算法
    # 双边滤波
    no_noise_image = cv2.bilateralFilter(
        image_np,  # 原图
        9,  # 核,直径d
        80,  # SigmaColor
        80  # sigmaSpace
    )
    """
    cv2.bilateralFilter(): OpenCV的双边滤波函数
    双边滤波原理: 与简单均值滤波不同,双边滤波是一种非线性滤波器,它同时考虑空间距离和像素值相似性
    空间距离: 靠近中心像素的像素有更大权重
    像素值相似性: 与中心像素值相似的像素有更大权重
    参数详解:
    image_np: 输入图像
    9: 滤波器的直径d,表示每个像素邻域的直径
    80: SigmaColor,颜色空间的标准差,控制颜色相似性判断
    80: SigmaSpace,坐标空间的标准差,控制空间距离判断
    """

    # 3. 图片输出
    cv2.imshow('no_noise_image', no_noise_image)
    cv2.waitKey(0)
    cv2.imwrite("shuangbian.png", no_noise_image)

运行后图片:shuangbian.png

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值