【问题标题】:How to detect all the connected neighboring pixels which have same color value in opencv如何在opencv中检测所有连接的具有相同颜色值的相邻像素
【发布时间】:2015-04-04 12:38:45
【问题描述】:

我应该能够输入一个像素位置并获得与其连接的所有相同颜色(在我的情况下应该是黑色)的像素。如何使用 c++ 在 opencv 中执行此操作。简单地说,输出像素应该用黑色相互连接。 FindContours() 方法不起作用,因为它无法输入像素。

【问题讨论】:

    标签: c++ opencv image-processing connected-components


    【解决方案1】:

    OpenCV 没有这样的功能,所以你必须自己实现它。一种简单的方法是在树中实现像 BFS 或 DFS 这样的搜索算法。

    som 伪代码:

    list<pixels> pixels_in_component;
    stack<pixels> neighbours;
    neighbours.add(starting_point)
    
    while not neightbours.empty:
       p = neighbours.pop();
       pixels_in_component.append(p) 
       for each adjacent pixel n of p:
         if color(n) == color(starting_point):
             neighbours.append(n)
    

    如果您使用堆栈或队列不相关,并且pixels_in_component 稍后将包含您连接的所有像素。

    或者(如果您仅限于黑色组件)您可以使用 cv::Threshold 来反转您的图像。只需使用反转二进制阈值,其中高于某个值的所有像素都映射为零,而低于阈值的像素则映射到给定值。

    如果您有 CV_8UC1 图像,您可以调用 阈值(输入,输出,1,255,THRESH_BINARY_INV);

    将黑色像素映射到 255 并将其余像素映射到零。然后你就可以运行正常的 findContours 了。

    【讨论】:

      【解决方案2】:

      你应该简单地使用floodFill

      Here你可以找到关于如何获得所有像素都连接到你的种子点的二值图像的详细说明。

      【讨论】:

      • 谢谢。通过简单的填充方法(第一种变体),我们只能更改连接组件的颜色。这不会返回连接了哪些像素。所以我仍然认为这不是一个直接的答案,而是一种解决方法。我想你建议使用 FloodFill 方法的第二个变体,其中包括掩码参数。但是这个掩码是否也有连接哪些像素的信息? (或者我是否必须手动查找填充了某种颜色的像素)
      • @SamithaChathuranga 检查这个stackoverflow.com/q/28364678/2436175。你希望你的输出如何?点向量的向量?二值图像的向量,其中每个二值图像代表一个标签?
      猜你喜欢
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 2019-10-09
      • 2020-01-14
      相关资源
      最近更新 更多