【opencv-Python学习笔记(3):色彩空间类型及其转换】
1. 熟悉常见的色彩空间,熟悉转换函数
1.常见的色彩空间
## RGB(三通道)
基于三原色(红、绿、蓝)混合形成所有颜色,每个通道用0-255的数值表示强度(uint8类型)。
RGB:通道顺序为“红(R)→绿(G)→蓝(B)”(如电脑屏幕、图像编辑软件默认格式)。
BGR:通道顺序为“蓝(B)→绿(G)→红(R)”(**OpenCV的默认格式**,读取图像时自动按此顺序存储)。
注意事项:
OpenCV的`imread()`函数读取图像后,默认是BGR格式,而非日常认知的RGB。若需用其他库(如Matplotlib)显示,需先转换为RGB,否则颜色会失真(比如红色会显示为蓝色)。
##Grayscale(灰度,单通道)
使用场景: 预处理步骤(如人脸识别、文字识别)、边缘检测(如Canny算法)、需要简化计算的场景。
## HSV(三通道)
- H(色相):表示颜色种类(如红、绿、蓝),范围0-179(OpenCV定义,对应实际0-360°,需注意与其他软件的差异)。
- S(饱和度):表示颜色的鲜艳程度(0为灰色,255为纯色),范围0-255。
- V(明度):表示颜色的明亮程度(0为黑,255为最亮),范围0-255。 (H)”和“亮度(V)”,对光照变化的鲁棒性更强。例如,同一物体在不同光照下,V可能变化很大,但H基本稳定,因此比RGB更适合**颜色检测
优势: 分离了“颜色(H)”和“亮度(V)”,对光照变化的鲁棒性更强。例如,同一物体在不同光照下,V可能变化很大,但H基本稳定,因此比RGB更适合**颜色检测
2. 转换函数
函数:cv2.cvtColor(src, code)
- src:输入图像(需为numpy数组)。
- code:转换码(指定从哪种空间转换到哪种空间)。
转换场景 转换码(OpenCV) 说明 BGR → RGB cv2.COLOR_BGR2RGB
解决 OpenCV 与显示库的格式冲突 BGR → Grayscale cv2.COLOR_BGR2GRAY
转为灰度图 BGR → HSV cv2.COLOR_BGR2HSV
用于颜色检测 BGR → YCrCb cv2.COLOR_BGR2YCrCb
用于图像压缩或肤色检测 HSV → BGR cv2.COLOR_HSV2BGR
HSV 结果转回 BGR 以便显示 例子:
import cv2 import matplotlib.pyplot as plt# 读取图像(默认BGR格式) img_bgr = cv2.imread("test.jpg")# 1. BGR转RGB(用于Matplotlib显示) img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)# 2. BGR转灰度图 img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)# 3. BGR转HSV img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)# 显示结果 plt.subplot(221), plt.imshow(img_bgr), plt.title("BGR") # 颜色失真(因Matplotlib默认RGB) plt.subplot(222), plt.imshow(img_rgb), plt.title("RGB") plt.subplot(223), plt.imshow(img_gray, cmap="gray"), plt.title("Grayscale") plt.subplot(224), plt.imshow(img_hsv), plt.title("HSV") plt.show()
注意事项:
- HSV 范围差异:OpenCV 中 H 的范围是 0-179(对应实际 0-360°),若从其他工具(如 Photoshop)获取 HSV 阈值,需将 H 值除以 2(例如 PS 中的 H=60,对应 OpenCV 中 H=30)。
- 数据类型:转换后图像仍为 uint8 类型(0-255),若需更高精度,可先转为 float32 类型。
- 通道顺序:始终牢记 OpenCV 的默认是 BGR,避免在显示或与其他库交互时出现颜色错误。
不同色彩空间适用于不同场景:
- 显示 / 基础处理用BGR/RGB;
- 简化计算用Grayscale;
- 颜色检测用HSV;
- 图像压缩用YCrCb。