间隙填充轮廓/线 - python

我有以下图像:

并且我想填充其轮廓(即,我想在这张图片中填充线条)。

我尝试了形态学上的闭合,但是使用大小为3x3且具有10迭代的矩形核不会填充整个边界。我也尝试过使用21x21迭代的1内核,也没有运气。

更新:

我已经在OpenCV(Python)中使用以下方法尝试过:

cv2.morphologyEx(img, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT, (21,21)))

cv2.morphologyEx(img, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)), iterations=10)

和scikit-image:

closing(img, square(21))

我的最终目标是在不扭曲所覆盖区域的情况下获得整个图像的填充版本。

python大神给出的解决方案

在以下代码段中,我计算了逆像的距离图。我将其设置为阈值以获得当前对象的大轮廓,然后对其进行骨架化以获取中心线。这可能已经足以满足您的目的。但是为了使其与给定的线宽一致,我对骨架进行了扩张并将其添加到原始线条中,从而缩小了任何间隙。我还删除了一个接触边界的剩余对象。

from skimage import io, morphology, img_as_bool, segmentation
from scipy import ndimage as ndi
import matplotlib.pyplot as plt

image = img_as_bool(io.imread('/tmp/gaps.png'))
out = ndi.distance_transform_edt(~image)
out = out < 0.05 * out.max()
out = morphology.skeletonize(out)
out = morphology.binary_dilation(out, morphology.selem.disk(1))
out = segmentation.clear_border(out)
out = out | image

plt.imshow(out, cmap='gray')
plt.imsave('/tmp/gaps_filled.png', out, cmap='gray')
plt.show()