第三章:图像基础与预处理

各位同学,今天我们来聊聊图像预处理。说实话,这部分内容看起来基础,但我在实际项目中踩过的坑,有一半都跟预处理有关。你想想看,一个模型再牛,喂进去的图片质量不行,那结果基本就是「垃圾进,垃圾出」。

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)表示等待按键,否则窗口一闪就没了。

小技巧:如果你用Jupyter Notebook,可以用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)
避坑指南:我曾经在HSV阈值设定上吃过亏。不同光照条件下,同一个颜色的H值会漂移。建议在项目初期多采集不同光照的样本,统计出稳定的阈值范围。

3.3 图像滤波与去噪

图像滤波,说白了就是「磨皮」。传感器采集的图像总有噪声,比如椒盐噪声、高斯噪声。我常用的滤波方法有三种:

滤波方法 适用场景 缺点
均值滤波 简单平滑,速度快 边缘模糊严重
高斯滤波 去除高斯噪声,保留边缘 计算量稍大
中值滤波 去除椒盐噪声,效果极佳 对高斯噪声效果一般
# 均值滤波
blur = cv2.blur(img, (5, 5))

# 高斯滤波
gaussian = cv2.GaussianBlur(img, (5, 5), 1.5)

# 中值滤波
median = cv2.medianBlur(img, 5)

你想想看,如果图像里有椒盐噪声(黑白点),用均值滤波会把噪声扩散到周围像素。而中值滤波直接取邻域中值,噪声点就被剔除了。我在做交通标志识别时,就靠中值滤波把雨天的噪点去得干干净净。

核心经验:滤波核大小选奇数(3,5,7...),核越大越模糊。我一般从5x5开始试,效果不够再调大。

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做均衡化。这样既提升了对比度,又保持了颜色不变。

注意:直方图均衡化不是万能的。如果图像本身光照不均匀,均衡化后反而会放大阴影区域的噪声。我曾经在夜间监控视频上用过,结果暗部噪点全被放大了。这种情况建议用自适应直方图均衡化(CLAHE)。

3.5 知识体系总览

下面这张图总结了本章的核心逻辑,你可以把它当作预处理流程的「导航图」:

图像预处理流程 原始图像 1. 图像读取 (BGR) 2. 色彩空间转换 (RGB/HSV) 3. 滤波去噪 (均值/高斯/中值) 4. 直方图均衡化 (对比度增强)

这张图展示了预处理的标准流程:读取 → 色彩转换 → 滤波 → 均衡化。实际项目中,你可以根据需求跳过某些步骤。比如图像已经很清晰,滤波这步就可以省掉。

3.6 实战建议

  • 先看直方图:我每次拿到新数据集,第一件事就是看灰度直方图。如果直方图集中在低灰度区,说明图像偏暗,需要均衡化。
  • 滤波顺序:先滤波再均衡化。如果先均衡化,噪声会被放大,滤波效果会打折扣。
  • 保存中间结果:预处理每个步骤都保存一张图,方便排查问题。我曾经因为滤波参数设错了,导致后续检测全失败,还好有中间结果可以对比。
一句话总结:预处理做得好,模型训练事半功倍。别小看这几步,它们决定了你后续算法的上限。

好了,图像预处理的内容就这些。记住,这些操作在OpenCV里都是几行代码的事,但参数调优需要你根据实际数据反复试。多动手,多观察,慢慢就有感觉了。

可可精品资料库