我正在使用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 ++,但任何语言或伪代码的算法描述都会对我有所帮助。
更多细节:
答案 0 :(得分:1)
我对这个问题只有部分答案,对于我提出的建议的复杂性或速度只有一些想法。
暴力
我看到的第一个想法是使用这样一个事实:您的问题是离散的,以实现围绕图像中心的 旋转 和 重复您已经使用的算法,以便找到轴对齐的解决方案 。
这有 检查大量候选轮换的缺点 。但是,此检查 可以并行完成,因为它们彼此不相容 。这仍然可能非常缓慢,虽然实现它(不应该太难)并且一旦并行化就能提供更明确的问题速度答案。
请注意,您的工作空间为 离散矩阵 ,只有 有限 轮换次数浏览。
其他方法
我看到的第二个解决方案是:
这第二个解决方案可能会给你一个近似的解决方案,但我相信它可能值得尝试。
供参考
我找到的最大/最大空矩形问题的唯一解决方案是轴对齐的。我已经看到许多未解答的问题与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:
选择是否保留矩阵维度是值得商榷的,因为它不会直接影响算法。
但是,值得注意的是,如果与连接组件相对应的矩阵在非零值上不重叠,您可以选择存储这些矩阵"就地"。
您还需要考虑这样一个事实:如果您希望将矩形的坐标作为输出返回,为每个连接的组件创建一个具有不同尺寸的矩阵,这将强制您将新创建的矩阵的坐标存储在原来的一个(实际上,一个点,例如左上角的那个,应该就够了)。