2011-06-24 37 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'来设置事情的正确性。 –