查找图像中的最小矩形数

问题描述 投票:5回答:1

我有将矩形随机放置的二进制图像,我想获取这些矩形的位置和大小。如果可能的话,我希望精确地重新创建图像

所需的最小矩形数。

[左边是我的原始图像,右边是我应用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

如果矩形相距较远,效果很好,但是如果矩形重叠并构建更复杂的结构,则此算法只会为我提供最大的边界框(对图像进行过采样不会造成任何影响)。我感觉应该已经存在执行此操作的scipyopencv方法。我很高兴知道有人是否对解决这个问题有一个想法,或者甚至更好地了解现有的解决方案。

因此,我需要图像中的矩形列表(即,左下角:上右角)。条件是当我重画这些填充的矩形时,我想要获得与以前完全相同的图像。如果可能,矩形的数量应该最少。

这里是用于生成样本图像的代码(以及更复杂的示例originalscipy)] >>

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])

我有将矩形随机放置的二进制图像,我想获取这些矩形的位置和大小。如果可能的话,我需要最小数量的矩形以精确地......>

python numpy image-processing scipy rectangles
1个回答
1
投票

这里有一些入门知识:一种朴素的算法,可以遍历图像并创建尽可能大的矩形。到目前为止,它仅marks

矩形,但不报告后退坐标或计数。这是为了单独显示算法。
© www.soinside.com 2019 - 2024. All rights reserved.