Algorithm 寻找四边形内的最大矩形

Algorithm 寻找四边形内的最大矩形,algorithm,math,Algorithm,Math,最近,我扫描了很多专辑封面,试图将我的音乐收藏数字化。扫描后的默认过程是旋转和裁剪 对于旋转,重要的是找到一条或多条参考线。旋转后,“正常”线将或多或少水平(或垂直),奇数线将稍微倾斜。可以区分两种“不同”的旋转: 注:两个四边形是两个专辑封面。你可以把相册封面上的两行想象成两行印刷品。所有参考线均为粗体。你可能想知道为什么专辑封面不仅仅是矩形,但请注意,这张图片被夸大了。也就是说,如果你仔细观察过专辑封面,你会发现它们很少接近矩形 在情况A中,很明显,大多数封面边缘平行并形成90度角,和/或

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

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

注:两个四边形是两个专辑封面。你可以把相册封面上的两行想象成两行印刷品。所有参考线均为粗体。你可能想知道为什么专辑封面不仅仅是矩形,但请注意,这张图片被夸大了。也就是说,如果你仔细观察过专辑封面,你会发现它们很少接近矩形

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

在情况B中,大多数线条看起来不规则,打印看起来正常。我最好用印刷品作为参考

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

虽然上面提到的不是实际问题的一部分,但我认为首先了解背景信息对你来说是有用的。我们现在已经到了裁剪阶段,这一部分一直困扰着我

我的问题很简单:如果我必须裁剪任何专辑封面,我如何才能裁剪出这样一种方式,让我拥有专辑封面的最大部分?换言之,如何找到四边形内形成最大可能矩形的4个值


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

如果您接受给定矩形将与现实世界中的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)

如果接受给定矩形将与现实世界中的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)

矩形是否应与真实世界的x轴和y轴对齐?或者矩形可以相对于真实世界旋转吗?图像中的两个盖子已经旋转,这意味着参考线是水平的,即与真实世界的x轴对齐。因为我在最后一张图像中也希望这样,所以裁剪矩形也必须与真实世界的x轴对齐。矩形应该与真实世界的x轴和y轴对齐吗?或者矩形可以相对于真实世界旋转吗?图像中的两个盖子已经旋转,这意味着参考线是水平的,即与真实世界的x轴对齐。因为我也希望在我的最终图像中,裁剪矩形也必须与现实世界的x轴对齐。谢谢你的回答!我认为这会产生一个“a”矩形,而不一定是最大的矩形,这是对的吗?我想到,可以想象,在某些情况下,你可以通过“向上”和“向上”来稍微增加大小。然而,增长将非常小(当你考虑目标数据集时,我估计最多2%)。如果你有类似的事情,它会崩溃。想象一下,一个三角形的顶部被切断,形成一个梯形。所以底部很宽,顶部很窄。通过连接这两个元素而形成的矩形将非常小,在适当的条件下接近0。显然,从这个意义上讲,一种“中间路线”的方法会使它变得更大(大约是梯形面积的一半。但是给你的例子,我的方法除了最简单外,还能提供足够的美学效果,即使在面积方面不是最理想的。你是对的,这基本上就是我的目标。与此同时,我发现了这个网站:它解释了一种算法,并提供了一个小程序,不使用该算法,但使用暴力解决方案。不幸的是,该小程序完全基于图形。我不知道您在java方面的情况如何,但也许可以编辑代码,以便可以输入/输出值。谢谢您的回答!这将生成“a”矩形,而不一定是最大的矩形,对吗对我来说,在某些情况下,可以通过“上下”来增加尺寸,这是可以想象的。但是,增长将非常小(当你考虑目标数据集时,我估计最大2%)。。如果你有这样的东西,它就会崩溃…想象一个三角形,顶部被切断,形成一个梯形。因此,一个非常宽的底部,一个非常窄的顶部。通过连接这两个形成的矩形将非常小,在适当的条件下接近0。显然,在这种意义上的“中间道路”方法会导致我想它要大得多(大约是梯形面积的一半。但是给你的例子,我的方法除了最简单外,还能提供足够的美学效果,即使在面积方面不是最理想的。你是对的,这基本上就是我的目标。与此同时,我发现了这个网站:它解释了一种算法,并提供了一个小程序,它不使用算法,而是暴力解决方案。不幸的是,这个小程序完全是基于图形的。我不知道你在java的情况如何,但也许可以编辑代码,以便可以输入/输出值。