透视图像转换与平铺

3
在寻找一款能用于我计划创建的新应用程序的良好图像处理库。我将使用C#.NET (VS 2008)。
我的应用程序需要执行以下操作:
1.在启动时加载图像并在图片框中显示它。 2.我应该能够在图片框中的任何位置选择四个点(左上角,右上角,左下角,右下角)。 3.然后,我需要使用4个源点和目标点正确地转换源图像的透视图。
不仅如此,我需要最终输出图像为指定大小。我希望应用程序能够使用相同的透视图,并返回我指定的矩形大小的图像(而不是4个点的大小)。源图像需要被平铺和转换以产生完全适合指定区域的输出。
我尝试了一些库,如Aforge.NET、ImageMagick、EMGU等。有些很慢。有些只能生成小尺寸的透视图像。有些会出现内存错误。找不到一个合适的解决方案。
2个回答

3

好像是这样的。但最大的困难在于我不能简单地拉伸我的转换图像。随着尺寸的增加,必须使用一个新的适当平铺且具有相同透视的更大尺寸的图像。我只是想不出实现这一点的方法。希望这样说得清楚。 - over.drive
我不确定我是否理解正确。我认为那里的解决方案可以满足你的需求。你看过第三个示例图片了吗? - mafu
这是一张描述我所尝试实现的图片: http://www.4shared.com/photo/DCp6oFjR/TiledImage.html - over.drive
这也是可能的,通过使用正确的坐标多次复制原始图像 - 在这种情况下,副本目标不会是矩形而是梯形。但是,您需要自己计算相机角度的坐标,这需要一些数学知识,但应该不会太难(如果我估计正确的话)。 --- 图像显示“变换后”,源是什么?与转换后的图像相比,应用源图像是否更容易? - mafu
是的,我正在使用相同的想法。我使用源图像多次平铺以生成更大的图像,然后对其应用变换并剪切所需区域。但有几种情况下,图像太大,当我尝试应用变换时,会出现内存异常。现在我正在尝试限制生成图像的大小,并在最终图像中遮蔽其余部分。我想没有其他选择了。感谢mafultrct的帮助。非常感谢。 - over.drive

1

您可能想看一下这个链接,它可以解决部分问题或者引导您朝着正确的方向: 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.
    } 
}

顺便提一下,我相信.NET有一个2GB的对象内存限制,所以如果你正在处理非常大的图像,可能会遇到内存错误。


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