Opencv中文网

颜色提取(InRange)

算法函数:Cv2.InRange

定义

void InRange(Mat src, Scalar lowerb, Scalar upperb, Mat dst);

参数详解

  1. src:输入图像
    • 推荐空间:转为 HSV 后再提取,稳定性最强
  2. lowerb:颜色下限
    • 取值范围:HSV H:0~179,S:0~255,V:0~255
  3. upperb:颜色上限
    • 取值范围:同 lowerb
  4. dst:输出掩码
    • 规则:白色 = 匹配区域,黑色 = 背景

lowerb 和 upperb 参数是用于定义颜色范围的边界值。这些参数是 HSV 颜色空间的值,其中:

  1. 第一个参数 (H - 色相)
    • 范围:0-179(OpenCV 中的范围)
    • 作用:定义颜色的基本类型(如红色、绿色、蓝色等)
    • 示例:
      • 0-10:红色范围
      • 35-85:绿色范围
      • 100-130:蓝色范围
  2. 第二个参数 (S - 饱和度)
    • 范围:0-255
    • 作用:定义颜色的纯度
    • 示例:
      • 低值(如 50):颜色较淡、较灰
      • 高值(如 255):颜色鲜艳、纯度高
  3. 第三个参数 (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 应用这个掩码,只保留目标颜色的像素。

建议根据您的具体需求调整这些值:

  1. 如果要提取特定颜色,需要调整 H 值
  2. 如果要控制颜色的纯度,调整 S 值
  3. 如果要控制颜色的亮度,调整 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;

调整技巧

  1. 先调整H值
    • 确定基本颜色类型
    • 范围可以适当放宽(±10-20)
  2. 再调整S值
    • 根据目标颜色的饱和度调整
    • 如果颜色较淡,降低SMin
    • 如果颜色鲜艳,提高SMax
  3. 最后调整V值
    • 根据目标颜色的亮度调整
    • 如果颜色较暗,降低VMin
    • 如果颜色明亮,提高VMax

实用建议

  1. 使用颜色拾取器
    • 代码中已经实现了颜色拾取功能
    • 点击图像中的目标颜色,自动调整HSV范围
  2. 渐进式调整
    • 先设置较宽的范围,再逐步精确
    • 例如:H范围可以先设为±20,再缩小到±10
  3. 注意颜色重叠
    • 相邻颜色(如红和黄)的H值可能重叠
    • 需要结合S和V值进行区分
  4. 处理光照变化
    • 如果光照不均匀,需要适当放宽V范围
    • 可以降低VMin,提高VMax

调用示例

Cv2.InRange(hsvImg, new Scalar(0, 120, 120), new Scalar(10, 255, 255), mask);

使用场景

按颜色定位工件、颜色分拣、目标区域掩码提取。

copyright @重庆教主 WPF中文网 联系站长:(QQ)23611316 (微信)movieclip (QQ群).NET小白课堂:864486030 | 本文由WPF中文网原创发布,谢绝转载 渝ICP备2023009518号-1