Смещение результатов ComponentMeasurements [_, "Centroid"] - PullRequest
5 голосов
/ 24 июня 2011

Мне нужно получить Центр масс (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}}
*)

enter image description here

Вы видите, что между этими результатами есть смещение .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 могут изменить это поведение и испортить результаты.

Я мог бы также выполнить предыдущую «калибровку» с известным изображением и рассчитать смещения, чтобы она автоматически исправлялась, но я хотел бы понять, что происходит в первую очередь.

Это ошибка?
Есть идеи о том, почему это происходит?

1 Ответ

6 голосов
/ 24 июня 2011

Я чувствую, что страница документа для ComponentMeasurements содержит решение:

Измерения положения, площади и длины выполняются в стандартной системе координат изображения, где положение {0,0} соответствуетнижний левый угол, x - от 0 до ширины, а y - от 0 до высоты.

Вы считаете целые пиксели, а ComponentMeasurements измеряет пиксель позиции .В этой системе центр нижнего левого пикселя находится в {1 / 2,1 / 2}.

...