contribute上次修改:2026-09-29

2.4 滤波与降噪

总目录:1.1 OpenCV介绍与学习路线 | 第二章:基础图像处理 | 编号:2.4

← 上一节:2.3 绘制图形与文字 | 下一节:2.5 二值化与阈值 →


2.4 滤波与降噪

相机画面里会有传感器噪声、压缩纹理和小反光。直接找边缘,算法可能把这些细碎变化也当成目标。滤波相当于先把桌面收拾一下,再开始找东西。

一、为什么先去噪再找边缘

常见顺序:

原图 → 灰度 → 轻度滤波 → Canny / threshold → 轮廓

滤波会减少噪声,也会损失细节。目的不是把图磨得越糊越好,而是让“无关变化”变弱、目标结构仍然保留。

二、核:拿多大一块邻域参与计算

**核(kernel)**是一小块在图像上滑动的邻域,例如 (3, 3)、(5, 5):

核小 → 保留细节,去噪较弱
核大 → 平滑更强,细节和边缘也更容易丢

高斯核通常使用正奇数宽高,才能有明确中心:

blurred = cv2.GaussianBlur(gray, (5, 5), sigmaX=0)

注意,不是所有滤波函数都要求核尺寸必须是奇数。例如 cv2.blur 的 ksize 可以是偶数;但日常用奇数更容易理解锚点位置。

三、四种常见滤波

1. 均值滤波 blur

邻域像素一视同仁,直接平均:

mean = cv2.blur(image, (5, 5))
  • 优点:简单、快;
  • 缺点:边缘容易一起糊掉;
  • 适合:只需要很便宜的基础平滑。

2. 高斯滤波 GaussianBlur

离中心近的像素权重大,远的权重小:

gaussian = cv2.GaussianBlur(image, (5, 5), sigmaX=0)
  • 优点:平滑自然,是 Canny 前的常用选择;
  • sigmaX=0:让 OpenCV 根据核大小估算;
  • 核变大或 sigma 变大,一般会更模糊。

3. 中值滤波 medianBlur

把邻域像素排序,用中间值替换中心:

median = cv2.medianBlur(image, 5)
  • 对孤立黑白点,也就是椒盐噪声很有效;
  • 边缘保持通常好于均值滤波;
  • ksize 是单个奇数,并且要大于 1。

4. 双边滤波 bilateralFilter

同时看空间距离和颜色差异:

bilateral = cv2.bilateralFilter(image, d=9, sigmaColor=75, sigmaSpace=75)
  • 能在平滑区域的同时尽量保边;
  • 计算更贵,实时嵌入式项目要测速度;
  • 参数没有“通用最优值”。

四、怎样选择滤波器

噪声或目标 优先尝试
通用轻度噪声,后面做 Canny 高斯滤波
孤立黑白点、椒盐噪声 中值滤波
只求便宜快速 均值滤波
必须尽量保留明显边缘 双边滤波,但要测算力
methods = {
    "mean": cv2.blur(image, (5, 5)),
    "gaussian": cv2.GaussianBlur(image, (5, 5), 0),
    "median": cv2.medianBlur(image, 5),
    "bilateral": cv2.bilateralFilter(image, 9, 75, 75),
}

五、滤波不是越强越好

核太大时会发生:

  • 两条靠近的边缘糊成一条;
  • 小目标直接消失;
  • 轮廓面积和角点位置发生偏移;
  • 实时处理速度下降。

调参建议:

1. 先用 3×3 或 5×5
2. 看噪声是否影响后续二值图/边缘图
3. 只在确实需要时加大
4. 用最终检测指标判断,不凭“画面更丝滑”判断

这里讲的是空间图像滤波。云台误差随时间抖动时用的一阶低通滤波,放在 视觉控制章节 讲,两者别混在一篇里。


← 上一节:2.3 绘制图形与文字 | 下一节:2.5 二值化与阈值 →

留言区

不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。