2009-06-08 59 views
4

我一直在开发(最近3个小时)一个我在C#中做的小项目,以帮助我选择一个家。图像重映射算法

具体而言,我将犯罪统计数据放在Google地图上的叠加层上,以找到一个很好的邻居。

下面是一个例子: http://otac0n.com/Demos/prospects.html

现在,我手动发现的纬度和液化天然气,以匹配例如displated地图的角落,但我有一些更多的地图叠加。

我的新应用程序允许我选择一个地标并指向图像以将Pixel与LatLng绑定。喜欢的东西:

locations.Add(new LocationPoint(37.6790f, -97.3125f, "Kellogg and I-135")); 

// and later... 

targetPoint.Pixel = FindPixel(mouseEvent.Location); 

所以,我收集的像素/经纬度组合列表,现在想转换图像(使用仿射或非仿射变换)。

这里的目标是让每条街道排队。给定一个好的地图,唯一必要的转换是将地图从北向南旋转(现在我会对此感到满意)。但我不确定从哪里开始。

有没有人在C#中做图像转换的经验?我如何找到适当的旋转来使地图级别?

解决好制作好的地图的情况后,我最终希望能够覆盖手绘地图。这显然会导致最终图像严重失真,并且可能超出了第一次迭代的范围。但是,我不想开发一个系统,在未来这个系统将不可扩展。

+0

请注意标记问题时的提示提示。名称后面的数字小于10的任何标签可能都是错误的。避免创建新标签。 – 2009-06-08 14:40:42

回答

3

我不确定你到底要完成什么,但如果你想以适应三点多了一个地图,以上三点上一个又一个,基本上有两种方法可以去:

  1. 您可以尝试在点上创建三角网格,然后在每个三角形内应用不同的仿射变换,并获得分段线性变换。为了获得正确的啮合,您可能需要做点像Delaunay triangulation这样的点,其中qhull应该是您的首选。
  2. 您可以进行更高阶的转换,例如quad distortion,但可能很难找到适用于通用位置中任意数量点的解决方案。找到一本好的有限元方法书,阅读关于高阶等参元素的章节,不管是拉格朗日元素还是偶然性元素,它都会为您提供许多点到点的良好映射。这里有几个链接(12)可以让你自由行动。但请注意,数学内容是密集的...
+0

这几乎就是我所需要的。现在,在代码中尝试一下...我们会看看它是否像我需要的那样工作。 – 2009-06-09 19:38:23

2

在2D空间仿射变换可以由两组三个非线性2D点指定。在C#中,你可以使用下面的程序来计算相应的矩阵:

public static Matrix fit(PointF[] src, PointF[] dst) { 
     Matrix m1 = new Matrix(new RectangleF(0, 0, 1, 1), src); 
     m1.Invert(); 
     Matrix m2 = new Matrix(new RectangleF(0, 0, 1, 1), dst); 
     m2.Multiply(m1); 
     return m2; 
    } 

它适用于具有3个元素都阵列参数。

如果您只需要旋转和平移,然后你可以使用下面的程序:

public static Matrix fitOrt(PointF src1, PointF src2, PointF dst1, PointF dst2) { 
     return fit(new PointF[] { src1, src2, ort(src1, src2) }, 
       new PointF[] { dst1, dst2, ort(dst1, dst2) }); 
    } 

    public static PointF ort(PointF p, PointF q) { 
     return new PointF(p.X + q.Y - p.Y, p.Y - q.X + p.X); 
    } 

如果你想找到两套多点之间的最佳近似,那么你可以用这个http://elonen.iki.fi/code/misc-notes/affine-fit/

启动