图像重映射算法

时间:2009-06-08 05:36:36

标签: c# math google-maps image-processing image-manipulation

我一直在开发(最近3个小时)我在C#做的一个小项目,帮助我选择一个家。

具体来说,我将犯罪统计数据叠加在谷歌地图上,找到一个不错的社区。

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

现在,我手动发现Lat和Lng与示例中位移的地图角相匹配,但我还有一些要覆盖的地图。

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

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

// and later...

targetPoint.Pixel = FindPixel(mouseEvent.Location);

所以,我收集了一个像素/ latlng组合列表,现在想要转换图像(使用仿射或非仿射变换)。

这里的目标是让每条街道排成一行。给定一张好的地图,唯一必要的转换就是轮换从北到南排列地图(现在我会对此感到满意)。但我不知道从哪里开始。

有没有人在C#中进行图像转换的经验?如何找到正确的旋转以使地图水平?

在精心制作的地图解决后,我最终希望能够叠加手绘地图。这显然会导致最终图像的严重失真,并且可能超出了第一次迭代的范围。但是,我不希望开发一个将来无法扩展到该系统的系统。

3 个答案:

答案 0 :(得分:3)

我不确定你想要完成什么,但是如果你想在一张地图上超过三个点而在另一个地图上超过三个点,你基本上有两种方法可以去:

  1. 您可以尝试在点上创建三角形网格,然后在每个三角形中应用不同的仿射变换,并获得分段线性变换。为了使网格划分正确,您可能需要执行类似Delaunay triangulation点的操作,qhull可能是您的首选选项。
  2. 您可以进行更高阶的转换,例如quad distortion,但可能很难找到适用于通用位置中任意数量的点的解法。找到一本好的有限元方法书,并阅读高阶等参数元素的章节,无论是拉格朗日元素还是偶然元素元素,它们将为您提供许多点到多点的良好映射。以下是一些链接(12),可帮助您顺利开展工作。但要注意数学内容是密集的......

答案 1 :(得分: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/

开始

答案 2 :(得分:0)

美丽。

所以,感谢Jamie的指示,我发现了这个:

.NET 2.0中的Delaunay三角剖分

http://local.wasp.uwa.edu.au/~pbourke/papers/triangulate/morten.html

此时,这已经非常简化为lerping。