在数字图像处理过程中,图像的采集、传输和存储往往不可避免地会受到硬件环境或传输信道的干扰,产生所谓的图像噪声。为了提高图像质量,方便后续的特征提取与识别,图像平滑技术成为了预处理阶段的核心步骤。


一、 图像噪声类型

噪声是指存在于图像数据中不必要的干扰信息。了解噪声的数学模型是选择平滑算法的前提。

1. 椒盐噪声 (Salt-and-Pepper Noise)

椒盐噪声也称为脉冲噪声,表现为图像中随机出现的白点(盐)或黑点(椒)。

  • 现象:亮的区域有黑色像素点,或暗的区域有白色像素点。
  • 成因:通常由影像讯号受到强烈干扰、类比数位转换器错误或位元传输错误产生。例如感应器失效导致像素值为最小值,或饱和导致最大值。
椒盐噪声示意图

图1:椒盐噪声示例

2. 高斯噪声 (Gaussian Noise)

高斯噪声是指噪声密度函数服从高斯分布(即正态分布)的一类噪声。

  • 数学模型:其概率密度函数(PDF)由下式给出:
    p ( z ) = 1 2 π σ e − ( z − μ ) 2 2 σ 2 p(z) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{(z-\mu)^2}{2\sigma^2}} p(z)=2π σ1e2σ2(zμ)2
    其中:
    • z z z:灰度值。
    • μ \mu μ z z z 的平均值或期望值。
    • σ \sigma σ z z z 的标准差( σ 2 \sigma^2 σ2 为方差)。
  • 特征:噪声在空间上遍布全图,且幅度分布符合钟形曲线。
高斯噪声分布图

图2:高斯函数分布曲线


二、 图像平滑核心原理

从信号处理的角度看,图像平滑就是去除其中的高频信息,保留低频信息

  • 低频信息:代表图像中亮度变化缓慢的部分(如大面积背景)。
  • 高频信息:代表图像中亮度变化剧烈的部分(如边缘、细节以及噪声)。

因此,平滑处理本质上是实施低通滤波(Low-pass Filtering)


三、 主流滤波算法解析

1. 均值滤波 (Mean Filtering)

均值滤波采用邻域模板对图像进行线性处理。其基本逻辑是用窗口内所有像素的平均值代替中心像素。

  • 数学表达式
    S x y S_{xy} Sxy 表示中心在 ( x , y ) (x, y) (x,y) 点、尺寸为 m × n m \times n m×n 的矩形窗口坐标组。均值滤波器可表示为:
    f ^ ( x , y ) = 1 m n ∑ ( s , t ) ∈ S x y g ( s , t ) \hat{f}(x, y) = \frac{1}{mn} \sum_{(s,t) \in S_{xy}} g(s, t) f^(x,y)=mn1(s,t)Sxyg(s,t)
  • 卷积核示例:一个 3 × 3 3 \times 3 3×3 的归一化卷积核如下:
    K = 1 9 [ 1 1 1 1 1 1 1 1 1 ] K = \frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} K=91 111111111
  • 优缺点:计算速度极快,但在去噪的同时会模糊边缘细节。
import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img = cv.imread('dog_noise.jpg')
# 均值滤波
blur = cv.blur(img, (5, 5))

# 显示结果
plt.subplot(121), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB)), plt.title('Original')
plt.subplot(122), plt.imshow(cv.cvtColor(blur, cv.COLOR_BGR2RGB)), plt.title('Blurred')
plt.show()

2. 高斯滤波 (Gaussian Filtering)

高斯滤波是一种加权平均滤波。越接近中心点,权重越大;越远离中心点,权重越小。

  • 二维高斯函数
    高斯滤波器的核心是基于二维正态分布分布函数:
    G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2
    其中 ( x , y ) (x, y) (x,y) 是相对于中心点的坐标, σ \sigma σ 是标准差。
  • 权重的意义 σ \sigma σ 决定了“钟形”曲线的宽度。 σ \sigma σ 越大,曲线越扁平,平滑效果(模糊感)越强。
  • 应用:对去除高斯噪声效果极佳,且能比均值滤波更好地保留图像整体结构。
# 高斯滤波
gaussian = cv.GaussianBlur(img, (5, 5), 1)

# 显示结果
plt.subplot(121), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB)), plt.title('Original')
plt.subplot(122), plt.imshow(cv.cvtColor(gaussian, cv.COLOR_BGR2RGB)), plt.title('Gaussian Blur')
plt.show()

3. 中值滤波 (Median Filtering)

中值滤波是一种典型的非线性滤波技术,它不依赖于加权计算。

  • 算法逻辑
    1. 在像素点的邻域内提取所有像素值。
    2. 将这些值按升序排列。
    3. 用排列后的**中值(Median)**代替中心点的灰度值。
  • 适用场景:它是椒盐噪声的克星。
  • 公式思想
    f ^ ( x , y ) = median { g ( s , t ) ∣ ( s , t ) ∈ S x y } \hat{f}(x, y) = \text{median} \{g(s, t) | (s, t) \in S_{xy}\} f^(x,y)=median{g(s,t)(s,t)Sxy}
  • 优点:在去除脉冲噪声的同时,能够非常出色地保护图像边缘,不会产生严重的边缘模糊。
# 中值滤波
median = cv.medianBlur(img, 5)

# 显示结果
plt.subplot(121), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB)), plt.title('Original')
plt.subplot(122), plt.imshow(cv.cvtColor(median, cv.COLOR_BGR2RGB)), plt.title('Median Blur')
plt.show()

四、 滤波器选择对比总结

滤波器类型 对应数学原理 推荐处理噪声 边缘保护能力
均值滤波 算术平均 一般随机噪声 较差(明显模糊)
高斯滤波 加权平均(正态分布) 高斯噪声 中等
中值滤波 排序统计(中位数) 椒盐噪声

五、 结语

在实际的预处理流程中:

  • 如果遇到由于电子干扰产生的细微噪点,首选高斯滤波
  • 如果图像上出现了明显的黑白点(如扫描仪污渍),首选中值滤波
  • 所有的滤波操作都是在“抑制噪声”与“保留细节”之间做权衡,核大小(ksize)的选择至关重要。

参考资料

黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程


感谢阅读!如果这篇文章对你有帮助,欢迎点赞、收藏并关注我,我们下期再见!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐