图像预处理:灰度化、直方图均衡化、高斯滤波去噪
拿到一张气泡或条纹的原始图像,别急着往上套算法。我见过太多人上来就做边缘检测,结果噪声比特征还明显。图像预处理,说白了就是给后续分析铺路。这一步做不好,后面全是白费功夫。
咱们这一章就聊三个最基础、也最实用的操作:灰度化、直方图均衡化、高斯滤波。这三板斧用好了,气泡和条纹的特征会清晰很多。
为什么非得先做灰度化?
工业相机拍出来的图,大多是彩色的。但气泡检测、条纹分析,我们真正关心的其实是亮度变化,不是颜色。彩色图有三个通道,数据量是灰度图的三倍,处理起来慢,而且颜色信息对形状分析基本没用。
我习惯用加权平均法做灰度化。公式很简单:
Gray = 0.299 * R + 0.587 * G + 0.114 * B
这个权重是依据人眼对绿光最敏感、蓝光最不敏感的特性来的。OpenCV 里直接用 cv2.cvtColor 就行:
import cv2
img = cv2.imread('bubble.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
直方图均衡化——让对比度“弹”出来
灰度化之后,你可能会发现图像灰蒙蒙的。气泡的边缘和背景拉不开,条纹的明暗变化也不明显。这时候就该直方图均衡化上场了。
它的原理很简单:把像素值的分布拉得更均匀。原本集中在某个区间的灰度值,会被拉伸到整个0-255范围。对比度一下子就上来了。
OpenCV 里用 cv2.equalizeHist:
equ = cv2.equalizeHist(gray)
但这里有个坑。我遇到过好几次,全局均衡化会把噪声也放大。尤其是气泡边缘的微弱噪声,均衡化之后变得特别扎眼。
对于气泡图,我一般先用 CLAHE(对比度受限自适应直方图均衡化)。它把图像分成小块,每块单独做均衡化,而且会限制对比度的放大倍数。效果比全局均衡化自然得多。
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe_img = clahe.apply(gray)
条纹图呢?如果条纹本身明暗变化剧烈,全局均衡化就够了。但如果是那种细密、对比度低的条纹,CLAHE 更稳妥。
高斯滤波——去噪但不伤边缘
图像预处理最后一步,也是最重要的一步:去噪。气泡图里常见的是传感器噪声,条纹图里可能是光照不均带来的高频干扰。
高斯滤波是我最常用的。它用高斯核做卷积,对每个像素做加权平均。离中心越近的像素权重越大,离得越远的权重越小。这样既能平滑噪声,又不会把边缘完全抹掉。
核心参数就一个:核大小。核越大,去噪越强,但图像也越模糊。
| 核大小 | 去噪效果 | 边缘保留 | 推荐场景 |
|---|---|---|---|
| 3×3 | 弱 | 好 | 噪声轻微的气泡图 |
| 5×5 | 中等 | 较好 | 一般工业图像 |
| 7×7 | 强 | 一般 | 噪声严重的条纹图 |
代码很简单:
blur = cv2.GaussianBlur(clahe_img, (5, 5), 0)
第二个参数是核大小,必须是奇数。第三个参数是标准差,设0的话OpenCV会自动算。
三步流程——我常用的预处理管线
把上面三步串起来,就是一条完整的预处理管线。我画了张流程图,方便你理解:
实际项目中,我通常把这三步封装成一个函数:
def preprocess_image(img_path, clahe_clip=2.0, kernel_size=5):
# 1. 读取并灰度化
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2. CLAHE 均衡化
clahe = cv2.createCLAHE(clipLimit=clahe_clip, tileGridSize=(8,8))
enhanced = clahe.apply(gray)
# 3. 高斯滤波
blurred = cv2.GaussianBlur(enhanced, (kernel_size, kernel_size), 0)
return blurred
三种操作的对比总结
| 操作 | 作用 | 适用场景 | 常见问题 |
|---|---|---|---|
| 灰度化 | 降维,减少计算量 | 所有彩色图像 | 通道选择不当会丢失细节 |
| 直方图均衡化 | 增强对比度 | 低对比度图像 | 全局均衡可能放大噪声 |
| 高斯滤波 | 去噪,平滑图像 | 有噪声的图像 | 核太大导致边缘模糊 |
嗯,这三步做完,图像基本就准备好了。气泡的边缘会更锐利,条纹的明暗变化会更清晰。接下来就可以放心地做边缘检测、特征提取了。你想想看,如果原始图像里全是噪声和低对比度,再好的算法也白搭。预处理,就是给后面的分析打好地基。