Arrays 在二进制矩阵中查找与图像边界不对齐的最大矩形(必要)

Arrays 在二进制矩阵中查找与图像边界不对齐的最大矩形(必要),arrays,algorithm,Arrays,Algorithm,我用它在二元矩阵中找到与图像边框对齐的矩形。假设现在我想找到一个与图像边框不对齐的矩形,我不知道它的方向;找到它最快的方法是什么 为了便于示例,让我们查找一个仅包含1的矩形。例如: 1 1 1 1 0 0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0

我用它在二元矩阵中找到与图像边框对齐的矩形。假设现在我想找到一个与图像边框不对齐的矩形,我不知道它的方向;找到它最快的方法是什么

为了便于示例,让我们查找一个仅包含1的矩形。例如:

1 1 1 1 0 0 0 0 0 1 0 0 1 1 1
0 1 1 1 1 1 0 0 0 1 0 0 1 1 0
0 0 0 1 1 1 1 1 0 1 0 0 1 0 0
0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 1 1 0
然后,我描述的解决方案中描述的算法只会找到一个大小为6(3x2)的矩形。我想找一个更大的倾斜矩形;我们可以清楚地看到一个至少10码或更大的矩形

我在C/C++中工作,但任何语言或伪代码的算法描述都会对我有很大帮助

更多详情:

  • 图像中可以有多个矩形:我只需要最大的矩形
  • 该矩形在图像中不是一个漂亮的矩形(我稍微修改了上面的示例)
  • 我处理大型图像(1280x1024),因此我正在寻找最快的解决方案(暴力O(n³)算法将非常慢)
  • (可选)如果解决方案可以并行化,这是一个加号(然后我可以使用GPU、SIMD等进一步增强它)

对于这个问题,我只有部分答案,对于我提出的问题的复杂性或速度,我只有一些想法

暴力

我看到的第一个想法是利用问题是离散的这一事实,围绕图像中心进行旋转,并重复您已经使用的算法,以找到轴对齐的解决方案

这样做的缺点是检查大量候选旋转。但是,此检查可以并行进行,因为它们彼此独立。这可能仍然非常缓慢,尽管实现它(不应该太难),并且一旦并行化,将为问题速度提供更明确的答案

请注意,您的工作空间是一个离散矩阵,只有有限的旋转次数可供浏览

其他方法

我看到的第二个解决方案是:

  • 减少基本矩阵,以便分离连接的组件[1](对应于您感兴趣的值集)
  • 对于这些较小的矩阵中的每一个——请注意,它们可能根据分布而重叠——找到您感兴趣的值集的最小定向边界框
  • 对于其中的每一个,旋转矩阵,使最小定向边界框现在与轴对齐
  • 启动算法,您必须找到仅包含值集中的值的最大轴对齐矩形
  • 通过该算法找到的解将是从所有连接组件获得的最大矩形
  • 第二个解决方案可能会给你们一个soluiton的近似值,但我相信它可能值得一试

    供参考

    对于最大/最大空矩形问题,我找到的唯一解决方案是轴对齐。我在2D连续空间上看到了许多与这个问题的定向版本相对应的未回答问题

    编辑:

    [1]因为我们想要的是分离连接的组件,如果存在一定程度的重叠,您应该按照以下示例执行:

    0 1 0 0
    0 1 0 1
    0 0 0 1
    
    应分为:

    0 0 0 0
    0 0 0 1
    0 0 0 1
    

    请注意,我保留了矩阵的原始维度。我这样做是因为我从你的帖子中猜测它有一定的重要性,并且一个远离边界扩展的矩形不能作为解决方案(也就是说,我们不能仅仅假设边界之外有零值)

    编辑#2:

    是否保留矩阵维数的选择是有争议的,因为它不会直接影响算法

    但是,值得注意的是,如果与连接组件对应的矩阵在非零值上不重叠,则可以选择将这些矩阵“就地”存储


    你还需要考虑这样一个事实,如果你想把矩形的坐标作为输出返回,为每个连接的组件创建一个不同维度的矩阵,这将迫使你把新创建的矩阵的坐标存储在原来的一个(实际上,一个点,比如左上一个,应该足够)。.

    我想知道包含所有1的最小边界框的方向是否可以提供关于仅包含1的最大矩形方向的任何指示。一般来说,这可能不起作用,但这可能是一个开始。例如,凸面形状可能就是这样……如果你想“就这么做”——你可以应用
    O(n^3)
    搜索矩形算法。即-开始检查每个
    1
    点中的矩形,构建所有可能的矩形。然后找到最大面积的矩形(可能不止一个)@AlmaDo我对方向一无所知;所以我不能选择所有可能的方向:每10度?每5度。。。然而,我同意这将是一个可能的解决方案,但非常次优。(我使用1280x1024图像)视情况而定。您需要决定什么应该被视为矩形(这里我们讨论了离散空间上的线绘制,这可以用)。所以:您需要确定给定的点是否表示矩形的边界。要做到这一点,你需要知道,什么是边界,什么是边界的正确离散表示(因为我们不在连续平面上,我们在一些离散空间上)嗯,我想澄清一下
    ,所以我更喜欢一个最佳解决方案(稍后我可以用它来提升自己)
    
    0 1 0 0
    0 1 0 0
    0 0 0 0