cv2.inRange()函数是否必须采用HSV颜色空间?
cv2.inRange颜色空间使用问题解答
cv2.inRange 本身没有强制要求必须使用HSV颜色空间,传入RGB/BGR、灰度图、LAB等任意颜色空间的图像都可以正常运行,只要满足输入图像、下界参数、上界参数三者的颜色空间、通道顺序、数值范围完全匹配即可。
你的实测为什么是对的
你现在的调用是:
mask = cv2.inRange(quantized_img, color, color)
只要你传入的quantized_img是RGB格式,同时color参数是对应通道顺序、同数值范围的RGB三元组,函数的逐像素区间判断逻辑就会正常执行,输出的掩码结果是正确的,你的实测结果符合函数的设计逻辑。
为什么绝大多数示例都用HSV
大家优先选HSV做颜色分割,和cv2.inRange本身的限制无关,是颜色空间的特性决定的:
- OpenCV默认读取的彩色图像是BGR通道顺序,新手如果直接按日常认知的RGB数值传阈值,很容易出现通道不匹配的问题,调参难度很高
- RGB/BGR空间的三个通道都和亮度强相关,当场景光照变化时,同一种颜色的像素三个通道数值波动极大,很难设定通用的阈值范围。而HSV空间把色相(H)、饱和度(S)、明度(V)拆分,提取固定颜色时只需要限定H通道的小范围,S、V通道可以设很宽的范围适配不同光照,颜色分割的效果更稳定,所以绝大多数面向颜色提取的教程示例都会选择转HSV后再调用
cv2.inRange。
你当前用法的注意事项
你现在把上下界都设为同一个color,属于精确像素值匹配,这种用法仅适合你已经做过色彩量化、颜色总数极少的quantized_img。如果是普通未量化的原图,同一种颜色的像素值本身有波动,这种精确匹配基本无法拿到可用的掩码。
不管使用哪种颜色空间,都要注意参数格式匹配:
- 用OpenCV默认的BGR图时,
color需要是BGR顺序的三元组 - 用自行转换的RGB图时,
color需要对应换成RGB顺序的三元组 - 用HSV时注意8位图像素的H通道取值范围是0179,不要直接用设计软件里0360的色相值传入
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

