3、图像预处理(上):灰度化、直方图均衡化、高斯滤波、中值滤波、图像增强实战
各位同学,欢迎来到图像预处理的第一讲。
说实话,在工业视觉项目里,我见过太多人一上来就扔模型、跑算法。结果呢?光照一变,或者工件上沾了点油污,整个系统就崩了。嗯,这其实不是算法不行,是图像质量没到位。
图像预处理,说白了就是给算法「喂」一张干净、好用的图。今天我们先聊五个最基础、也最常用的操作:灰度化、直方图均衡化、高斯滤波、中值滤波,最后来一个实战串讲。
3.1 灰度化:扔掉颜色,保留结构
为什么工业视觉里很少直接用彩色图?
我个人习惯是:除非检测任务明确依赖颜色(比如区分红绿导线),否则一律先转灰度。原因很简单——彩色图数据量是灰度图的3倍,但大部分边缘、纹理信息在单通道里就够用了。你想想看,一个检测螺丝有无的工位,颜色能帮上什么忙?
灰度化的本质,就是把RGB三个通道加权求和。常用的公式是:
Gray = 0.299 * R + 0.587 * G + 0.114 * B
OpenCV里一行搞定:
import cv2
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imread('image.jpg', 0) 读成灰度图,这没问题。但如果你后续要做颜色分析,记得先保留彩色副本。
3.2 直方图均衡化:让暗部细节「浮」出来
我在一个汽车零部件检测项目里遇到过这种情况:工件表面有轻微划痕,但车间灯光偏暗,肉眼都看不清。直方图均衡化就是专门解决这类问题的。
它的原理不复杂——把像素值的分布「拉伸」开。原本集中在[50, 100]区间的灰度值,会被映射到[0, 255]整个范围。对比度一下子就上来了。
OpenCV实现:
equ = cv2.equalizeHist(gray)
另外,如果图像整体偏亮或偏暗,可以试试自适应直方图均衡化(CLAHE)。它把图像分成小块分别处理,效果更自然:
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe_img = clahe.apply(gray)
3.3 高斯滤波:温柔地去除噪声
高斯滤波是我在工业场景里用得最多的滤波器。为什么?因为它「温柔」——它在去噪的同时,能较好地保留边缘。
它的核心思想很简单:用一个高斯核(权重符合高斯分布)去卷积图像。离中心像素越近的邻域像素,权重越大。
代码示例:
gaussian = cv2.GaussianBlur(gray, (5, 5), 1.5)
这里 (5, 5) 是核大小,1.5 是标准差。核越大,图像越模糊。我一般从 (3, 3) 开始试,不够再往上加。
(4, 4),OpenCV直接报错。嗯,这个坑踩过一次就不会忘了。
3.4 中值滤波:专治「椒盐噪声」
中值滤波和均值滤波、高斯滤波的思路完全不同。它不是加权平均,而是取邻域内所有像素的中位数作为新值。
这招对付椒盐噪声(黑白点噪声)特别有效。我在一个PCB焊点检测项目里,图像上全是白色噪点,高斯滤波怎么调都去不干净。换成中值滤波,一次搞定。
代码:
median = cv2.medianBlur(gray, 5)
注意,中值滤波的核大小也是奇数,而且它没有标准差参数。
| 滤波器 | 适用场景 | 缺点 |
|---|---|---|
| 高斯滤波 | 高斯噪声、通用去噪 | 可能模糊边缘 |
| 中值滤波 | 椒盐噪声、脉冲噪声 | 计算较慢,核不宜过大 |
| 均值滤波 | 简单平滑 | 严重模糊边缘,工业中少用 |
3.5 图像增强实战:一条完整的预处理流水线
好了,理论讲完,咱们来点实际的。假设你拿到一张光照不均、带点噪声的工件图,你会怎么做?
我一般按这个顺序来:
- 灰度化 —— 减少数据量
- 高斯滤波 —— 去除轻微噪声
- CLAHE —— 增强局部对比度
- 中值滤波 —— 如果还有椒盐噪声,再补一刀
完整代码示例:
import cv2
img = cv2.imread('workpiece.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 第一步:高斯滤波去噪
blurred = cv2.GaussianBlur(gray, (3, 3), 1.0)
# 第二步:CLAHE增强对比度
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
enhanced = clahe.apply(blurred)
# 第三步:中值滤波去除残留噪点
clean = cv2.medianBlur(enhanced, 3)
cv2.imshow('Original', gray)
cv2.imshow('Processed', clean)
cv2.waitKey(0)
好了,这一章的内容就到这里。灰度化、直方图均衡化、高斯滤波、中值滤波,这四个工具你掌握了,80%的工业图像预处理场景都能应付。下一章我们聊边缘检测和形态学操作,那才是真正「出活」的地方。
记住一句话:预处理做得好,后面算法跑得稳。别嫌这一步麻烦,我在产线上吃过太多亏了。