如何在opencv中分离不同大小的单色对象

jhkqcmku  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(110)

我想分离一个无噪声的1位(白色)图像与白色圆圈的基础上凹部分的轮廓。请参阅下图。
这是要分离的白色对象:

目标结果为:

下面是我使用分水岭算法的实现:

上面的结果并不是我想要的,如果被分离的物体大小相近,我的算法没问题,但是如果大小相差很大,就会出现上图所示的问题,我想实现一个opencv算法,可以像第二张图那样分割一个区域。
不过,输入的照片不一定是正圆,也可以是椭圆形,如下图:

也可以将其压扁:
第一次
不过,我想把它分开的基础上,凹的部分轮廓无论如何。
我觉得用distanceTransform函数可以很好的实现,但是我不知道该怎么做,请告诉我该怎么做,谢谢。

l3zydbqr

l3zydbqr1#

这里有一个算法,它应该给予你一个好的开始。
1.计算所有轮廓。
1.计算每个轮廓的凸度缺陷。如果没有缺陷,则轮廓是一个孤立的圆,可以将其分割出来。
1.处理完所有孤立的圆后,可以通过计算凸度缺陷来计算剩余的轮廓:每个轮廓的圆的数量N是凸面缺陷的数量除以2。
1.使用聚类算法(https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html应该能很好地处理你所拥有的形状),并使用N作为要找到的聚类数来聚类“白色”点。

sgtfey8w

sgtfey8w2#

如果你想找到最小开口,你可以使用基于中轴的方法。
伪代码:

compute contours of bitmap
compute medial-axis of bitmap 

for each point on medial-axis:
  get minimal distance d from medial axis algorithm
  for each local minimum of distance d:
    get two points on bitmap contours with minimal distance that are at least d apart from each other
    use these points for deviding line

如果你需要一个python的工作实现,请告诉我。我会使用skimage lib。对于其他语言,你可能需要自己实现medial-axis。但这应该不是什么大问题。

相关问题