1.3 色彩模型与颜色空间


1.3 色彩模型与颜色空间

本节摘要:SOURCE 1.3:RGB 适合显示,HSV 把色调 H 与亮度 V 分离,便于用 inRange 做颜色分割。本节动手:RGB↔HSV、YCrCb 肤色检测入门。

你能学到什么

  1. 说明加色 RGB 与 HSV 各通道含义
  2. cv2.cvtColor 完成 BGR2HSV
  3. 用 H 通道阈值分割指定颜色物体

一、RGB 与 HSV

  • RGB:红绿蓝加色,设备显示
  • HSV:H∈[0,180)(OpenCV 缩放),S 饱和度,V 明度 — 光照变化主要动 V,H 相对稳定
import cv2 import numpy as np img = cv2.imread('fruit.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 红色在 OpenCV H 两端:0-10 与 170-180 lower = np.array([0, 100, 100]) upper = np.array([10, 255, 255]) mask = cv2.inRange(hsv, lower, upper) result = cv2.bitwise_and(img, img, mask=mask)

二、其他空间(SOURCE 1.3.2)

空间 用途
YCrCb JPEG、肤色检测 Cr/Cb
Lab 感知均匀,色差
Gray 单通道算法输入

颜色空间选用

颜色空间选用

颜色空间选用

三、应用:简单跟踪

对红色标记物,固定 H 范围 + 形态学开运算去噪 → 质心跟踪。光照变化大时加 S 下限或自适应 V。

四、实验验收

  1. 同图 RGB 与 HSV 各存一张,观察 H 通道
  2. 调整 inRange 使误分割最少(目视)
  3. 转 YCrCb,显示 Cr 通道对比肤色区域

⚠️ 常见坑:H 范围用 0–360 而非 OpenCV 的 0–180 — 阈值全错。

💡 关键直觉分割前选颜色空间 — 比直接在 B 通道阈值稳。

核心回顾

  • HSV 适合颜色分割;OpenCV H 半圈 0–180
  • inRange + bitwise_and 是经典抠图套路
  • YCrCb/Lab 用于特定工业场景
  • 显示仍用 BGR

第 2 章在同一图像上做去噪与直方图增强。

颜色空间的本质:把颜色拆成不同维度

RGB 是加色模型,面向显示设备,三个通道强相关——改变亮度时 R、G、B 一起变,这给"按颜色找目标"带来麻烦。HSV 把颜色拆成色调 H(什么颜色)、饱和度 S(颜色浓淡)、明度 V(亮暗)三个相对独立的维度,光照变化主要影响 V,而 H 相对稳定,所以用 H 做颜色分割比直接在 RGB 上设阈值稳得多。OpenCV 里 H 的范围被压缩到 0-180 而不是 0-360(为了存进 uint8),这是初学者最常踩的坑——用 0-360 的直觉去设阈值,结果全错。

# HSV 分割的完整套路 import cv2, numpy as np img = cv2.imread('fruit.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) lower = np.array([35, 40, 40]) # 绿色下界 upper = np.array([85, 255, 255]) # 绿色上界 mask = cv2.inRange(hsv, lower, upper) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((3,3), np.uint8)) result = cv2.bitwise_and(img, img, mask=mask)

YCrCb、Lab 与工业选型

YCrCb 把亮度 Y 和两个色差分量 Cr、Cb 分开,JPEG 压缩和肤色检测都用它——肤色在 Cr-Cb 平面上聚集在特定区域,用两个范围即可圈出。Lab 是感知均匀空间,两颜色的欧氏距离近似等于人眼感知的色差大小,适合做色差检测(纺织、印刷行业的色差仪)。实际选型的经验:颜色分割优先试 HSV;肤色检测用 YCrCb;要求色差可量化的场景用 Lab;只需要灰度边缘的,直接用灰度图即可,不必引入彩色空间。

应用:光照变化下的鲁棒分割

颜色分割在真实场景最大的敌人是光照。同一个红色物体,强光下 V 高、阴影下 V 低,S 也可能变化。对策有三种:H 范围放宽同时给 S 和 V 设下限(排除灰暗和过曝区域);先做光照归一化(如灰度均衡)再分割;在 H-S 平面上聚类而不是设死矩形框。跟踪红色标记物这类应用里,通常还要把 mask 的质心作为目标位置,配合形态学开闭去噪,才能得到稳定的跟踪点。

理解色彩空间转换的本质是"对同一张图像做可逆的线性或非线性变换,不增加信息量,只改变信息的组织方式"。HSV、YCrCb、Lab 与 RGB 表达的是同一份像素数据,选择哪个空间取决于你要提取的特征在哪个空间里最容易分离。带着这个视角去选颜色空间,而不是背函数名,才是本节真正的收获。

最后留一个实操建议:分割参数(H/S/V 的上下界)不要凭空猜,用图像编辑软件或滑动条工具在样本图上交互式调出来,再固化到代码里。真实光照下的颜色边界往往不是规则矩形,先用滑动条摸清边界形状,再决定用矩形范围还是更灵活的分割策略。

补一个工程细节:cvtColor 的转换矩阵参数(如 COLOR_BGR2HSV、COLOR_BGR2YCrCb)必须与输入数据的通道顺序严格匹配。OpenCV 读出的图是 BGR,若你在代码里把图像重新排列成 RGB 再转 HSV,结果会完全不同。常见的做法是全程保持 BGR 直到显示那一刻才转 RGB,避免在代码各处混用两套通道顺序导致颜色错乱。对视频流做颜色分割时,把 cvtColor 放在每一帧的固定位置,并且只对感兴趣区域裁剪后再转换,能省下大量不必要的计算。

最后把本节的知识点收拢成一条记忆链:RGB 面向显示但通道相关,HSV 拆出稳定的色调 H 适合颜色分割,YCrCb 适合肤色与压缩,Lab 适合色差度量。选颜色空间的唯一标准是"你要提取的特征在哪个空间里最易分离",而不是哪个空间更流行。把这句记牢,你就掌握了色彩空间章节的全部精华。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U