2011-06-24 7 views
5

サブピクセル精度のバイナリイメージのコンポーネント内のコンポーネントの中心(セントロイド)を取得する必要があります。ComponentMeasurements [_、 "Centroid"]結果のオフセット

のMathematica 8は素晴らしい追加が付属しています:

i = [email protected]"http://i.stack.imgur.com/2pxrN.png"; 
m1 = ComponentMeasurements[MorphologicalComponents[i], "Centroid"] /. 
                   Rule[_, x_] -> x 
(* 
-> {{403.229, 453.551}, {660.404, 371.383}, {114.389, 434.646}, {295.5, 206.}} 
*) 

しかし、これらの結果は、他の場所で行われ、他の計算をして、いくつかの矛盾を示したとき、私はいくつかのトラブルを通り抜けました。

だから私は多分素敵ではない、自分の圧延:

あなたは、これらの結果の間のオフセット0.5があることがわかります
i = [email protected]"http://i.stack.imgur.com/2pxrN.png"; 
f[i_] := [email protected]{#[[2]], ImageDimensions[i][[2]] - #[[1]]} & /@ 
     (Mean /@ 
      Function[x, Map[ 
       Position[x, #, 2] &, 
       Complement[[email protected][x], {0}]]] 
      [MorphologicalComponents[i]]); 
f[i] 
Show[i, Graphics[{Red, Disk[#, 10] & /@ f[i]}]] 
(* 
-> {{403.729, 453.051}, {660.904, 370.883}, {114.889, 434.146}, {296., 205.5}} 
*) 

enter image description here

Thread[Subtract[m1, f[i]]] 
(* 
-> {{-0.5, -0.5, -0.5, -0.5}, {0.5, 0.5, 0.5, 0.5}} 
*) 

最初に私が問題は画像の大きさが偶数か奇数かに関係していると考えましたが、そうではありません。

私はComponentMeasurements[ ..,"Centroid"]を使用して結果を修正することをお勧めしますが、将来のMmaのバージョンがこの動作を修正し、結果を損なう恐れがあります。

既知の画像で以前の「キャリブレーション」を実行してオフセットを計算することもできるので、自動的に修正されますが、最初に何が起こっているのかを理解したいと思います。

これはバグですか?
これはなぜ起こっているのですか?

+1

これは、ピクセル中心が座標グリッドを基準にして配置されている規則に関係していると思います。 1つのアルゴリズムで座標グリッドがピクセル境界に揃えられ、他のアルゴリズムでグリッドがピクセル中心に揃えられていると仮定すると、矛盾した結果が得られます。 –

答えて

6

IはComponentMeasurements用ドキュメントページは溶液が含ま感じる:

位置、面積、長さ 測定が位置 {0,0}が底に相当標準 画像座標系に取り込まれます-left コーナー、xは0から幅まで、y は0から高さまでです。

あなたが全体のピクセルと ComponentMeasurements対策ピクセル 位置を数えています。このシステムでは、左下の画素の中心は{1/2,1/2}である。

+0

そうです。もちろん、私はそれを投稿する前に読んだことがありますが、私がそれに当てはまると理解しました。今度はImageData []とGraphics []で使われている座標系の3種類の座標系を扱っています。私はヴァルスの接尾辞を付ける必要があります、または私はすべてを台無しにするでしょう。どうもありがとう。 –

+1

'MatrixPlot'と' ArrayPlot'にも数えます。後者には物事をまっすぐに設定する 'DataReversed'があります。 –

関連する問題