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 预处理流程总结

好了,三个操作都讲完了。在实际项目中,它们的执行顺序一般是:

  1. 灰度化:彩色图转灰度,减少数据量
  2. 滤波去噪:去除噪声,保留边缘
  3. 直方图均衡化:增强对比度,让特征更明显

当然,这不是死规矩。有时候场景光照很好,噪声也小,均衡化可以跳过。有时候噪声特别严重,可以滤波两次。灵活处理,别死板。

下面这张图是我自己画的预处理流程,帮你理清思路:

图像预处理流程 原始彩色图像 灰度化 滤波去噪 直方图均衡化 注意事项 • 先滤波再均衡化 • 滤波核从3x3开始试 • 光照不均用CLAHE • 噪声大可滤波两次 • 场景好可跳过均衡化 • 边缘保留优先选高斯 • 椒盐噪声选中值滤波

嗯,这就是预处理的核心内容。别小看这三步,它们决定了后续所有算法的成败。我在调试视觉系统时,80%的时间都花在预处理上——参数调好了,后面的特征提取和定位就是水到渠成的事。

记住一句话:预处理做得好,抓取没烦恼。


专注资料整理