【发布时间】:2020-01-06 01:58:30
【问题描述】:
我有一张像这样的图片,只有黑白的:
我只想使用cv2.floodfill 获取图像带边框的被淹没区域,就像这样(请原谅我的绘画技巧):
这是我当前的代码:
# Copy the image.
im_floodfill = cv2.resize(actual_map_image, (500, 500)).copy()
# Floodfill from point (X, Y)
cv2.floodFill(im_floodfill, None, (X, Y), (255, 255, 255))
# Display images.
cv2.imshow("Floodfilled Image", im_floodfill)
cv2.waitKey(0)
我得到的输出等于原始图像。我怎样才能只获得带边界的洪水区域?
编辑:我想从“竞技场”内的任何 white 点进行填充,例如图像中的红点 (X,Y)。我希望只有竞技场内小圆圈的外边界和外墙的内边界。
EDIT2:我已经完成了一半:
# Resize for test purposes
actual_map_image = cv2.resize(actual_map_image, (1000, 1000))
actual_map_image = cv2.cvtColor(actual_map_image, cv2.COLOR_BGR2GRAY)
h, w = actual_map_image.shape[:2]
flood_mask = np.zeros((h+2, w+2), dtype=np.uint8)
connectivity = 8
flood_fill_flags = (connectivity | cv2.FLOODFILL_FIXED_RANGE | cv2.FLOODFILL_MASK_ONLY | 255 << 8)
# Copy the image.
im_floodfill = actual_map_image.copy()
# Floodfill from point inside arena, not inside a black dot
cv2.floodFill(im_floodfill, flood_mask, (h/2 + 20, w/2 + 20), 255, None, None, flood_fill_flags)
borders = []
for i in range(len(actual_map_image)):
borders.append([B-A for A,B in zip(actual_map_image[i], flood_mask[i])])
borders = np.asarray(borders)
borders = cv2.bitwise_not(borders)
# Display images.
cv2.imshow("Original Image", cv2.resize(actual_map_image, (500, 500)))
cv2.imshow("Floodfilled Image", cv2.resize(flood_mask, (500, 500)))
cv2.imshow("Borders", cv2.resize(borders, (500, 500)))
cv2.waitKey(0)
我明白了:
但是,我觉得这是获取边界的错误方式,并且它们是不完整的。
【问题讨论】:
-
我不明白你正在填充什么区域并要提取。坐标 260,260 在白色的右下角区域。你是充满白色的洪水。所以我不期望有任何改变。请澄清。
-
您想要删除这些点还是只保留这些点?
-
@fmw42。我在代码中调整了图像的大小,260,260 旨在成为中心圆附近的一个白点。我已经用我想开始的一个点的例子更新了图像。我只想提取填充区域,而不是填充填充的图像。
-
@MH304,我只想保留点的边框。