图像处理基础(上):图像读取与显示
各位同学,欢迎来到《自动驾驶感知系统从零搭建指南》的第一章。我是你们的老朋友,一个在感知领域摸爬滚打多年的工程师。
说实话,图像处理是整个感知系统的地基。地基不牢,后面什么目标检测、车道线识别都是空中楼阁。今天咱们就从最基础的开始——怎么把一张图片读进来,怎么显示它,以及怎么在颜色空间里玩点花样。
1. OpenCV 基础:图像读取与显示
OpenCV 是计算机视觉界的“瑞士军刀”。我个人的习惯是,不管项目用什么框架,底层图像操作一定离不开它。
先看一个最简单的例子:
import cv2
# 读取图像
img = cv2.imread('road.jpg')
# 显示图像
cv2.imshow('Road Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
嗯,就这么几行代码,一张图片就出来了。但这里有个坑——imread 默认读取的是 BGR 格式,不是我们熟悉的 RGB。这一点我当年刚入行时就吃过亏。
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)
灰度图像就简单了,每个像素只有一个亮度值。很多算法第一步就是把彩色图转成灰度,因为计算量小很多。
3. 图像滤波:高斯滤波与中值滤波
滤波,说白了就是去噪。传感器采集的图像不可能完美,总有些噪点。滤波就是把这些噪点抹掉。
3.1 高斯滤波
高斯滤波用的是加权平均。离中心越近的像素,权重越大。这符合自然规律——你想想看,一个像素跟它邻居的关系,肯定是越近越像。
# 高斯滤波
blurred = cv2.GaussianBlur(img, (5, 5), 1.5)
参数说明:
(5, 5):卷积核大小,必须是奇数1.5:标准差,控制模糊程度
我记得有一次做车道线检测,图像噪点太多,边缘检测结果惨不忍睹。加了个高斯滤波后,效果立竿见影。
3.2 中值滤波
中值滤波就更有意思了。它不是算平均,而是取邻域内所有像素的中位数。
# 中值滤波
median = cv2.medianBlur(img, 5)
中值滤波对椒盐噪声(就是那种黑白点)特别有效。我曾经处理过一批摄像头数据,因为传输问题,图像上全是白点。高斯滤波搞不定,中值滤波一上,干净了。
| 滤波类型 | 适用场景 | 缺点 |
|---|---|---|
| 高斯滤波 | 高斯噪声、一般平滑 | 模糊边缘 |
| 中值滤波 | 椒盐噪声 | 计算量大 |
小结
今天咱们聊了图像读取、颜色空间转换和滤波。这些都是感知系统的基础操作。说白了,就是让计算机“看懂”图像的第一步。
下一章,我们会深入图像预处理的其他技术,比如边缘检测和形态学操作。到时候你会发现,今天的这些基础,就像搭积木一样,一块一块拼出完整的感知系统。
嗯,今天就到这里。有什么问题,欢迎交流。
公众号:蓝海资料掘金营,微信 deep3321