【发布时间】:2014-05-01 11:50:27
【问题描述】:
我正在使用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 的最小边界框的方向是否可以提供关于仅包含 1 的最大矩形方向的任何指示。一般情况下它可能不起作用,但它可能是一个开始。例如,凸形可能就是这种情况......
-
如果你想“去做” - 你可以申请
O(n^3)搜索矩形算法。 IE。 - 开始检查每个1点中的矩形,构建所有可能的矩形。然后找到面积最大的矩形(可能不止一个) -
@AlmaDo 我对方向一无所知;所以我不能选择所有可能的方向:每 10 度?每5度? ...但是我同意这将是一个可能的解决方案,但非常次优。 (我使用 1280x1024 图像)
-
视情况而定。您需要决定什么应该被视为矩形(这里我们谈到了在离散空间上绘制线图。这可以通过Bresenham algorithm 来完成)。所以:你需要确定给定的点是否代表矩形的边界。要做到这一点,你需要知道什么是边界——什么是正确的离散表示(因为我们不在连续平面上,我们在一些离散空间上)
-
嗯,我想澄清一下
so I prefer an optimal solution (which I'll be able to boost myself later using GPU, SIMD or others ...),因为高度并行的算法并不总是(甚至)接近最优算法。您是在寻找高度并行的算法还是最优的算法?我也想了解有关您的问题的离散性的更多信息。你认为细胞是二维坐标还是它们真的是正方形,因为穿过它们的线被认为是穿过整个细胞?