透视图像畸变

4
我目前正在开发的应用程序需要透视图像畸变功能。基本上,我想让用户将图像加载到应用程序中,并根据他们可以指定的4个角点调整其透视视图属性。
我查看了ImageMagic。它具有一些扭曲功能,包括透视调整,但速度非常慢,某些特定输入会产生错误的输出。
你们有没有使用过其他库或算法。我在C#中编码。
任何指针都将不胜感激。
谢谢

请参见"问题标题中是否应包含“标签”?",共识是“不应该”! - user57508
5个回答

6
这似乎正是你(和我)一直在寻找的内容: http://www.codeproject.com/KB/graphics/YLScsFreeTransform.aspx 它将使用您提供的4个X/Y坐标来扭曲图像。
这是快速、免费、简单的代码。经过测试,它可以完美地工作。只需从链接中下载代码,然后像这样使用FreeTransform.cs:
using (System.Drawing.Bitmap sourceImg = new System.Drawing.Bitmap(@"c:\image.jpg")) 
{ 
    YLScsDrawing.Imaging.Filters.FreeTransform filter = new YLScsDrawing.Imaging.Filters.FreeTransform(); 
    filter.Bitmap = sourceImg;
    // assign FourCorners (the four X/Y coords) of the new perspective shape
    filter.FourCorners = new System.Drawing.PointF[] { new System.Drawing.PointF(0, 0), new System.Drawing.PointF(300, 50), new System.Drawing.PointF(300, 411), new System.Drawing.PointF(0, 461)}; 
    filter.IsBilinearInterpolation = true; // optional for higher quality
    using (System.Drawing.Bitmap perspectiveImg = filter.Bitmap) 
    {
        // perspectiveImg contains your completed image. save the image or do whatever.
    } 
} 

2
这不是一个观点。看看这个:http://forums.getpaint.net/index.php?/topic/16197-perspective-effect-v20-update-030510/ - ironic
讽刺的是:这段代码已经足够接近透视了。如果程序员愿意,他们可以处理更多的代码/开销,这只是在每个项目的需求中找到平衡点的问题。 - Doug S
2
@ironic是正确的:这不是透视,而是梯形变换,比透视容易得多。 - Fortega
再说一遍...你可以整天纠结于细节。如果你想要技术上的精确,那么没有什么是“完美无缺的视角”。你越想接近完美,就会在其他方面做出更多的妥协。在大多数情况下,速度/简洁与准确性之间存在权衡。所以你需要决定你的优先级和你想要的权衡。 - Doug S
1
@DougS,让我澄清一下我的需求:需要进行一种转换,以创建一个与通常3D渲染产生的图像匹配(在像素定位方面)。因此,梯形变换是相当无用的。 - ironic
显示剩余3条评论

2

@igor brejc:非常好的补充!仅针对转换可能有些过度,但是这是一个很好的信息来源。 - Emond

2
如果这是一个透视变换,你应该能够指定一个4x4的变换矩阵,以匹配四个角。计算该矩阵,然后将结果图像上的每个像素应用于该矩阵,得到“映射”像素。请注意,“映射”像素很可能位于两个甚至四个像素之间。在这种情况下,使用您喜欢的插值算法(例如双线性、双三次)来获取插值颜色。
这确实是唯一的方法,不能更快地完成。如果这个功能非常重要,而且你绝对需要它快速完成,那么你需要将任务卸载到GPU上。例如,你可以调用DirectX库在纹理上应用透视变换。即使没有GPU,这也可以使它非常快,因为DirectX库使用SIMD指令加速矩阵计算和颜色插值。

1
YLScsFreeTransform无法如预期般工作。更好的解决方案是ImageMagic
以下是在C#中使用它的方法:
using(MagickImage image = new MagickImage("test.jpg"))
{
    image.Distort(DistortMethod.Perspective, new double[] { x0,y0, newX0,newY0, x1,y1,newX1,newY1, x2,y2,newX2,newY2, x3,y3,newX3,newY3 });
    control.Image = image.ToBitmap();
}

请解释一下 YLScsFreeTransform 为什么“没有按预期工作”。 - Doug S
因为 YLScsFreeTransform 方法的参数较少,无法正确应用扭曲方法,导致结果与预期不符。 - GO.exe
1
“与意图无关”?原帖仅想要“将图像加载到应用程序中,并根据4个角点调整其透视视图属性”。 YLScsFreeTransform可以做到这一点。听起来你是在说它不能满足你的需求,但这与原帖的问题无关。 - Doug S
+1 非常好的建议,使用ImageMagic。它帮助我发现了很多东西。但是对于你的示例,你需要添加 image.VirtualPixelMethod = VirtualPixelMethod.Transparent; - 41686d6564 stands w. Palestine

1

我曾经遇到过相同的问题。这是演示代码,源自于gimp


非常有帮助!非常感谢! - Gope

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