在图像处理中,"掩膜"(mask)就像给图像 "戴了个面具"------ 目标物区域是透明的(白色),背景是不透明的(黑色),用来精准分离目标和背景。用 LAB 或 HSV 颜色空间提取掩膜,核心是利用这两种颜色空间对 "颜色差异" 更敏感的特点,通过调节阈值(范围)把目标颜色 "圈" 出来。
先明确两个关键概念:
- 颜色空间:把颜色拆成几个 "维度"(类似向量的维度),方便单独调节。比如 HSV 拆成 "色相(H)、饱和度(S)、明度(V)",LAB 拆成 "明度(L)、红绿(A)、黄蓝(B)"。
- 阈值调节:设定一个范围(比如 H 通道的最小值和最大值),落在这个范围内的像素保留(变白),之外的排除(变黑)。
一、HSV 颜色空间提取掩膜(适合鲜艳颜色,如红、绿、蓝)
HSV 的三个通道含义:
- H(色相):决定颜色种类(红、绿、蓝等),范围 0-180(OpenCV 中)。比如红色 H 约 0-10,绿色约 40-70,蓝色约 100-130。
- S(饱和度):颜色的 "鲜艳程度",0-255。数值越高越鲜艳(纯红),越低越灰(粉红→灰色)。
- V(明度):颜色的 "明暗程度",0-255。数值越高越亮(亮红),越低越暗(暗红→黑色)。
步骤(以提取红色苹果为例):
-
转换图像到 HSV 空间
原始图像是 RGB 格式,先通过软件(如 Photoshop)或代码(如 OpenCV)转成 HSV,方便单独看 H、S、V 通道的图像。
-
观察目标在 H 通道的范围
单独显示 H 通道图像:红色苹果在 H 通道中会是亮斑(因为 H 值在 0-10),背景(如绿色叶子、灰色桌面)是暗的。
→ 初步确定 H 的大致范围:比如 min_H=0,max_H=15(包含红色)。
-
调节 H 通道阈值,过滤非目标颜色
- 用 "阈值工具" 设置 H 的最小值(min_H)和最大值(max_H):
- 若调大 min_H(比如从 0→5):会排除 H<5 的红色(比如最浅的红),苹果边缘可能被切掉一小块。
- 若调小 max_H(比如从 15→10):会排除 H>10 的红色(比如偏橙的红),苹果可能少一块。
- 若范围太窄(如 0-5):苹果大部分会被排除,掩膜上只剩一小部分红色。
- 若范围太宽(如 0-30):会包含橙色(H=15-30),掩膜上可能混入橙色物体(如橘子)。
→ 目标:让 H 通道的掩膜中,苹果区域尽量完整,背景(叶子、桌面)尽量少。
- 用 "阈值工具" 设置 H 的最小值(min_H)和最大值(max_H):
-
用 S 通道排除 "灰色 / 白色" 干扰
红色苹果的 S 值较高(鲜艳),而灰色桌面 S 值低(接近 0)。
- 单独看 S 通道:苹果是亮的(高 S),桌面是暗的(低 S)。
- 设置 S 的阈值:比如 min_S=50(排除 S<50 的灰色),max_S=255(保留所有鲜艳的红)。
- 若调大 min_S(如 50→80):会排除较浅的红(如粉红,S=60),苹果可能变 "瘦"。
- 若调小 min_S(如 50→20):会包含更多灰色(如浅灰桌面),掩膜混入背景。
-
用 V 通道排除 "过亮 / 过暗" 干扰
苹果亮度适中(V 不会太极端),但可能有强光(V 接近 255)或阴影(V 接近 0)。
- 单独看 V 通道:苹果是中等亮度(亮),强光 / 阴影是极亮 / 极暗(暗)。
- 设置 V 的阈值:比如 min_V=30(排除过暗的阴影),max_V=220(排除过亮的反光)。
- 若调大 min_V(如 30→50):会排除苹果上较暗的部分(如底部阴影),苹果可能缺一块。
- 若调小 max_V(如 220→200):会排除苹果上的高光(如反光点),掩膜上苹果的亮斑会消失。
-
合并三个通道的阈值,得到最终掩膜
只有同时满足 H、S、V 范围的像素,才会在掩膜上显示为白色(目标),其他为黑色(背景)。
→ 反复微调三个通道的范围,直到掩膜中目标完整、背景干净。
二、LAB 颜色空间提取掩膜(适合光照变化大的场景,如明暗不均的目标)
LAB 的三个通道含义:
- L(明度):只反映明暗,和颜色无关(0-255,0 是黑,255 是白)。
- A(红绿):正值偏红,负值偏绿(范围 - 128 到 127)。
- B(黄蓝):正值偏黄,负值偏蓝(范围 - 128 到 127)。
步骤(以提取蓝色玩具为例):
蓝色在 LAB 中特点:A 通道接近 0(不红不绿),B 通道为负值(偏蓝),L 通道中等(不太亮不太暗)。
-
转换图像到 LAB 空间
同样先把 RGB 图转成 LAB,分离出 L、A、B 三个通道。
-
用 B 通道锁定蓝色范围
单独看 B 通道:蓝色玩具是亮斑(因为 B 为负值,在图像中可能显示为亮),红色 / 黄色物体是暗的(B 正值)。
- 设置 B 的阈值:比如 min_B=-100(更蓝),max_B=-20(不太蓝)。
- 若调大 min_B(如 - 100→-50):会排除更蓝的部分(比如深蓝),玩具边缘可能被切掉。
- 若调小 max_B(如 - 20→-60):会排除偏浅的蓝(比如浅蓝),玩具可能少一块。
- 范围太窄:蓝色玩具被截成碎片;范围太宽:会包含紫色(B 接近 - 20,A 偏红)。
- 设置 B 的阈值:比如 min_B=-100(更蓝),max_B=-20(不太蓝)。
-
用 A 通道排除 "红 / 绿" 干扰
蓝色玩具的 A 值接近 0(不红不绿),而红色物体 A 为正,绿色物体 A 为负。
- 设置 A 的阈值:比如 min_A=-30(不太绿),max_A=30(不太红)。
- 若调大 min_A(如 - 30→0):会排除偏绿的蓝(如蓝绿色),玩具可能少一块。
- 若调小 max_A(如 30→0):会排除偏红的蓝(如蓝紫色),可能过滤掉玩具上的紫色条纹。
- 设置 A 的阈值:比如 min_A=-30(不太绿),max_A=30(不太红)。
-
用 L 通道排除 "过亮 / 过暗" 干扰
蓝色玩具 L 值中等,而阴影 L 低,强光 L 高。
- 设置 L 的阈值:比如 min_L=40(排除过暗阴影),max_L=200(排除过亮反光)。
- 调大 min_L:排除玩具的暗部;调小 max_L:排除玩具的高光。
- 设置 L 的阈值:比如 min_L=40(排除过暗阴影),max_L=200(排除过亮反光)。
-
合并三个通道的阈值,得到掩膜
同时满足 L、A、B 范围的像素为白色(目标),其他为黑色(背景)。
关键规律:阈值调节的 "因果关系"
- 调大某个通道的最小值(min):会 "切掉" 该通道中数值比新 min 小的像素→掩膜中目标可能变小(排除了更 "极端" 的目标部分)。
- 调小某个通道的最大值(max):会 "切掉" 该通道中数值比新 max 大的像素→掩膜中目标可能变小(排除了另一方向的极端部分)。
- 扩大范围(min 减小 + max 增大):掩膜会包含更多像素(可能更完整),但容易混入背景噪声。
- 缩小范围(min 增大 + max 减小):掩膜更 "干净"(排除噪声),但可能切掉目标的边缘或细节。
总结
- HSV:适合提取颜色鲜艳、光照稳定的目标(如交通灯、彩色标记),调节 H 锁定颜色,S 排除灰色,V 排除明暗干扰。
- LAB:适合光照不均的场景(如逆光的目标),L 通道单独控制明暗,A/B 精准区分红绿 / 黄蓝,抗光照干扰更强。
实际操作时,建议用工具(如 OpenCV 的inRange
函数、Photoshop 的颜色范围工具)实时预览调节效果,边调边看掩膜变化,直到目标 "完整且干净" 为止~