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