5

サブピクセル精度のバイナリイメージのセット内のコンポーネントの重心(重心)を取得する必要があります。

Mathematica8には素晴らしい追加機能があります。

i =  Import@"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.}}
*)

しかし、それらの結果が他の場所で行われた他の計算といくつかの矛盾を示したとき、私はいくつかの問題を経験しました。

だから私は自分自身を転がしました、おそらく良くありません:

i = Import@"http://i.stack.imgur.com/2pxrN.png";
f[i_] := N@{#[[2]], ImageDimensions[i][[2]] - #[[1]]} & /@
         ( Mean /@
             Function[x, Map[
                Position[x, #, 2] &,
                Complement[Union@Flatten[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}}
*)

ここに画像の説明を入力してください

これらの結果の間に.5オフセットがあることがわかります。

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

最初は、画像の寸法が偶数または奇数であることに問題があると思いましたが、そうではありません。

結果を使用して修正したいComponentMeasurements[ ..,"Centroid"]のですが、将来のMmaバージョンではこの動作が変更され、結果が損なわれる可能性があります。

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

これはバグですか?
なぜこれが起こっているのかについてのアイデアはありますか?

4

1 に答える 1

6

ComponentMeasurementsのドキュメントページに解決策が含まれていると思います。

位置、面積、および長さの測定は、標準の画像座標系で行われます。位置{0,0}は左下隅に対応し、xは0から幅まで、yは0から高さまでです。

ピクセル全体をカウントし、ピクセル位置ComponentMeasurementsを測定します。このシステムでは、左下のピクセルの中心は{1 / 2,1/2}にあります。

于 2011-06-24T19:23:23.090 に答える