我想分离一个无噪声的1位(白色)图像与白色圆圈的基础上凹部分的轮廓。请参阅下图。
这是要分离的白色对象:
目标结果为:
下面是我使用分水岭算法的实现:
上面的结果并不是我想要的,如果被分离的物体大小相近,我的算法没问题,但是如果大小相差很大,就会出现上图所示的问题,我想实现一个opencv算法,可以像第二张图那样分割一个区域。
不过,输入的照片不一定是正圆,也可以是椭圆形,如下图:
也可以将其压扁:
第一次
不过,我想把它分开的基础上,凹的部分轮廓无论如何。
我觉得用distanceTransform函数可以很好的实现,但是我不知道该怎么做,请告诉我该怎么做,谢谢。
2条答案
按热度按时间l3zydbqr1#
这里有一个算法,它应该给予你一个好的开始。
1.计算所有轮廓。
1.计算每个轮廓的凸度缺陷。如果没有缺陷,则轮廓是一个孤立的圆,可以将其分割出来。
1.处理完所有孤立的圆后,可以通过计算凸度缺陷来计算剩余的轮廓:每个轮廓的圆的数量N是凸面缺陷的数量除以2。
1.使用聚类算法(https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html应该能很好地处理你所拥有的形状),并使用N作为要找到的聚类数来聚类“白色”点。
sgtfey8w2#
如果你想找到最小开口,你可以使用基于中轴的方法。
伪代码:
如果你需要一个
python
的工作实现,请告诉我。我会使用skimage
lib。对于其他语言,你可能需要自己实现medial-axis。但这应该不是什么大问题。