Matlab 到 OpenCV:值在范围内的像素掩码

Posted

技术标签:

【中文标题】Matlab 到 OpenCV:值在范围内的像素掩码【英文标题】:Matlab to OpenCV: mask of pixels with value inside a range 【发布时间】:2016-03-02 16:40:00 【问题描述】:

我有这个 Matlab 代码来查找像素的掩码 (skin),其值在我的 HSV 图像 hsv_im 的 H 和 S 通道范围内:

h_range = [0.02 0.085]; 
s_range = [0.18 .754];

H = hsv_im(:,:,1);
S = hsv_im(:,:,2);

%targets skin by only selecting values within the rectangle skin range
skin = (S>s_range(1) & S<s_range(2) & H>h_range(1) & H<h_range(2));

我需要将它移植到 OpenCV。到目前为止,我有这个:

  float h_range[2] = 0.02, 0.085;
  float s_range[2] = 0.18, 0.754;

  vector<Mat> channels;
  split(imageHSV, channels);
  Mat H = channels[0];
  Mat S = channels[1];

但我没能完成其余的工作。

【问题讨论】:

【参考方案1】:

我假设您的imageHSV 的值在[0,1] 范围内,否则您只需要更改范围值。这是因为在 Matlab 中图像通常在 [0,1] 范围内,而在 OpenCV 中,图像通常在 [0,255] 范围内。

实际上对于 HSV 图像,这有点不同:

如果 imageHSV 的类型为 CV_8UC3,则范围为:H in [0,180]、SV in [0,255]。 如果 imageHSV 的类型为 CV_32FC3,则 OpenCV 的有效范围是:H in [0,360]、SV in [0,1]。

您可以使用inRange 执行此操作。只需定义 3 个通道的上下限。注意修正 OpenCV 的 Matlab 范围:

Mat imgHSV = ... type should CV_32FC3

Mat skin;
inRange(imgHSV, Scalar(0.02, 0.18, 0), Scalar(0.085, 0.754, 1), skin);
//                      h     s    v            h      s    v
//                      lower range              upper range

// skin will be a binary mask of type CV_8UC1, with values either 0 or 255

【讨论】:

以上是关于Matlab 到 OpenCV:值在范围内的像素掩码的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV在轮廓边界内获取黑色像素

多区域掩码 OpenCV

[OpenCV实战]23 使用OpenCV获取高动态范围成像HDR

OpenCV 对矩阵进行掩码操作

将 Opencv hsv 转换为 Matlab Hsv

opencv如何读取多边形区域内的像素值?