contribute上次修改:2026-09-29

2.1 颜色空间与通道

总目录:1.1 OpenCV介绍与学习路线 | 第二章:基础图像处理 | 编号:2.1

← 上一节:1.5 NumPy与图像数组 | 下一节:2.2 缩放裁剪与拼接 →


2.1 颜色空间与通道

同一张图可以换一种方式描述。RGB 关心红绿蓝混了多少,HSV 更像人说的“什么颜色、颜色多纯、亮不亮”,灰度图则只保留明暗。

一、通道是什么

三通道彩色图可以看成三张灰度图叠在一起,每张记录一种颜色分量:

2.1-image-007
blue, green, red = cv2.split(image)
merged = cv2.merge([blue, green, red])

split 容易读懂,但需要分配多个数组。只取一个通道时,NumPy 切片更直接:

blue = image[:, :, 0]

二、BGR 与 RGB

OpenCV 默认彩色顺序是 BGR:

blue_pixel = (255, 0, 0)
red_pixel = (0, 0, 255)

Matplotlib、Pillow 和很多深度学习接口更常使用 RGB。直接把 BGR 交给它们,红蓝会交换:

rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)

三、灰度图:只留下亮度

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

灰度图只有一个通道,常用于:

  • 阈值分割;
  • Canny 边缘检测;
  • 轮廓前的预处理;
  • 不需要颜色的计算。

它不是简单把 B、G、R 三个数求平均,而是按人眼对不同颜色亮度的敏感程度加权。

四、HSV:把颜色种类和明暗拆开

HSV 的三个通道:

通道 英文 直观含义
H Hue 色相,大概回答“是什么颜色”
S Saturation 饱和度,颜色纯不纯
V Value 明度,亮不亮
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

对 8 位图像,OpenCV 常用范围是:

H:0~179
S:0~255
V:0~255

H 只有 0~179,是因为 OpenCV 用 8 位整数把 0~360° 色相缩放了一半。

颜色检测喜欢 HSV,是因为调亮度时主要影响 V,不会像直接在 BGR 三个方向里那样难描述。详细实践见 2.7 HSV颜色检测。

五、cvtColor:颜色空间转换

常用写法:

gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)
bgr_again = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

不要把 HSV 直接当普通彩色图看

cv2.imshow("HSV raw", hsv)

这样显示的是 H、S、V 三个数被窗口当作 B、G、R 解释后的伪颜色,不能凭肉眼把它当“真实 HSV 效果”。通常应拆通道观察,或转换回 BGR。

什么时候选哪一种

要正常显示、绘图        → BGR
要交给 RGB 接口         → RGB
只关心亮暗、边缘、形状  → 灰度
要按颜色范围分割        → HSV

← 上一节:1.5 NumPy与图像数组 | 下一节:2.2 缩放裁剪与拼接 →

留言区

不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。