2011-06-24 40 views
5

我需要獲得質量爲(質心)的質心,用於具有亞像素精度的一組二進制圖像中的組件。ComponentMeasurements [_,「質心」]結果偏移量

數學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.}} 
*) 

但我通過一些麻煩去當這些結果表明一些不一致的地方與其他地方做過其他計算。

所以我推出我自己的,也許不是很好:

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

你可以看到,有一個0.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

感覺爲ComponentMeasurements該文檔頁面包含溶液:

位置,面積和長度 測量座標系,其中位置 {0,0}對應於底部取出在標準 圖像左邊 角落,x從0到寬度運行,y 從0運行到高度。

你指望全像素和ComponentMeasurements措施像素位置。在這個系統中,左下角像素的中心位於{1/2,1/2}處。

+0

似乎就是這樣。當然,我在發佈之前已經閱讀過這篇文章,但我瞭解它,因爲它符合我的要求。現在我必須處理三種不同的座標系:ImageData []使用的座標系和Graphics []使用的另一個座標系,以及這一個。我需要給我的後綴加後綴,否則我會搞砸一切。非常感謝。 –

+1

也計入'MatrixPlot'和'ArrayPlot'。儘管如此,後者有'DataReversed'來設置事情的正確性。 –