サブピクセル精度のバイナリイメージのセット内のコンポーネントの重心(重心)を取得する必要があります。
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バージョンではこの動作が変更され、結果が損なわれる可能性があります。
既知の画像を使用して以前の「キャリブレーション」を実行し、オフセットを計算することもできるので、自動修正されますが、最初に何が起こっているのかを理解したいと思います。
これはバグですか?
なぜこれが起こっているのかについてのアイデアはありますか?