首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像重绘算法

问图像重绘算法
EN

Stack Overflow用户
提问于 2009-06-08 05:36:36
回答 3查看 2K关注 0票数 4

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

具体来说,我把犯罪统计数据放在谷歌地图上,以找到一个很好的社区。

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

现在,我手动找到了Lat和Lng,以匹配地图的角落在这个例子中,但我有更多的地图要覆盖。

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

代码语言:javascript
复制
locations.Add(new LocationPoint(37.6790f, -97.3125f, "Kellogg and I-135"));

// and later...

targetPoint.Pixel = FindPixel(mouseEvent.Location);

因此,我收集了一个像素/最近组合的列表,现在我想要转换图像(使用仿射或非仿射转换)。

这里的目标是让每条街都排好队。如果有一张好的地图,唯一必要的转换就是将地图从北向南排列(现在我会对此感到满意)。但我不知道从哪里开始。

有人有在C#中进行图像转换的经验吗?我如何找到适当的旋转以使地图水平?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-09 15:33:15

我不知道你到底想完成什么,但如果你想在一张地图上把三个以上的点与另一个地图上的三个以上的点相匹配,基本上有两种方法可以实现:

  1. 你可以尝试在你的点上创建一个三角形网格,然后在每个三角形中应用一个不同的仿射变换,然后得到一个分段线性变换。为了正确地划分网格,您可能需要做一些类似于点的Delaunay三角剖分的操作,对于这些点,qhull可能是您首选的选项。
  2. 您可以进行更高级别的转换,例如四次失真,但是很可能很难找到适用于泛型位置中任意多个点的解决方案。找一本好的有限元方法书,阅读关于高阶等参单元的章节,无论是拉格朗日元素还是偶然的元素,这将为你提供许多点到多点的良好的映射。这里有几个链接(1和2),可以让您在路上使用。但要注意数学内容是密集的..。
票数 3
EN

Stack Overflow用户

发布于 2009-06-08 13:54:02

在二维空间中,仿射变换可由三组非线性二维点组成。在C#中,您可以使用以下例程来计算适当的矩阵:

代码语言:javascript
复制
    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个元素的两个数组参数。

如果只需要旋转和平移,则可以使用以下例程:

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2009-06-09 19:55:35

漂亮的。

所以,多亏了杰米的指导,我找到了这个:

Delaunay三角剖分在.NET 2.0中的应用

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

在这一点上,这几乎被简化为lerping。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/963533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档