
嗨,我已经把下面的图片和一个黄色的边框附加在一起了。Opencv中是否有任何算法或(算法序列)可以检测黄色像素并创建ROI掩码(这将屏蔽掉所有像素)。
发布于 2015-10-21 09:58:26
你可以:
找到黄色多边形
不幸的是,你用反混叠来画黄线,所以黄色不是纯黄色,而是因为插值而有一个更宽的范围。这也会影响最终的结果,因为一些不是黄色的像素将被包含在结果图像中。你可以很容易地纠正这一点,不使用反混叠。
因此,最好的选择是在HSV空间中转换图像(在HSV空间中分割单个颜色更容易),并且只将值保持在纯黄色的范围内。
如果你不使用反混叠,你甚至不需要转换到HSV和简单地保持点,其价值是纯黄色。
填充多边形的内部,您可以使用floodFill填充多边形。你需要一个起点。因为我们不知道一个点是否在多边形内(而取重中点可能不安全,因为多边形不是凸的),所以我们可以安全地假设点(0,0),即图像的左上角在多边形之外。然后,我们可以填充多边形的外部,然后反演结果。
只将多边形内部复制到黑色初始化的图像中。
一旦您有了掩码,只需使用copyTo与该掩码一起在黑色图像上复制蒙版中非零像素下的内容。
在这里,完整的代码:
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat3b img = imread("path_to_image");
// Convert to HSV color space
Mat3b hsv;
cvtColor(img, hsv, COLOR_BGR2HSV);
// Get yellow pixels
Mat1b polyMask;
inRange(hsv, Scalar(29, 220, 220), Scalar(31, 255, 255), polyMask);
// Fill outside of polygon
floodFill(polyMask, Point(0, 0), Scalar(255));
// Invert (inside of polygon filled)
polyMask = ~polyMask;
// Create a black image
Mat3b res(img.size(), Vec3b(0,0,0));
// Copy only masked part
img.copyTo(res, polyMask);
imshow("Result", res);
waitKey();
return 0;
}结果:

注意到
请注意,结果图像中几乎有黄色像素。这是由于反混叠,如上文所解释。
https://stackoverflow.com/questions/33077851
复制相似问题