我有一些二进制图像,其中矩形随机放置在图像中,我想要获取这些矩形的位置和大小。如果可能的话,我希望使用最少的矩形数目来完全重建该图像。
左侧是我的原始图像,右侧是应用
如果矩形相距很远,这个方法就可以正常工作,但如果它们重叠并构建更复杂的结构,这个算法只会给我最大的边界框(放大图像没有任何区别)。我有一种感觉,应该已经存在一个
结果是我想要在图像中得到矩形的列表(即左下角:右上角)。条件是,当我重新绘制这些填充的矩形时,我希望获得与之前完全相同的图像。如果可能,矩形的数量应该尽量少。
以下是生成示例图像的代码(以及更复杂的示例original vs scipy)
scipys.find_objects()
后获得的图像(如this question所建议的)。
import scipy
# image = scipy.ndimage.zoom(image, 9, order=0)
labels, n = scipy.ndimage.measurements.label(image, np.ones((3, 3)))
bboxes = scipy.ndimage.measurements.find_objects(labels)
img_new = np.zeros_like(image)
for bb in bboxes:
img_new[bb[0], bb[1]] = 1
如果矩形相距很远,这个方法就可以正常工作,但如果它们重叠并构建更复杂的结构,这个算法只会给我最大的边界框(放大图像没有任何区别)。我有一种感觉,应该已经存在一个
scipy
或opencv
方法来解决这个问题。
如果有人有想法如何解决这个问题,或者甚至更好的已经知道现有的解决方案,请告诉我,我将不胜感激。结果是我想要在图像中得到矩形的列表(即左下角:右上角)。条件是,当我重新绘制这些填充的矩形时,我希望获得与之前完全相同的图像。如果可能,矩形的数量应该尽量少。
以下是生成示例图像的代码(以及更复杂的示例original vs scipy)
import numpy as np
def random_rectangle_image(grid_size, n_obstacles, rectangle_limits):
n_dim = 2
rect_pos = np.random.randint(low=0, high=grid_size-rectangle_limits[0]+1,
size=(n_obstacles, n_dim))
rect_size = np.random.randint(low=rectangle_limits[0],
high=rectangle_limits[1]+1,
size=(n_obstacles, n_dim))
# Crop rectangle size if it goes over the boundaries of the world
diff = rect_pos + rect_size
ex = np.where(diff > grid_size, True, False)
rect_size[ex] -= (diff - grid_size)[ex].astype(int)
img = np.zeros((grid_size,)*n_dim, dtype=bool)
for i in range(n_obstacles):
p_i = np.array(rect_pos[i])
ps_i = p_i + np.array(rect_size[i])
img[tuple(map(slice, p_i, ps_i))] = True
return img
img = random_rectangle_image(grid_size=64, n_obstacles=30,
rectangle_limits=[4, 10])