均值滤波、高斯滤波、中值滤波的原理与适用场景有何不同?
均值滤波、高斯滤波、中值滤波对比
三者都是空间域滤波(用邻域像素计算中心像素的新值),但原理和效果差异很大。
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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
