4、图像预处理:灰度化、滤波去噪、直方图均衡化
各位工程师朋友,咱们接着聊。上一章我们把相机标定搞定了,拿到了内外参数。但相机拍回来的原始图像,说实话,直接拿去用往往不行。为什么?因为工业现场太“脏”了——光照不均、传感器噪声、反光干扰……这些问题不处理,后面的特征提取和定位就会一塌糊涂。
我个人习惯,拿到图像的第一件事,就是做预处理。说白了,就是把原始图像“洗”干净,让算法能看清它该看的东西。今天咱们就讲三个最基础、也最常用的预处理操作:灰度化、滤波去噪、直方图均衡化。
核心观点:预处理不是可选项,是必选项。你花在预处理上的时间,会在后续算法调试中十倍地省回来。
4.1 灰度化:扔掉颜色,保留结构
彩色图像每个像素有RGB三个通道,数据量是灰度图的三倍。但在视觉引导抓取中,我们关心的是物体的轮廓、边缘、位置,而不是它的颜色。所以,第一步就是把彩色图转成灰度图。
灰度化的公式其实很简单:
Gray = 0.299 * R + 0.587 * G + 0.114 * B
这个公式不是随便写的。人眼对绿色最敏感,对蓝色最不敏感,所以权重不一样。我在项目中遇到过有人直接用平均值 (R+G+B)/3,结果图像对比度明显下降,边缘检测效果差了很多。嗯,这里要注意,别图省事用平均法。
OpenCV里一行代码搞定:
import cv2
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
小技巧:如果你的应用场景里颜色信息确实有用(比如区分不同颜色的工件),可以保留彩色通道做后续处理。但大多数抓取场景,灰度化就够了。
4.2 滤波去噪:把“雪花”去掉
灰度化之后,图像里往往还有噪声。工业相机在弱光环境下,或者传输线路有干扰时,图像上会出现随机亮暗的点——这就是噪声。噪声会严重影响边缘检测和特征提取。
滤波去噪,说白了就是用周围像素的信息来“修复”当前像素。常用的有三种:
| 滤波方法 | 原理 | 适用场景 | 缺点 |
|---|---|---|---|
| 均值滤波 | 取邻域内像素的平均值 | 高斯噪声 | 边缘模糊严重 |
| 高斯滤波 | 按高斯权重取邻域加权平均 | 高斯噪声,保留边缘稍好 | 计算量稍大 |
| 中值滤波 | 取邻域内像素的中位数 | 椒盐噪声(黑白点噪声) | 对高斯噪声效果一般 |
我个人最常用的是高斯滤波和中值滤波。为什么?均值滤波虽然快,但边缘糊得太厉害。你想想看,抓取任务里边缘就是命根子,边缘没了还抓什么?
我曾经在一个项目里遇到强光反射导致的椒盐噪声,用高斯滤波怎么调参数都去不干净。后来换成中值滤波,效果立竿见影。所以,选滤波方法要看噪声类型,别盲目套用。
代码示例:
# 高斯滤波
gaussian = cv2.GaussianBlur(gray, (5, 5), 1.5)
# 中值滤波
median = cv2.medianBlur(gray, 5)
注意:滤波核大小(比如5x5)越大,去噪越强,但细节丢失也越多。我建议从3x3开始试,不行再加大。别一上来就用9x9,图像会变成“油画”效果。
4.3 直方图均衡化:让暗的地方亮起来
滤波去噪之后,图像干净了,但可能整体偏暗或者对比度不够。比如工件放在阴影里,或者背景太亮、工件太暗。这时候就需要直方图均衡化。
直方图均衡化的原理,说白了就是把像素值的分布“拉平”。原本集中在暗区的像素,会被映射到整个0-255范围,让暗部细节显现出来。
我举个例子:一张图里大部分像素灰度值都在30-50之间,整张图看起来黑乎乎一片。均衡化之后,这些像素会被拉伸到0-200的范围,暗部细节就出来了。
OpenCV实现:
# 全局直方图均衡化
equalized = cv2.equalizeHist(gray)
但这里有个坑——全局均衡化会增强噪声。你想想看,原本噪声在暗区不明显,一均衡化,噪声也被放大了。所以,我建议先滤波,再均衡化。顺序别搞反。
另外,如果图像局部光照不均(比如一边亮一边暗),全局均衡化效果不好。这时候可以用CLAHE(限制对比度自适应直方图均衡化):
# CLAHE
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
clahe_img = clahe.apply(gray)
经验之谈:在抓取场景中,如果工件表面有反光,用CLAHE比全局均衡化好得多。它能避免反光区域过曝,同时保留暗部细节。
4.4 预处理流程总结
好了,三个操作都讲完了。在实际项目中,它们的执行顺序一般是:
- 灰度化:彩色图转灰度,减少数据量
- 滤波去噪:去除噪声,保留边缘
- 直方图均衡化:增强对比度,让特征更明显
当然,这不是死规矩。有时候场景光照很好,噪声也小,均衡化可以跳过。有时候噪声特别严重,可以滤波两次。灵活处理,别死板。
下面这张图是我自己画的预处理流程,帮你理清思路:
嗯,这就是预处理的核心内容。别小看这三步,它们决定了后续所有算法的成败。我在调试视觉系统时,80%的时间都花在预处理上——参数调好了,后面的特征提取和定位就是水到渠成的事。
记住一句话:预处理做得好,抓取没烦恼。