我想扩展一个内核大小为N的二进制掩码,然后使用相同的内核有效地对其进行侵蚀,但保留所有由扩展形成的连接。当我执行connectedComponentsWithStats
时,我希望将所有紧密结合在一起的东西合并为一个组件。
这是一项令人惊讶的具有挑战性的努力。
示例图片:在这种情况下,目标是使此杂散像素加入左侧的对象,但不更改左侧的对象的大小。
乍看之下,a "closing" operation似乎是完美的选择,但我注意到它正在侵蚀扩张过程中形成的连接,对于该用例基本上不起作用。
我一直在考虑其他方法,例如扩张,腐蚀以及可能创造性地使用轮廓来提供帮助。
[我以为如果要对掩码的倒置做为documented here进行闭合操作,我就很接近了,但这具有消除源掩码的重要部分的作用,而不仅仅是消除间隙。
我的一个想法是做一个膨胀,找到骨架,腐蚀,然后将骨架和原始图像“或”在一起。我遇到了两个问题:1)至少在网上找到我发现的蒙版骨架的实现非常慢,并且2)首先我不确定这是最好的主意(骨骼线是否会穿过我的单个像素)我正在尝试捕获?)
我希望自己只是愚蠢的,缺少明显的东西?
这是使用我在评论中提到的概念。当然,这是一种蛮力方法,但我认为可以对其进行调整以获得期望的结果。
img = cv2.imread('/your/binarized/image', \
cv2.IMREAD_GRAYSCALE)
h, w = gray.shape
ret, markers = cv2.connectedComponents(img)
out = np.copy(img)
for i in range(1, w-1):
for j in range(1, h-1):
if markers[j][i] == 0:
lset = set()
for m in range(-1, 2):
for n in range(-1, 2):
if markers[j+m][i+n] != 0 and \
(markers[j+m][i+n] not in lset):
lset.add(markers[j+m][i+n])
if(len(lset) >= 2):
out[j][i] = 255
break