第三章:图像基础与预处理
各位同学,今天我们来聊聊图像预处理。说实话,这部分内容看起来基础,但我在实际项目中踩过的坑,有一半都跟预处理有关。你想想看,一个模型再牛,喂进去的图片质量不行,那结果基本就是「垃圾进,垃圾出」。
3.1 图像读取与显示
在OpenCV里,图像读取用的是cv2.imread()。我个人习惯用cv2.IMREAD_COLOR模式,也就是默认的BGR三通道。这里有个坑——OpenCV读取的顺序是BGR,不是RGB。我第一次做项目时没注意,结果把蓝色通道当红色用了,调试了半天才发现。
import cv2
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('road.jpg', cv2.IMREAD_COLOR)
# 显示图像
cv2.imshow('Original', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
显示的时候,我建议用cv2.imshow()配合waitKey()。嗯,这里要注意:waitKey(0)表示等待按键,否则窗口一闪就没了。
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))来正确显示颜色。
3.2 色彩空间转换
色彩空间转换,说白了就是把图像从一种颜色表示方式变成另一种。最常用的就是BGR转RGB、BGR转HSV。
为什么需要HSV? 我在做车道线检测时,发现BGR空间下黄色车道线很容易被阴影干扰。换成HSV后,只用H(色调)和S(饱和度)两个通道就能稳定提取。说白了,HSV把颜色和亮度分开了,抗干扰能力更强。
# BGR转RGB
rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# BGR转HSV
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 提取黄色区域(HSV范围)
lower_yellow = np.array([20, 100, 100])
upper_yellow = np.array([30, 255, 255])
mask = cv2.inRange(hsv_img, lower_yellow, upper_yellow)
3.3 图像滤波与去噪
图像滤波,说白了就是「磨皮」。传感器采集的图像总有噪声,比如椒盐噪声、高斯噪声。我常用的滤波方法有三种:
| 滤波方法 | 适用场景 | 缺点 |
|---|---|---|
| 均值滤波 | 简单平滑,速度快 | 边缘模糊严重 |
| 高斯滤波 | 去除高斯噪声,保留边缘 | 计算量稍大 |
| 中值滤波 | 去除椒盐噪声,效果极佳 | 对高斯噪声效果一般 |
# 均值滤波
blur = cv2.blur(img, (5, 5))
# 高斯滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 1.5)
# 中值滤波
median = cv2.medianBlur(img, 5)
你想想看,如果图像里有椒盐噪声(黑白点),用均值滤波会把噪声扩散到周围像素。而中值滤波直接取邻域中值,噪声点就被剔除了。我在做交通标志识别时,就靠中值滤波把雨天的噪点去得干干净净。
3.4 直方图均衡化
直方图均衡化,说白了就是把图像的对比度拉开。比如一张雾蒙蒙的图片,直方图都挤在中间区域。均衡化后,像素分布更均匀,细节就出来了。
# 灰度图直方图均衡化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
equalized = cv2.equalizeHist(gray)
# 彩色图直方图均衡化(转HSV后只对V通道做)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hsv[:,:,2] = cv2.equalizeHist(hsv[:,:,2])
result = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
这里有个细节:彩色图不能直接对三个通道分别均衡化,那样颜色会乱掉。我建议转成HSV,只对亮度通道V做均衡化。这样既提升了对比度,又保持了颜色不变。
3.5 知识体系总览
下面这张图总结了本章的核心逻辑,你可以把它当作预处理流程的「导航图」:
这张图展示了预处理的标准流程:读取 → 色彩转换 → 滤波 → 均衡化。实际项目中,你可以根据需求跳过某些步骤。比如图像已经很清晰,滤波这步就可以省掉。
3.6 实战建议
- 先看直方图:我每次拿到新数据集,第一件事就是看灰度直方图。如果直方图集中在低灰度区,说明图像偏暗,需要均衡化。
- 滤波顺序:先滤波再均衡化。如果先均衡化,噪声会被放大,滤波效果会打折扣。
- 保存中间结果:预处理每个步骤都保存一张图,方便排查问题。我曾经因为滤波参数设错了,导致后续检测全失败,还好有中间结果可以对比。
好了,图像预处理的内容就这些。记住,这些操作在OpenCV里都是几行代码的事,但参数调优需要你根据实际数据反复试。多动手,多观察,慢慢就有感觉了。
可可精品资料库