.NET中的非仿射图像变换

7

在.NET库中是否有任何类、方法或一般算法来执行非仿射变换?(即涉及除旋转、缩放、平移和剪切之外的更多变换)

e.g.:

alt text

alt text
(来源:last100.com)


除了非仿射变换,还有其他术语吗?

3个回答

9
我不知道.Net中是否有任何集成的内容可以让你进行非仿射变换。我猜你正在尝试进行某种形式的3D纹理映射?如果是这样,你需要一个均匀的仿射变换,但在.Net中不可用。我也不知道有任何集成的方法来进行像素位移变换。然而,目前投票最多的解决方案可能适合你想做的事情,只要注意它不会直接进行透视校正。例如:左边的图片是使用Neil N提供的单个四边形失真库生成的,右边的图片是使用DirectX中的单个四边形(实际上是两个三角形)生成的。这可能对你正在尝试做的事情没有任何影响,但如果你想做3D东西,没有透视正确的映射,它看起来会非常奇怪。

不,我们有一个iPod,并且我看到了页面包装能力。我感到非常恶心,一个微小的嵌入式设备和闪存可以实现花哨的转换效果,但是一台运行着世界上最先进操作系统的Core2 Duo却不能做到。 - Ian Boyd
通过Neil提供的链接,你可以做你想做的事情。它可以产生不错的3D效果,虽然不是透视正确的,但如果你的多边形保持小的话,这应该不会有影响。 - Coincoin
1
Neil N:这个算法是一个四边形映射器,它所做的是仿射映射。只有2D坐标,这不可能进行透视正确的映射。如果在看完我的评论后你仍然有疑问,我邀请你去了解一下“透视正确纹理映射”的概念。 - Coincoin
Coincoin,计算角落交点是一种透视校正的方法。这可能不是您熟悉的方法,但它是有效的。您甚至可以将其与其他透视校正方法进行比较测试,您将看不到任何区别。这是事实。 - Neil N
我更新了我的答案,更详细地说明了使用简单扭曲与透视校正可能出现的问题。正如您所看到的,我对库进行了透视校正方法(DirectX)的测试,差异是明显的。 - Coincoin
显示剩余7条评论

8
你发布的所有示例图像都可以使用四边形畸变完成。尽管我不能确定四边形畸变是否能够覆盖所有非仿射变换。
这里是一个C#中不太好的实现链接...它可以工作,但速度很慢。在维基百科上查找可用于这些计算的许多不同优化。

http://www.vcskicks.com/image-distortion.html

-Neil

1
虽然我不能确定四边形扭曲能够覆盖所有非仿射变换。它不会,有很多事情四边形扭曲无法完成。但这是一个很好的开始。 - kquinn

1

您可以使用WPF中的Viewport3D控件和非仿射变换矩阵来实现此操作。再次将其渲染为位图可能会很有趣...我通过在我的纹理平面上包含一个不可见的<image>控件并使用相同的图像来"修复"它...(另外,我不得不通过分割平面和裁剪图像来解决最大纹理大小问题...)

http://www.charlespetzold.com/blog/2007/08/060605.html

在我的情况下,我想要相反的结果(将变形图上的任意点转换为矩形窗口的角落),这就是执行相反操作的矩阵的逆。

哦,Charles Petzold也发布了如何在Silverlight 3中使用Matrix3dProjection的方法:http://www.charlespetzold.com/blog/2009/07/Using-the-Matrix3DProjection-Class-in-Silverlight-3.html - sphereinabox

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