Мне нужно получить Центр масс (Centroid) для компонентов в наборе двоичных изображений с субпиксельной точностью.
Mathematica 8 поставляется с приятным дополнением:
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 могут изменить это поведение и испортить результаты.
Я мог бы также выполнить предыдущую «калибровку» с известным изображением и рассчитать смещения, чтобы она автоматически исправлялась, но я хотел бы понять, что происходит в первую очередь.
Это ошибка?
Есть идеи о том, почему это происходит?