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)
带有红色填充区域轮廓的结果图像:
放大显示的部分:
我的目标是用图像中的白色像素填充黑洞。 例如在这张图片上,我用红色指出了我想要用白色填充的黑洞。
我正在使用这段代码来完成它。
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)
带有红色填充区域轮廓的结果图像:
放大显示的部分: