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

时间:2014-03-24 08:12:03

标签: arrays algorithm

我正在使用this solution来查找与二进制矩阵中的图像边框对齐的矩形。假设现在我想找到一个未与图像边界对齐的矩形,我不知道它的方向;什么是找到它的最快方法?

为了这个例子,我们来看一个只包含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

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

我正在使用C / C ++,但任何语言或伪代码的算法描述都会对我有所帮助。

更多细节:

  • 图片中可以有多个矩形:我只需要最大的
  • 矩形在图像中不是一个漂亮的矩形(我在上面稍微修改了我的例子)
  • 我处理大图像(1280x1024)所以我正在寻找最快的解决方案(蛮力O(n³)算法会很慢)
  • (可选)如果解决方案可以并行化,这是一个加号(然后我可以使用GPU,SIMD,......来增强它)。

1 个答案:

答案 0 :(得分:1)

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

暴力

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

这有 检查大量候选轮换的缺点 。但是,此检查 可以并行完成,因为它们彼此不相容 。这仍然可能非常缓慢,虽然实现它(不应该太难)并且一旦并行化就能提供更明确的问题速度答案。

请注意,您的工作空间为 离散矩阵 ,只有 有限 轮换次数浏览。

其他方法

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

  1. 要缩小基本矩阵,以便 分隔连接的组件[1] (对应于您感兴趣的值集)。
  2. 对于每个较小的矩阵 - 请注意它们可能会重叠,具体取决于分布 - 找到 最小化的方向边界框 为您感兴趣的价值设定。
  3. 仍然为每一个 旋转矩阵,使最小的方向边界框现在与轴对齐
  4. 启动您已有的算法,找到 最大轴对齐 矩形,其中只包含值集中的值。
  5. 此算法找到的解决方案是 从所有连接组件获取的最大矩形
  6. 这第二个解决方案可能会给你一个近似的解决方案,但我相信它可能值得尝试。

    供参考

    我找到的最大/最大空矩形问题的唯一解决方案是轴对齐的。我已经看到许多未解答的问题与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
    

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

    请注意,我保留了矩阵的原始尺寸。我这样做是因为我从你的帖子中猜测它有一些重要性,并且一个远离边界扩展的矩形不会被找到作为解决方案(即我们不能假设除了零值之外)边界)。

    编辑#2:

    选择是否保留矩阵维度是值得商榷的,因为它不会直接影响算法。

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

    您还需要考虑这样一个事实:如果您希望将矩形的坐标作为输出返回,为每个连接的组件创建一个具有不同尺寸的矩阵,这将强制您将新创建的矩阵的坐标存储在原来的一个(实际上,一个点,例如左上角的那个,应该就够了)。