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。