2009-06-08 10 views
4

私はCを使って私が家を選ぶのを助けるためにやっている小さなプロジェクトを(過去3時間)開発してきました。画像の再マッピングアルゴリズム

具体的には、すばらしい近所を見つけるために、犯罪統計をGoogleマップのオーバーレイに入れています。ここで

は一例です。 http://otac0n.com/Demos/prospects.html

今、私は手動での例ではdisplatedマップの角を一致させるために緯度とLNGを見つけましたが、私はオーバーレイするいくつかのより多くのマップを持っています。

私の新しいアプリケーションでは、ランドマークを選択し、画像をポイントしてピクセルをLatLngに結び付けることができます。ような何か:

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

// and later... 

targetPoint.Pixel = FindPixel(mouseEvent.Location); 

だから、私はピクセル/緯度経度の組み合わせのリストを集めてきた、そして今(アフィンまたは非アフィン変換を使用して)画像を変換したいと思います。

ここでの目標は、すべてのストリートラインを上げることです。良い地図が与えられれば、必要な変換は地図を北から南に向けるためのローテーションだけです(今のところ私はそれに満足しています)。しかし、私はどこから始めるべきかわかりません。

誰でもC#で画像変換を行っている経験はありますか?マップレベルを作るために適切なローテーションを見つけ出すにはどうすればよいでしょうか?

うまく作られたマップが解決された後、最終的に手書きのマップをオーバーレイすることができるようになります。これは、明らかに最終画像のひどい歪みを伴い、この最初の反復の範囲を超えている可能性がある。しかし、私は将来、このシステムに拡張不可能なシステムを開発したくありません。

+0

質問にタグを付ける際の提案のプロンプトに注意してください。名前の後に10未満の数字を持つタグはおそらく間違っています。新しいタグの作成は避けてください。 –

答えて

3

私は正確にあなたが達成したい何をすべきかがわからないんだけど、あなたは別の1の3点以上への1つのマップ上で3点以上にフィットするようにしたい場合は、あなたが行くことができる2つの方法基本的にあります。

は、
  1. ポイント上に三角形のメッシュを作成し、各三角形内に異なるアフィン変換を適用して、区分的に線形変換することができます。メッシングが正しくなるようにするには、Delaunay triangulation点のようなものを実行する必要があります。qhullが望ましいオプションになるはずです。
  2. quad distortionのような高次の変換を行うことはできますが、一般的な位置にある任意の数の点に対応する解を見つけるのは難しいでしょう。良い有限要素法の本を見つけて、高次アイソパラメトリック要素(lagrangianまたはserenndipity要素)の章を読んでください。これは、多くのポイントから多くのポイントのマッピングがうまく行えます。あなたのためにあなたを設定するための2つのリンク(12)があります。しかし、数学の内容は集中的であることに注意してください。
+0

これは私が必要としていたものとほぼ同じです。さて、コードで試してみてください...私が必要なように動作するかどうかを確認します。 –

+0

ここで、ビットマップ全体を三角形の辺の外側に補間したいと思います。私は生成されたVoronoiダイアグラムに基づいて補間を続けるか... soemthing ...ここで暗闇の中で撮影。 –

+0

アフィン変換は、それを定義する3つの点によって形成された三角形の外側に広がります。この画像のDelaunay三角測量を取る: http://upload.wikimedia.org/wikipedia/commons/c/cb/Delaunay_Voronoi.png メッシュの端にある各三角形で定義されたアフィン変換は、次のように拡張できます。三角形の外側の無限大。あるトランスフォームから別のトランスフォームへのトランジションを定義する際は注意が必要です。そのイメージは、それを行う方法に関するアイデアを刺激します。隣接するVoronoiの辺によって形成された角度を二等分するDelaunayの頂点からの線。 – Jaime

2

アフィン変換は、2組の3つの非線形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); 
    } 

あなたが複数のポイントの2つのセットの間の最良の近似を見つけるしたい場合、あなたはこのhttp://elonen.iki.fi/code/misc-notes/affine-fit/

で始めることができます