Python 使用泛洪填充填充边缘工作不正常
我在python中使用openCV来检测混凝土中的裂缝。我能够使用canny边缘检测来检测裂缝。接下来,我需要填充边缘。我使用了openCV的泛光填充操作,但是一些间隙被填充,而一些间隙没有被填充。左边的是输入图像,而右边的是泛光填充图像。我猜这是因为我的边在点上有断裂。我如何解决这个问题? 我的洪水填充代码:Python 使用泛洪填充填充边缘工作不正常,python,opencv,image-processing,edge-detection,flood-fill,Python,Opencv,Image Processing,Edge Detection,Flood Fill,我在python中使用openCV来检测混凝土中的裂缝。我能够使用canny边缘检测来检测裂缝。接下来,我需要填充边缘。我使用了openCV的泛光填充操作,但是一些间隙被填充,而一些间隙没有被填充。左边的是输入图像,而右边的是泛光填充图像。我猜这是因为我的边在点上有断裂。我如何解决这个问题? 我的洪水填充代码: im_th1 = imginput im_floodfill = im_th1.copy() # Mask used to flood filling. # Notice the siz
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)
我经常在这里看到,所以每个人都想使用边缘检测,然后填充边缘之间的区域 除非使用有意创建闭合轮廓的边缘检测方法,否则检测到的边缘可能不会形成闭合轮廓。除非具有闭合轮廓,否则无法对区域进行洪水填充 在大多数情况下,一些过滤和一个简单的阈值就足够了。例如:
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]
这个结果是在一个简单的top-hat过滤器之后得到的,它只保留薄的东西,然后是一个路径打开,它只保留长的东西。此组合将删除大比例着色,以及小凹凸和其他内容。过滤后,一个简单的大津阈值产生一个标记裂缝中所有像素的二值图像
注:
- 输入图像是OP发布的图像,也是本问题中发布的图像的输入
- 我正在使用PyDIP,您可以并且需要自己编译它。希望很快我们会有一个二进制发行版。我是作家
- 我找到了我所寻找的解决方案。在这里发布,因为它可能对其他人有用。在互联网上进行了一些研究后,发现只有两行代码,如下所示:
对我有效的代码是:
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9))
dilated = cv2.dilate(image, kernel)
eroded=cv2.erode(dilated,kernel)
结果显示在显示结果前后的附件中。我在使用上述代码时遇到错误:“模块‘pydip’没有属性‘Image’”。我尝试使用PIP安装PyDIP来安装PyDIP库。这不是正确的方法吗?您的输出看起来很有希望,但在这里不起作用@Eshant:不,您不能通过
pip
安装PyDIP,我们还没有二进制发行版,您需要从源代码进行编译。