OpenCV 填充孔给出白色图像

OpenCV fill holes gives a white image

我的目标是用图像中的白色像素填充黑洞。 例如在这张图片上,我用红色指出了我想要用白色填充的黑洞。

我正在使用这段代码来完成它。

im_floodfill = im_in.copy()
h, w = im_floodfill.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)
cv2.floodFill(im_floodfill, mask, (0,0), 255)
im_floodfill_inv = cv2.bitwise_not(im_floodfill)
im_out = im_in | im_floodfill_inv

它适用于大多数图像,但有时会产生白色图像。

此输入示例:

im_in

im_floodfill_inv

im_out

你能帮我理解为什么我有时会有白色 im_out 以及如何解决它吗?

我使用了一种不同的方法,在图像上找到轮廓并使用层次结构来确定找到的轮廓是否是子轮廓(其中没有 holes/contours),然后使用这些轮廓来填充孔.我使用了你在这里上传的截图,请下次尝试上传你正在使用的实际图像而不是截图。

import cv2
img = cv2.imread('vmHcy.png',0)

cv2.imshow('img',img)

# Find contours and hierarchy in the image
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
drawing = []
for i,c in enumerate(contours):
    # Add contours which don't have any children, value will be -1 for these
    if hierarchy[0,i,1] < 0:
        drawing.append(c)
img = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
# Draw filled contours
cv2.drawContours(img, drawing, -1, (255,255,255), thickness=cv2.FILLED)
# Draw contours around filled areas with red just to indicate where these happened
cv2.drawContours(img, drawing, -1, (0,0,255), 1)
cv2.imshow('filled',img)

cv2.waitKey(0)

带有红色填充区域轮廓的结果图像:

放大显示的部分: