2009-06-08 88 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/

啓動