本节摘要:SOURCE 1.3:RGB 适合显示,HSV 把色调 H 与亮度 V 分离,便于用
inRange做颜色分割。本节动手:RGB↔HSV、YCrCb 肤色检测入门。
cv2.cvtColor 完成 BGR2HSVimport 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)
| 空间 | 用途 |
|---|---|
| YCrCb | JPEG、肤色检测 Cr/Cb |
| Lab | 感知均匀,色差 |
| Gray | 单通道算法输入 |

对红色标记物,固定 H 范围 + 形态学开运算去噪 → 质心跟踪。光照变化大时加 S 下限或自适应 V。
inRange 使误分割最少(目视)⚠️ 常见坑:H 范围用 0–360 而非 OpenCV 的 0–180 — 阈值全错。
💡 关键直觉:分割前选颜色空间 — 比直接在 B 通道阈值稳。
inRange + bitwise_and 是经典抠图套路第 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 把亮度 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 适合色差度量。选颜色空间的唯一标准是"你要提取的特征在哪个空间里最易分离",而不是哪个空间更流行。把这句记牢,你就掌握了色彩空间章节的全部精华。