我有将矩形随机放置的二进制图像,我想获取这些矩形的位置和大小。如果可能的话,我希望精确地重新创建图像。
所需的最小矩形数。[左边是我的原始图像,右边是我应用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与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])
我有将矩形随机放置的二进制图像,我想获取这些矩形的位置和大小。如果可能的话,我需要最小数量的矩形以精确地......>
这里有一些入门知识:一种朴素的算法,可以遍历图像并创建尽可能大的矩形。到目前为止,它仅marks
矩形,但不报告后退坐标或计数。这是为了单独显示算法。