我有一张图片(如下所示)。我想只提取粉红色部分并删除图像的其余部分。我将粉红色的RGB值存储在一个数组中。有没有什么方法可以在图像和颜色上使用bitwise_and
,以便我可以在OpenCV中挑出所需的部分?
答案 0 :(得分:3)
Bitwise_and不是正确的方法,因为它是按位的。但OpenCv当然有一些方法可以完成这项基本任务:
如果您知道确切的值,则可以使用CmpS方法。如果要查找特定范围内的所有粉红色,请使用InRangeS方法。可选地,首先改变图像的色彩空间,例如,如果你想在HSV空间中指定你的范围。
答案 1 :(得分:3)
由于您的绿色颜色不均匀,但其范围为:
// in BGR color space
Scalar low(182, 204, 168);
Scalar high(187, 207, 172);
// in HSV color space
Scalar low(72, 43, 204);
Scalar high(72, 45, 207);
您可以使用inRange功能。您可以根据分割所需的颜色调整范围。
通常HSV色彩空间更适合基于颜色的分割任务,但在这种情况下,BGR色彩空间也足够好。
此代码显示如何获取所需颜色的二进制掩码,以及如何仅在BGR和HSV颜色空间中复制原始图像的蒙版部分。
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// Load image
Mat3b img = imread("path_to_image");
{
// BGR color space
// Setup ranges
Scalar low(182, 204, 168);
Scalar high(187, 207, 172);
// Get binary mask
Mat1b mask;
inRange(img, low, high, mask);
// Initialize result image (all black)
Mat3b res(img.rows, img.cols, Vec3b(0, 0, 0));
// Copy masked part to result image
img.copyTo(res, mask);
imshow("Mask from BGR", mask);
imshow("Result from BGR", res);
waitKey();
}
{
// HSV color space
// Convert to HSV
Mat3b hsv;
cvtColor(img, hsv, COLOR_BGR2HSV);
// Setup ranges
Scalar low(72, 43, 204);
Scalar high(72, 45, 207);
// Initialize result image (all black)
// Get binary mask
Mat1b mask;
inRange(hsv, low, high, mask);
// Initialize result image (all black)
Mat3b res(img.rows, img.cols, Vec3b(0, 0, 0));
// Copy masked part to result image
img.copyTo(res, mask);
imshow("Mask from HSV", mask);
imshow("Result from HSV", res);
waitKey();
}
return 0;
}
面具的例子:
分割图像的示例: