算法函数:Cv2.InRange
定义
void InRange(Mat src, Scalar lowerb, Scalar upperb, Mat dst);
参数详解
- src:输入图像
- 推荐空间:转为 HSV 后再提取,稳定性最强
- lowerb:颜色下限
- 取值范围:HSV H:0~179,S:0~255,V:0~255
- upperb:颜色上限
- 取值范围:同 lowerb
- dst:输出掩码
- 规则:白色 = 匹配区域,黑色 = 背景
lowerb 和 upperb 参数是用于定义颜色范围的边界值。这些参数是 HSV 颜色空间的值,其中:
- 第一个参数 (H - 色相):
- 范围:0-179(OpenCV 中的范围)
- 作用:定义颜色的基本类型(如红色、绿色、蓝色等)
- 示例:
- 0-10:红色范围
- 35-85:绿色范围
- 100-130:蓝色范围
- 第二个参数 (S - 饱和度):
- 范围:0-255
- 作用:定义颜色的纯度
- 示例:
- 低值(如 50):颜色较淡、较灰
- 高值(如 255):颜色鲜艳、纯度高
- 第三个参数 (V - 亮度/明度):
- 范围:0-255
- 作用:定义颜色的明亮程度
- 示例:
- 低值(如 50):颜色较暗
- 高值(如 255):颜色明亮
// 定义颜色范围(示例:提取红色)
Scalar lower = new Scalar(0, 50, 50); // HSV下限
Scalar upper = new Scalar(10, 255, 255); // HSV上限
这个例子中:
- H 范围:0-10(红色范围)
- S 范围:50-255(从较饱和到完全饱和)
- V 范围:50-255(从中等到最亮)
这些值被用于 Cv2.InRange 函数,它会创建一个掩码,标记图像中所有在指定 HSV 范围内的像素。然后使用 Cv2.BitwiseAnd 应用这个掩码,只保留目标颜色的像素。
建议根据您的具体需求调整这些值:
- 如果要提取特定颜色,需要调整 H 值
- 如果要控制颜色的纯度,调整 S 值
- 如果要控制颜色的亮度,调整 V 值
具体颜色范围的参考值
// 红色
HMin = 0; HMax = 10;
SMin = 120; SMax = 255;
VMin = 70; VMax = 255;
// 绿色
HMin = 35; HMax = 85;
SMin = 120; SMax = 255;
VMin = 70; VMax = 255;
// 蓝色
HMin = 100; HMax = 130;
SMin = 120; SMax = 255;
VMin = 70; VMax = 255;
// 黄色
HMin = 20; HMax = 30;
SMin = 120; SMax = 255;
VMin = 70; VMax = 255;
// 紫色
HMin = 140; HMax = 160;
SMin = 120; SMax = 255;
VMin = 70; VMax = 255;
调整技巧
- 先调整H值:
- 确定基本颜色类型
- 范围可以适当放宽(±10-20)
- 再调整S值:
- 根据目标颜色的饱和度调整
- 如果颜色较淡,降低SMin
- 如果颜色鲜艳,提高SMax
- 最后调整V值:
- 根据目标颜色的亮度调整
- 如果颜色较暗,降低VMin
- 如果颜色明亮,提高VMax
实用建议
- 使用颜色拾取器:
- 代码中已经实现了颜色拾取功能
- 点击图像中的目标颜色,自动调整HSV范围
- 渐进式调整:
- 先设置较宽的范围,再逐步精确
- 例如:H范围可以先设为±20,再缩小到±10
- 注意颜色重叠:
- 相邻颜色(如红和黄)的H值可能重叠
- 需要结合S和V值进行区分
- 处理光照变化:
- 如果光照不均匀,需要适当放宽V范围
- 可以降低VMin,提高VMax
调用示例
Cv2.InRange(hsvImg, new Scalar(0, 120, 120), new Scalar(10, 255, 255), mask);
使用场景
按颜色定位工件、颜色分拣、目标区域掩码提取。
若文章对您有帮助,可以激励一下我哦,祝您平安幸福!
| 微信 | 支付宝 |
|---|---|
![]() |
![]() |

