让我们有一个如下图左侧所示的图像(灰度甚至二进制),目标是生成一个点列表,即每个包的坐标(x,y)图像中的暗像素。
有哪些合适的图像处理工具可以做到这一点,它们在哪里可用?
更新:
1)
在这里您可以找到有关该问题的更多详细信息。(注意包装大小的变化)
我可能会建议检测包以计算每个包的凸包边界,然后找到具有代表性的质心{详情请参阅此内容}。
2)
这是应用距离变换产生的结果(由“Libor”建议)。注意我在图中的注释。该方法不起作用,因为它有希望!
3)
侵蚀消除了小包装!
from __future__ import division
from scipy import zeros, ndimage as dsp
from pylab import subplot,plot,matshow,show
img = zeros((30,30))
img[10:14,10:14] = 1
img[16:17,16:17] = 1
img[19:23,19] = 1
img[19,19:23] = 1
subplot(221)
matshow(img,0)
subplot(222)
y = dsp.binary_erosion(img,[[1,1],[1,1]])
matshow(y,0)
subplot(223)
y = dsp.binary_erosion(img,[[0,1,0],[1,1,1],[0,1,0]])
matshow(y,0)
subplot(224)
y = dsp.binary_erosion(img,[[1,1,1],[1,1,1],[1,1,1]])
matshow(y,0)
show()
4)
好吧,这里是一个Python(即爱的语言:))实现标记想法(也是由下面的“Jean-Yves”提出的):
subplot(221)
l,n = dsp.label(img)
sl = dsp.find_objects(l)
for s in sl:
x = (s[1].start+s[1].stop-1)/2
y = (s[0].start+s[0].stop-1)/2
plot(x,y,'wo')
结果:
请注意,尽管由于 Scipy 的性能,它在Pythonlabel
中完成得如此之快,但函数中的后台过程应该是一个令人筋疲力尽的迭代。这可以被认为是一种权衡。所以有一段时间我一直渴望寻求更有效的算法。还要注意,在上面给定的代码中,我发现几何中心非常简单,而对于复杂或不对称的形状,这可能会导致定位出现偏差。那就是它正在进行中的工作;)。
5)这是从此处
捕获的一个复杂案例(真实图像),在该案例上应用了标记建议,您可以看到结果。请注意,整个过程(包括标记和查找对象)只需要 0.015 秒。我认为Scipy家伙做得很好。哇!{右键单击图像,单击查看图像以获得完整分辨率}