均值滤波、高斯滤波、中值滤波的原理与适用场景有何不同?

均值滤波、高斯滤波、中值滤波对比

三者都是空间域滤波(用邻域像素计算中心像素的新值),但原理和效果差异很大。


1. 均值滤波(Mean Filter)

原理:取邻域内所有像素的算术平均作为中心像素的新值。

$$g(x,y) = \frac{1}{m \times n} \sum_{(i,j) \in S} f(i,j)$$

特点

  • 线性滤波,实现最简单、速度最快
  • 高斯噪声有一定平滑作用
  • 缺点:对**离群点(脉冲噪声)**敏感——一个极端值会拉偏整个邻域的平均值
  • 边缘被严重模糊(边缘两侧像素被平均混合)

适用场景:对噪声不敏感、追求速度的简单平滑;图像预处理中的粗略降噪。


2. 高斯滤波(Gaussian Filter)

原理:邻域内像素加权平均,权重服从二维高斯分布,中心权重最大、越远越小

$$G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}}$$

特点

  • 线性滤波,是均值滤波的"加权改进版"
  • 权重平滑过渡,不会像均值滤波那样产生生硬的块状效应
  • 高斯噪声效果最好(高斯噪声在统计上最匹配高斯核)
  • 相比均值滤波,边缘保留更好(中心像素权重高,受远处像素影响小),但仍会模糊边缘
  • 计算量略大于均值滤波

适用场景:高斯噪声去除;边缘检测前的预处理(如 Canny 的第一步);尺度空间构建(高斯金字塔);图像模糊/美颜。


3. 中值滤波(Median Filter)

原理:取邻域内所有像素的中位数作为中心像素的新值(非线性滤波)。

特点

  • 非线性滤波,不涉及加权求和
  • 椒盐噪声(脉冲噪声)效果极佳——极端值(0 或 255)不会影响中位数
  • 能很好地保留边缘:边缘两侧像素值差异大时,中位数会落在其中一侧,不会像线性滤波那样把两侧"混合"成过渡带
  • 缺点:对高斯噪声效果一般;计算量较大(需要排序);邻域过大时可能产生"阶梯效应"

适用场景:椒盐噪声去除(如老照片扫描、传感器故障图像);需要保边降噪的场景;医学图像、文档图像预处理。


对比总结

维度均值滤波高斯滤波中值滤波
类型线性线性非线性
权重等权平均高斯加权取中位数
高斯噪声一般最好一般
椒盐噪声差(被拉偏)最好
边缘保留
计算复杂度最低较高(需排序)
典型场景快速粗略平滑高斯去噪、边缘检测预处理椒盐去噪、保边降噪

一句话总结

均值滤波是"平均一下"(简单但糊边、怕离群点),高斯滤波是"按距离加权平均"(去高斯噪声最优、边缘稍好),中值滤波是"取中间值"(专治椒盐噪声、最能保边)。


纯 Python 实现示例(无第三方依赖)

python
复制代码
def median_filter(pixels, width, height, k=3): """中值滤波:对灰度图(pixels 为二维列表)做 k×k 中值滤波""" pad = k // 2 result = [[0] * width for _ in range(height)] for y in range(height): for x in range(width): window = [] for dy in range(-pad, pad + 1): for dx in range(-pad, pad + 1): ny, nx = y + dy, x + dx # 边界处理:越界时取最近的有效像素(复制边缘) ny = max(0, min(height - 1, ny)) nx = max(0, min(width - 1, nx)) window.append(pixels[ny][nx]) window.sort() result[y][x] = window[len(window) // 2] return result

面试高频追问:为什么中值滤波能保留边缘而均值不能?——均值滤波把边缘两侧的像素混合平均,产生过渡带(模糊);中值滤波取的是排序后的中间值,只要窗口内一侧像素占多数,中位数就落在该侧,边缘被完整保留。这也是中值滤波被称为"保边滤波器"的原因。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP