使用openCV对二值图像中连接的组件进行计数

使用openCV对二值图像中连接的组件进行计数,opencv,image-processing,Opencv,Image Processing,如何在二值图像中找到连接组件的数量? 我不需要他们的像素或其他属性的遮罩。 我知道我可以使用标签,然后计算所有斑点,但这似乎是多余的。在计算之前,您需要知道哪些是连接的组件 您可以直接从以下位置获取号码: 如果你有一个好的种子填充算法,你可以扫描图像,并开始填充背景色,每次你遇到一个前景像素 组件的数量就是填充的数量。这不是个好主意。你基本上是在建议一个非常慢的算法来查找连接的组件。@Miki:你的错误。这是一个线性时间过程,操作的数量最多与像素的数量成正比。另一方面,传统方法依赖于联合查找,导

如何在二值图像中找到连接组件的数量? 我不需要他们的像素或其他属性的遮罩。 我知道我可以使用标签,然后计算所有斑点,但这似乎是多余的。

在计算之前,您需要知道哪些是连接的组件

您可以直接从以下位置获取号码:


如果你有一个好的种子填充算法,你可以扫描图像,并开始填充背景色,每次你遇到一个前景像素


组件的数量就是填充的数量。

这不是个好主意。你基本上是在建议一个非常慢的算法来查找连接的组件。@Miki:你的错误。这是一个线性时间过程,操作的数量最多与像素的数量成正比。另一方面,传统方法依赖于联合查找,导致最坏情况复杂度O(nlog*N)。是什么让你觉得它慢?如果我正确理解你的方法,你需要:1)扫描图像以找到前景像素,2)用该种子填充,3)从1)重复,直到找不到种子。如果每次都使用一个新值而不是使用背景值,则会得到一个连接组件算法。这是我很久以前实现的,速度很慢。关于复杂性,您可能是对的(实际上我说不出来),但我希望看到您的实现比
connectedComponents
运行得更快。我是来学习的,如果我错了,请告诉我;)@米奇:不,你不要重复1),那太可怕了。你从原来的位置继续。我很确定你会错过一些CCU。如果我只需要“n_连接的组件”,你认为这是最快的方法吗
cv::Mat1b bw; // your black and white image

cv::Mat1i labels;
int n_labels = cv::connectedComponents(bw, labels);

// Note that one label is the background
int n_connected_components = n_labels - 1;