图像处理基础(上):从像素到色彩空间
各位同学,欢迎来到车道线检测实战课的第一章。
说实话,很多初学者一上来就急着调模型、跑网络,结果连图像在计算机里长什么样都没搞明白。我当年刚入行时也犯过这个错——拿到一张图片就往上堆算法,最后发现连最基本的像素值都没读对。嗯,今天我们就从最底层开始,把图像的本质彻底讲清楚。
1. 图像的本质:像素、通道、色彩空间
先问大家一个问题:你在屏幕上看到的这张车道线图片,计算机眼里是什么?
答案很简单——一堆数字。说白了,图像就是一个二维数组,数组里的每个元素叫像素。
1.1 像素——图像的最小单元
每个像素就是一个数值。对于灰度图,这个值在0到255之间,0代表纯黑,255代表纯白。彩色图呢?每个像素需要三个数值来描述,分别对应红、绿、蓝三个通道的亮度。
核心概念:图像分辨率 = 宽度像素数 × 高度像素数。比如一张1920×1080的图,就是207万多个像素点。
我在项目中遇到过一件事:有次处理车载摄像头数据,发现图像边缘总有奇怪的条纹。排查了半天,原来是图像采集时像素对齐出了问题。所以大家记住——像素是基础,基础不牢,地动山摇。
1.2 通道——颜色的维度
常见的图像通道类型就三种:
- 单通道(灰度图):每个像素一个值,0~255
- 三通道(RGB/BGR):每个像素三个值,分别代表红绿蓝
- 四通道(RGBA):多了一个Alpha透明度通道
这里有个坑,我必须要提醒大家:OpenCV默认用的是BGR顺序,不是RGB!我第一次用OpenCV显示图像时,发现颜色全偏了——红色变成了蓝色。你想想看,如果车道线检测中把红色标线识别成蓝色,那后果多严重?
避坑指南:OpenCV读取图像默认是BGR格式。如果你用matplotlib显示,记得先转换:cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
1.3 色彩空间——换个角度看颜色
除了RGB/BGR,工程中常用的色彩空间还有:
| 色彩空间 | 特点 | 车道线检测中的应用 |
|---|---|---|
| RGB/BGR | 最常用,硬件友好 | 原始图像输入 |
| HSV | 色调、饱和度、明度分离 | 提取特定颜色的车道线(如黄色线) |
| 灰度 | 单通道,计算量小 | 边缘检测、二值化处理 |
| LAB | 亮度与颜色分离 | 光照变化大的场景 |
我个人习惯在车道线检测中优先用HSV空间。为什么?因为黄色车道线在RGB空间里受光照影响很大,但在HSV空间里,只要设定好色调范围,就能稳定提取。我曾经在一条隧道出口做测试,RGB方法直接失效,换成HSV后稳稳的。
2. OpenCV环境搭建
工欲善其事,必先利其器。咱们先把OpenCV装好。
2.1 安装OpenCV
最推荐的方式是用pip安装:
pip install opencv-python
pip install opencv-contrib-python # 包含额外模块
小技巧:建议用国内镜像源加速,比如:pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 验证安装
打开Python终端,输入:
import cv2
print(cv2.__version__) # 我目前用的是4.8.0
如果输出版本号,恭喜你,环境搭好了。
注意:不同版本的OpenCV在某些函数上可能有差异。我建议统一用4.x版本,比较稳定。
3. 图像的读取与显示
好了,现在我们来写第一段代码。这段代码虽然简单,但它是所有图像处理的起点。
3.1 读取图像
import cv2
# 读取图像
img = cv2.imread('road.jpg')
# 检查是否读取成功
if img is None:
print("图片没找到,检查路径!")
else:
print(f"图像尺寸:{img.shape}") # (高度, 宽度, 通道数)
img.shape返回三个值:高、宽、通道数。比如(720, 1280, 3)表示720行、1280列、3通道(BGR)。
3.2 显示图像
cv2.imshow('Lane Detection', img)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows()
这里waitKey(0)的意思是无限等待,直到你按下任意键。如果你想让窗口自动关闭,可以设置等待时间,比如waitKey(3000)就是等3秒。
经验之谈:我在调试车道线算法时,经常用imshow实时查看中间结果。但注意,在自动驾驶实车测试中,频繁显示图像会拖慢处理速度。所以开发阶段用imshow,部署阶段一定要关掉。
3.3 保存图像
cv2.imwrite('output.jpg', img)
就这么一行。支持jpg、png等常见格式。
4. 本章知识体系
为了让大家更直观地理解本章的知识结构,我画了一张图:
5. 本章小结
今天我们做了三件事:
- 搞清楚了图像的本质——像素、通道、色彩空间
- 搭好了OpenCV开发环境
- 学会了图像的读取、显示和保存
这些内容看起来基础,但非常重要。我见过太多人在后续的车道线检测中出问题,最后发现是色彩空间没搞对、通道顺序弄反了。所以,别嫌简单,把这些基础打扎实了,后面的路才好走。
好了,今天的课就到这里。记住我说的——图像就是数字,数字就是图像。下次见。