首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Opencv检测边界和ROI掩码

Opencv检测边界和ROI掩码
EN

Stack Overflow用户
提问于 2015-10-12 09:38:34
回答 1查看 2.2K关注 0票数 2

嗨,我已经把下面的图片和一个黄色的边框附加在一起了。Opencv中是否有任何算法或(算法序列)可以检测黄色像素并创建ROI掩码(这将屏蔽掉所有像素)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-21 09:58:26

你可以:

  1. 找到黄色多边形
  2. 填充多边形的内部
  3. 只将多边形内部复制到黑色初始化图像中。

找到黄色多边形

不幸的是,你用反混叠来画黄线,所以黄色不是纯黄色,而是因为插值而有一个更宽的范围。这也会影响最终的结果,因为一些不是黄色的像素将被包含在结果图像中。你可以很容易地纠正这一点,不使用反混叠。

因此,最好的选择是在HSV空间中转换图像(在HSV空间中分割单个颜色更容易),并且只将值保持在纯黄色的范围内。

如果你不使用反混叠,你甚至不需要转换到HSV和简单地保持点,其价值是纯黄色。

填充多边形的内部,您可以使用floodFill填充多边形。你需要一个起点。因为我们不知道一个点是否在多边形内(而取重中点可能不安全,因为多边形不是凸的),所以我们可以安全地假设点(0,0),即图像的左上角在多边形之外。然后,我们可以填充多边形的外部,然后反演结果。

只将多边形内部复制到黑色初始化的图像中。

一旦您有了掩码,只需使用copyTo与该掩码一起在黑色图像上复制蒙版中非零像素下的内容。

在这里,完整的代码:

代码语言:javascript
复制
#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;
}

结果:

注意到

请注意,结果图像中几乎有黄色像素。这是由于反混叠,如上文所解释。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33077851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档