1

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

4

2 回答 2

4

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 图像,你可以调用 threshold(input,output, 1,255, THRESH_BINARY_INV);

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

于 2015-04-04T12:50:35.707 回答
3

您应该简单地使用floodFill

在这里,您可以找到有关如何获得所有像素都连接到种子点的二值图像的详细说明。

于 2015-04-04T21:14:18.357 回答