Java 在二值图像中识别不同形状的最简单方法是什么?

Java 在二值图像中识别不同形状的最简单方法是什么?,java,computer-vision,shapes,image-recognition,Java,Computer Vision,Shapes,Image Recognition,因此,我有以下图像: 现在,我希望找到每个独立断开形状的中心点。如果可能的话,我还想找到宽度和高度 我正在使用Java和Java.awt.image包,但即使只是这个问题的一般解决方案也会有所帮助 我自己的想法是: 遍历并找到第一个白色像素 从用数字1标记找到的白色像素的像素执行BFS 完成后,继续迭代图像,在第一个白色像素处停止,没有指定/标记编号 一旦找到这个,执行BFS并用数字2标记找到的所有像素 起泡,冲洗,重复。我是说。。。继续执行此操作,直到图像结束 您最多的数目是不同形状的数目

因此,我有以下图像:

现在,我希望找到每个独立断开形状的中心点。如果可能的话,我还想找到宽度和高度

我正在使用Java和Java.awt.image包,但即使只是这个问题的一般解决方案也会有所帮助

我自己的想法是:

  • 遍历并找到第一个白色像素
  • 从用数字1标记找到的白色像素的像素执行BFS
  • 完成后,继续迭代图像,在第一个白色像素处停止,没有指定/标记编号
  • 一旦找到这个,执行BFS并用数字2标记找到的所有像素
  • 起泡,冲洗,重复。我是说。。。继续执行此操作,直到图像结束
  • 您最多的数目是不同形状的数目

但这似乎有点密集,然后我必须找到中心,宽度和高度。有没有更简单的方法?有什么想法吗?

我不知道这是不是个好主意,但也许这会对你有所帮助:

我会从边缘发送
randomWalks
,并将图像分割成较小的框,然后继续从较小的框发送randomWalks,直到某个点(我不知道该点是什么,但您会知道,这里没有一个较小的框包含超过1个元素)

-如果一个
randomWalk
切割另一个
randomWalk
而没有看到任何
whitecolor
,则会出现一个新的弓。例如,在我的图像中,假设
1st random walk(rw1)
(0200)开始,并且
rw2
(100,0)开始,它们在(100200)中点击,而不触摸任何
白色
,那么您就有了一个框(0,0100200)。将其添加到
mybox
的数组列表中

-现在我想到了,你可以这样做:如果一个框中像素的颜色之和等于零(或者小于一个小数字),那么这个框中就没有图像。因此,您可以将其添加到另一个列表中,我们将其称为
myEmptyBoxes

-接下来,当您确定每个框中只有一个元素时,然后对每个框的颜色求和,如果两个框相等或非常接近,则它们可能是相同的图像。如果不是自动地,它们不是相同的图像,则无需处理这两个图像/框

-我想不出下一步该怎么办了,我就想不出了

-另外,我建议您使用opencv,这是解决此类问题的一个很好的库

希望这会有所帮助


您是指连接的组件标签吗?维基百科上有一篇很好的文章,包括一个伪代码算法:啊,好吧,差不多。除非你知道怎么称呼它们,否则很难找到这些东西。虽然不能准确地帮助找到中心或尺寸,但我们已经找到了。您可以通过查找组件的质心()来找到组件的中心。对于它的大小,您可以计算组件中的白色像素数,或者如果您更喜欢边界框,请查找最顶部、最左侧、最底部和最右侧的白色像素,并使用此信息构建一个矩形。