将图像拉伸以适应任何四边形

3
该应用程序PhotoFiltre具有一个选项,可以拉伸图像的某个部分。您选择一个矩形形状,然后可以抓住和移动顶点到其他地方,以创建任何四边形。您所选的图像部分将会被拉伸。希望这些图像能更加清晰地说明我的观点:

before

after

有没有一种通用算法可以处理这个问题?我想在HTML5画布上获得相同的效果 - 给定一幅图像和结果四个角点,我希望能够以使其填充新的四边形的方式绘制拉伸后的图像。
一段时间前,我问过 类似的问题,解决方法是将图像分成三角形,并拉伸每个三角形,以便每三个点对应原始图像上的三个点。但是这种技术被证明相当昂贵,我希望有更通用的方法来实现这一点。
我想在3D渲染器中使用它,但我想使用一个(2D)四边形。
我不知道PhotoFiltre内部是否也使用三角形,或者它是否使用另一种(更便宜的)算法来拉伸这样的图像。
是否有人知道是否有更便宜或更通用的方法/算法来拉伸矩形图像,以使其填充给定四个点的四边形?
2个回答

3

通常的方法是从目标开始,选择适当的网格大小,然后对于新形状中的每个点计算对应的源图像中的点(可能需要插值,具体取决于所需的质量)


非常感谢!我正在尝试一些东西。只是想补充一下,在更多搜索之后,我找到了这个网站:http://acko.net/files/projective/index.html。它看起来很有趣。 - pimvdb
这将占用很多性能。如何在不使用插件的情况下将其最小化? - user4196492

1

仿射变换。

给定“拉伸”图形的四个点和应匹配的图形(例如矩形)的四个点,仿射变换提供了所需的空间映射。对于原始图像中的每个点(x1,y1),在第二个“拉伸”图像中都有相应的点(x2,y2)。

对于拉伸图像中的每个整数值像素(x2,y2),使用仿射变换找到原始图像中相应的实值点(x1,y1),并将其颜色应用于(x2,y2)。

http://demonstrations.wolfram.com/AffineTransform/

你可以在网上找到Java和其他语言的示例代码。 .NET拥有矩阵类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接