Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv检测边界和ROI掩模_Opencv_Image Processing - Fatal编程技术网

Opencv检测边界和ROI掩模

Opencv检测边界和ROI掩模,opencv,image-processing,Opencv,Image Processing,您好,我已经附上了一个黄色边框下面的图像。Opencv中是否有任何算法或(一系列算法)可用于检测黄色像素并创建ROI掩码(可屏蔽其外部的所有像素)。您可以执行以下操作: 找到黄色多边形 填充多边形的内部 仅将多边形内部复制到黑色初始化图像 找到黄色多边形 不幸的是,您使用了抗锯齿来绘制黄线,因此黄色不是纯黄色,而是由于插值而具有更宽的范围。这也会影响最终结果,因为一些非黄色像素将包含在结果图像中。您可以通过不使用抗锯齿来轻松更正此问题 因此,最好的选择是在HSV空间中转换图像(在HSV空间中更容

您好,我已经附上了一个黄色边框下面的图像。Opencv中是否有任何算法或(一系列算法)可用于检测黄色像素并创建ROI掩码(可屏蔽其外部的所有像素)。

您可以执行以下操作:

  • 找到黄色多边形
  • 填充多边形的内部
  • 仅将多边形内部复制到黑色初始化图像
  • 找到黄色多边形

    不幸的是,您使用了抗锯齿来绘制黄线,因此黄色不是纯黄色,而是由于插值而具有更宽的范围。这也会影响最终结果,因为一些非黄色像素将包含在结果图像中。您可以通过不使用抗锯齿来轻松更正此问题

    因此,最好的选择是在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;
    }
    
    #包括
    使用名称空间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]范围内