【问题标题】:Finding the largest rectangle inside a quadrilateral找到四边形内最大的矩形
【发布时间】:2012-07-19 03:25:14
【问题描述】:

最近,我扫描了很多专辑封面,试图将我的音乐收藏数字化。扫描后的默认过程是旋转和裁剪。

对于旋转,重要的是找到一条或多条参考线。旋转后,“正常”线将或多或少水平(或垂直),奇数线会有些倾斜。可以区分两个“不同”的旋转:

注意:两个四边形是两张专辑封面。您可以将专辑封面中的两条线想象成两条印刷线。所有参考线均以粗体显示。您可能想知道为什么专辑封面不只是矩形,但请注意这张图片被大大夸大了。也就是说,如果您仔细查看过专辑封面,您会发现它们很少接近矩形。

在情况 A 中,很明显大部分封面边缘是平行的并形成 90 度角,和/或打印的对象过度倾斜,这表明打印本身是倾斜的。在这两种情况下,我都可以更好地使用封面边缘作为参考。

在情况 B 中,大部分线条看起来不规则,打印看起来还不错。然后我最好使用打印的对象作为参考。

总而言之,这主要是一个直观的过程。

虽然上述不是实际问题的一部分,但我认为先了解背景信息对您很有用。我们现在已经到了裁剪步骤,一直困扰着我的部分。

我的问题很简单:如果我必须裁剪任何专辑封面,我该如何裁剪它以使我留下专辑封面的最大部分?换句话说,我怎样才能找到一起形成四边形内最大可能矩形的 4 个值?

唯一的条件是矩形必须与参考线平行,即水平。

【问题讨论】:

  • 矩形是否应该与现实世界的 x 和 y 轴对齐?还是可以相对于现实世界旋转矩形?
  • 图像中的两个封面已经旋转,这意味着参考线是水平的,即与真实世界的 x 轴对齐。由于我也希望在最终图像中使用它,因此裁剪矩形也必须与真实世界的 x 轴对齐。

标签: algorithm math


【解决方案1】:

如果您接受给定矩形将与现实世界中的 x 和 y 轴对齐的约束,而不是倾斜,您可以执行以下操作

Given that point contains values x,y
Given quadrilateral roughly formed by

    A
                  B

      C          D

A rectangle may be formed via the following

leftX = max(A.x,C.x) 
topY = min(A.y,B.y)
rightX = min(B.x,D.x)
botY = max(C.y,D.y)

rectA = point(leftX, topY)
rectB = point(rightX, topY)
rectC = point(leftX, botY)
rectD = point(rightX, botY)

【讨论】:

  • 感谢您的回答!我对这将产生“一个”矩形而不一定是可能的最大矩形吗?
  • 在我看来,可以想象,在某些情况下,可以通过“不断增加”来略微增加尺寸。但是,增加的幅度非常小(我估计在考虑目标数据集时最多增加 2%)。
  • 如果你有类似的东西,它会崩溃......想象一个三角形的顶部被切断,形成一个梯形。所以底部非常宽,顶部非常窄。通过连接这两个形成的矩形会非常小,在适当的条件下接近 0。显然,从这个意义上说,“中间道路”的方法会导致它变得更大(大约是梯形面积的一半。但鉴于你的例子,我的方法除了最简单之外,还将提供即使在面积方面不是最佳的,也可以获得足够和美观的效果。
  • 你说得对,这基本上就是我的目标。与此同时,我找到了这个网站:cgm.cs.mcgill.ca/~athens/cs507/Projects/2003/DanielSud 它解释了一个算法来做这件事,并提供了一个不使用算法但蛮力解决方案的小程序。不幸的是,小程序完全基于图形。我不知道您在 java 方面的情况如何,但也许可以编辑代码以便输入/输出值。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2015-05-13
  • 2014-07-05
  • 1970-01-01
  • 2013-05-23
  • 2013-03-05
  • 2023-04-11
相关资源
最近更新 更多