图像处理基础(上):图像读取与显示

各位同学,欢迎来到《自动驾驶感知系统从零搭建指南》的第一章。我是你们的老朋友,一个在感知领域摸爬滚打多年的工程师。

说实话,图像处理是整个感知系统的地基。地基不牢,后面什么目标检测、车道线识别都是空中楼阁。今天咱们就从最基础的开始——怎么把一张图片读进来,怎么显示它,以及怎么在颜色空间里玩点花样。

1. OpenCV 基础:图像读取与显示

OpenCV 是计算机视觉界的“瑞士军刀”。我个人的习惯是,不管项目用什么框架,底层图像操作一定离不开它。

先看一个最简单的例子:

import cv2

# 读取图像
img = cv2.imread('road.jpg')

# 显示图像
cv2.imshow('Road Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

嗯,就这么几行代码,一张图片就出来了。但这里有个坑——imread 默认读取的是 BGR 格式,不是我们熟悉的 RGB。这一点我当年刚入行时就吃过亏。

⚠️ 注意: OpenCV 默认使用 BGR 色彩空间。如果你用 matplotlib 显示,记得先转换:img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

为什么会这样?因为 OpenCV 诞生时,BGR 是当时相机硬件的通用格式。历史遗留问题,但咱们得适应。

读取图像时,还可以指定模式:

  • cv2.IMREAD_COLOR:彩色图像(默认)
  • cv2.IMREAD_GRAYSCALE:灰度图像
  • cv2.IMREAD_UNCHANGED:包含 alpha 通道

我在项目中遇到过一个问题:用 cv2.imread 读了一张 PNG 图片,结果发现透明背景变成了黑色。后来才意识到,需要加上 cv2.IMREAD_UNCHANGED 才能保留 alpha 通道。

2. 颜色空间转换:RGB、HSV、灰度

颜色空间转换,说白了就是把颜色用不同的方式表示。RGB 适合显示,但 HSV 更适合做图像分割。

HSV 的三个分量:

  • H(色调):颜色的种类,比如红、绿、蓝
  • S(饱和度):颜色的纯度
  • V(明度):颜色的亮度

你想想看,在自动驾驶场景里,我们要检测红色交通灯。用 RGB 的话,光照一变,红色就变了。但用 HSV,只要 H 值在红色范围内,就能稳定检测。

# BGR 转 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# BGR 转灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
💡 小技巧: 在 HSV 空间做颜色过滤时,红色的 H 值范围是 0-10 和 170-180(因为色相环是环形的)。我刚开始做交通灯检测时,只设了 0-10,结果漏掉了一半红灯。

灰度图像就简单了,每个像素只有一个亮度值。很多算法第一步就是把彩色图转成灰度,因为计算量小很多。

3. 图像滤波:高斯滤波与中值滤波

滤波,说白了就是去噪。传感器采集的图像不可能完美,总有些噪点。滤波就是把这些噪点抹掉。

3.1 高斯滤波

高斯滤波用的是加权平均。离中心越近的像素,权重越大。这符合自然规律——你想想看,一个像素跟它邻居的关系,肯定是越近越像。

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

参数说明:

  • (5, 5):卷积核大小,必须是奇数
  • 1.5:标准差,控制模糊程度

我记得有一次做车道线检测,图像噪点太多,边缘检测结果惨不忍睹。加了个高斯滤波后,效果立竿见影。

核心要点: 高斯滤波适合去除高斯噪声(比如传感器热噪声),但会模糊边缘。如果你需要保留边缘,可以考虑双边滤波。

3.2 中值滤波

中值滤波就更有意思了。它不是算平均,而是取邻域内所有像素的中位数。

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

中值滤波对椒盐噪声(就是那种黑白点)特别有效。我曾经处理过一批摄像头数据,因为传输问题,图像上全是白点。高斯滤波搞不定,中值滤波一上,干净了。

滤波类型 适用场景 缺点
高斯滤波 高斯噪声、一般平滑 模糊边缘
中值滤波 椒盐噪声 计算量大
⚠️ 避坑指南: 我曾经在实时处理系统里用了中值滤波,结果帧率直接掉了一半。后来换成高斯滤波,效果差不多,速度快多了。所以,实时系统里慎用中值滤波。

小结

今天咱们聊了图像读取、颜色空间转换和滤波。这些都是感知系统的基础操作。说白了,就是让计算机“看懂”图像的第一步。

下一章,我们会深入图像预处理的其他技术,比如边缘检测和形态学操作。到时候你会发现,今天的这些基础,就像搭积木一样,一块一块拼出完整的感知系统。

嗯,今天就到这里。有什么问题,欢迎交流。


公众号:蓝海资料掘金营,微信 deep3321