我正在使用OpenCV将一堆视点匹配到全景图中。结果是在黑色背景上的一堆图像(一种多边形形状)。我想要做的是裁剪这个多边形,以便在结果图像中没有黑色。有这么好的算法吗?
我想的天真的方式是从图像中间的一个小方块开始向上扩展,直到我击中黑色,然后向左和向右扩展。
我想要的解决方案是最大化填充区域总面积的解决方案。
编辑:多边形是凹的,所以我们需要检查 - 我认为尝试每个顶点对的O(N^2)
算法是可行的,因为N很小。但是我们需要检查区域边界是否被填充,我猜想可以在O(N)中通过检查每个顶点来查看它是否位于由我们选择的顶点对定义的矩形的边界内。这为我们提供了O(N^3)
算法
答案 0 :(得分:1)
天真的解决方案可能效果不佳,因为通常使矩形较高会限制其宽度,因此您无法获得最佳解决方案。
如果多边形上没有太多顶点,则可能会出现以下情况:尝试拾取顶部和底部边缘的每个组合。为简化起见,假设它们将始终包含多边形的一个顶点。指定顶部和底部时,可以确定侧面,因此对于每对顶部/底部,您可以计算面积。选择能够提供最大面积的解决方案。
上述简化可能会给出不理想的结果,但不应该太糟糕。
答案 1 :(得分:0)
假设多边形在离散的XY网格上是凸的。然后,多边形的整个形状可以由(x1,x2)对的数组表示,对应于网格中的每个Y坐标。通过跟踪多边形的边缘,可以得到(x1,x2)对的数组。
你知道方块必须至少在两个对角点上触摸多边形,无论是左上 - 右下还是左下 - 右上 -
在每个左边缘点,你可以找到最靠近右边的点,最近的直接向上和向下,以及每个对角线上最近的点,上下45度。如果对角线上的距离等于或小于任何直线距离,则您有一个适合多边形的正方形。可能不止一个,所以继续找到最大的一个。
答案 2 :(得分:0)
考虑到可能在全景图中的图像数量有限,您可以使用强力方法并尝试所有可能的组合。用户永远无法区分,并且函数的编写和维护可能会更快。但是,这并不是那么有趣。
答案 3 :(得分:0)
似乎线扫描算法效果很好。例如,从左边缘的垂直线开始,一次向右移动一些x增量。在每个站点,查看多边形内部的线的每个线段。 (凹陷时可能有多个。)考虑沿线段的子线段。
然后从子线段的每个端点取水平线,找到与多边形交叉的交叉点(两个方向),找到包含该子线段的最大矩形。
性能可以是O(n x n y 2 ),但您可以使用启发式和自适应步长来减少它。
太多假设或捷径可能会遗漏的案例是:
+------\ /---+
| \ / |
\ \/ /
\ /
/ \
/ /\ \
| / \ |
+----/ \-----+
答案 4 :(得分:0)
如果使用像素,请尝试距离变换,找到最大点,然后根据此位置通过扩展方形/矩形找到区域内的最大平方