scipy.ndimage.morphology.fill_binary_holes
,但无法使其工作。请注意,提供的函数需要更长的时间,因为它假定输入图像是灰度的而不是二值化的。
我特别避免使用OpenCV,因为我觉得设置有点繁琐,但我认为它也应该提供等效的功能(见此处)。
此外,我的“二值化”有点hacky,但您可能可以自己解析图像以获得有效格式(如果在程序中生成结果可能会更容易)。无论如何,建议确保您拥有适当的图像格式,因为jpeg的压缩可能会违反您的连通性,并在某些情况下导致问题。
import scipy as sp
import numpy as np
import scipy.ndimage
import matplotlib.pyplot as plt
def flood_fill(test_array,h_max=255):
input_array = np.copy(test_array)
el = sp.ndimage.generate_binary_structure(2,2).astype(np.int)
inside_mask = sp.ndimage.binary_erosion(~np.isnan(input_array), structure=el)
output_array = np.copy(input_array)
output_array[inside_mask]=h_max
output_old_array = np.copy(input_array)
output_old_array.fill(0)
el = sp.ndimage.generate_binary_structure(2,1).astype(np.int)
while not np.array_equal(output_old_array, output_array):
output_old_array = np.copy(output_array)
output_array = np.maximum(input_array,sp.ndimage.grey_erosion(output_array, size=(3,3), footprint=el))
return output_array
x = plt.imread("test.jpg")
# "convert" to grayscale and invert
binary = 255-x[:,:,0]
filled = flood_fill(binary)
plt.imshow(filled)