OpenCV-无需更改区域大小的桥组件

问题描述 投票:1回答:1

目标:

我想扩展一个内核大小为N的二进制掩码,然后使用相同的内核有效地对其进行侵蚀,但保留所有由扩展形成的连接。当我执行connectedComponentsWithStats时,我希望将所有紧密结合在一起的东西合并为一个组件。

这是一项令人惊讶的具有挑战性的努力。

示例图片:enter image description here在这种情况下,目标是使此杂散像素加入左侧的对象,但不更改左侧的对象的大小。

付出的努力:

乍看之下,a "closing" operation似乎是完美的选择,但我注意到它正在侵蚀扩张过程中形成的连接,对于该用例基本上不起作用。

我一直在考虑其他方法,例如扩张,腐蚀以及可能创造性地使用轮廓来提供帮助。

[我以为如果要对掩码的倒置做为documented here进行闭合操作,我就很接近了,但这具有消除源掩码的重要部分的作用,而不仅仅是消除间隙。

我的一个想法是做一个膨胀,找到骨架,腐蚀,然后将骨架和原始图像“或”在一起。我遇到了两个问题:1)至少在网上找到我发现的蒙版骨架的实现非常慢,并且2)首先我不确定这是最好的主意(骨骼线是否会穿过我的单个像素)我正在尝试捕获?)

我希望自己只是愚蠢的,缺少明显的东西?

python opencv image-processing computer-vision
1个回答
0
投票

这是使用我在评论中提到的概念。当然,这是一种蛮力方法,但我认为可以对其进行调整以获得期望的结果。

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
© www.soinside.com 2019 - 2024. All rights reserved.