Opencv检测边界和ROI掩模
您好,我已经附上了一个黄色边框下面的图像。Opencv中是否有任何算法或(一系列算法)可用于检测黄色像素并创建ROI掩码(可屏蔽其外部的所有像素)。您可以执行以下操作:Opencv检测边界和ROI掩模,opencv,image-processing,Opencv,Image Processing,您好,我已经附上了一个黄色边框下面的图像。Opencv中是否有任何算法或(一系列算法)可用于检测黄色像素并创建ROI掩码(可屏蔽其外部的所有像素)。您可以执行以下操作: 找到黄色多边形 填充多边形的内部 仅将多边形内部复制到黑色初始化图像 找到黄色多边形 不幸的是,您使用了抗锯齿来绘制黄线,因此黄色不是纯黄色,而是由于插值而具有更宽的范围。这也会影响最终结果,因为一些非黄色像素将包含在结果图像中。您可以通过不使用抗锯齿来轻松更正此问题 因此,最好的选择是在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;
}
#包括
使用名称空间cv;
int main()
{
Mat3b img=imread(“路径到图像”);
//转换为HSV颜色空间
Mat3b型单纯疱疹病毒;
CVT颜色(img、hsv、彩色);
//获取黄色像素
Mat1b多膜;
范围(hsv,标量(29,220,220),标量(31,255,255),多掩模);
//多边形外部填充
泛洪填充(多边形掩模,点(0,0),标量(255));
//反转(多边形填充的内部)
polyMask=~ polyMask;
//创建一个黑色图像
Mat3b res(img.size(),Vec3b(0,0,0));
//仅复制遮罩部分
图像复制(分辨率、多分辨率);
imshow(“结果”,res);
waitKey();
返回0;
}
结果:
注释
请注意,结果图像中几乎有黄色像素。如上所述,这是由于消除混叠造成的。如果始终是黄色色调,则可以轻松使用inRange方法。然后使用findContours获得外部轮廓。之后,您可以从该轮廓绘制填充遮罩,并将遮罩应用于图像,以便仅将遮罩区域复制到新的黑色图像。您的轮廓颜色始终相同吗?它保证在图像中是唯一的(没有其他黄色背景点)?每个图像只有一个黄色轮廓,或者可以有多个?@Miki:背景中可能有黄色像素。如果我们发现这样的情况,我们可以在未来使用不同的颜色。是的,每个图像只有一个黄色轮廓。你是如何找到HSV范围内黄色值的范围的?我正在使用这个网站。我的直觉是,保持色调恒定在42度(或60度),只需调整饱和度,该值就会给出范围。但我不了解细节。黄色为HSV 60°、100%、100%,在OpenCV中编码为30255255。H通道值减半并在[0180]范围内,S和V在[0255]范围内