Matlab 到 OpenCV:值在范围内的像素掩码
Matlab to OpenCV: mask of pixels with value inside a range
我有这个 Matlab 代码可以找到像素的掩码 (skin
),其值在我的 HSV 图像的 H 和 S 通道范围内 hsv_im
:
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];
但我没能做到剩下的。
我假设您的 imageHSV
的值在 [0,1]
范围内,否则您只需更改范围值即可。这是因为在 Matlab 中图像通常在 [0,1] 范围内,而在 OpenCV 中在 [0,255].
范围内
实际上对于 HSV 图像,这有点不同:
- 如果
imageHSV
的类型为 CV_8UC3
,则范围为:[0,180] 中的 H
、[0,255] 中的 S
和 V
.
- 如果
imageHSV
是CV_32FC3
类型,OpenCV的有效范围是:[0,360]中的H
,S
和V
中的[ 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 代码可以找到像素的掩码 (skin
),其值在我的 HSV 图像的 H 和 S 通道范围内 hsv_im
:
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];
但我没能做到剩下的。
我假设您的 imageHSV
的值在 [0,1]
范围内,否则您只需更改范围值即可。这是因为在 Matlab 中图像通常在 [0,1] 范围内,而在 OpenCV 中在 [0,255].
实际上对于 HSV 图像,这有点不同:
- 如果
imageHSV
的类型为CV_8UC3
,则范围为:[0,180] 中的H
、[0,255] 中的S
和V
. - 如果
imageHSV
是CV_32FC3
类型,OpenCV的有效范围是:[0,360]中的H
,S
和V
中的[ 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