使用洪水填充的填充边缘无法正常工作

Filling edges using flood fill not working properly

我在 python 中使用 openCV 检测混凝土裂缝。我能够使用精明的边缘检测来检测裂缝。接下来,我需要填充边缘。我使用了 openCV 的 floodfill 操作,但是有些空白被填充了,有些没有被填充。 image on the left is the input image whereas that on the right is the floodfilled image。我猜这是因为我的边缘有断点。我该如何解决这个问题? 我的 floodfilling 代码:

im_th1 = imginput
im_floodfill = im_th1.copy()
# Mask used to flood filling.
# Notice the size needs to be 2 pixels than the image.
h, w = im_th1.shape[:2]
mask = np.zeros((h + 2, w + 2), np.uint8)

# Floodfill from point (0, 0)
cv2.floodFill(im_floodfill, mask, (5, 5), 255);

# Invert floodfilled image
im_floodfill_inv = cv2.bitwise_not(im_floodfill)

# Combine the two images to get the foreground.
im_out = im_th1 | im_floodfill_inv
cv2.imshow("Foreground", im_out)
cv2.waitKey(0)

我在SO上经常看到这个,大家都想用边缘检测,然后填充边缘之间的区域。

除非您使用有意创建闭合轮廓的边缘检测方法,否则检测到的边缘可能不会形成闭合轮廓。除非你有一个封闭的轮廓,否则你不能淹没一个区域。

在大多数情况下,一些过滤和简单的阈值就足够了。例如:

import PyDIP as dip
import matplotlib.pyplot as pp

img = dip.Image(pp.imread('oJAo7.jpg')).TensorElement(1) # From OP's other question
img = img[4:698,6:]

lines = dip.Tophat(img, 10, polarity='black')
dip.SetBorder(lines, [0], [2])
lines = dip.PathOpening(lines, length=100, polarity='opening', mode={'robust'})
lines = dip.Threshold(lines, method='otsu')[0]

这个结果是在一个简单的顶帽过滤器之后得到的,它只保留细的东西,然后是一个路径开放,它只保留长的东西。这种组合消除了大范围的阴影,以及小的颠簸和东西。过滤后,一个简单的 Otsu 阈值产生一个二值图像,标记裂缝中的所有像素。

备注:

  • 输入图像是张贴的一张 OP in another question,并且是此问题中张贴的图像的输入。
  • 我正在使用 PyDIP,您可以 get on GitHub 并且需要自己编译。希望很快我们就会有一个二进制发行版。我是作家。

我找到了我正在寻找的解决方案。将它张贴在这里,因为它可能对其他人有用。在互联网上进行一些研究后,它只是建议的 2 行代码:

对我有用的代码是:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9))
dilated = cv2.dilate(image, kernel)
eroded=cv2.erode(dilated,kernel)

结果在附件中image,显示前后结果。