2011-06-24 12 views
5

Necesito obtener el Center of Mass (Centroide) para los componentes en un conjunto de imágenes binarias con precisión subpixel.ComponentMeasurements [_, "Centroid"] resultados offset

Mathematica 8 viene con una buena adición:

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

Pero pasó por algunas dificultades cuando esos resultados mostraron algunas inconsistencias con otros cálculos hechos en otros lugares.

Así que rodó mi propia, tal vez no es agradable:

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

Se puede ver que hay un 0,5 desplazamiento entre estos resultados:

Thread[Subtract[m1, f[i]]] 
(* 
-> {{-0.5, -0.5, -0.5, -0.5}, {0.5, 0.5, 0.5, 0.5}} 
*) 

Al principio me pensó que el problema estaba relacionado con las dimensiones de la imagen que eran pares o impares, pero ese no es el caso.

Preferiría usar ComponentMeasurements[ ..,"Centroid"] y corregir los resultados, pero me temo que las futuras versiones de Mma pueden modificar este comportamiento y echar a perder los resultados.

También podría ejecutar una "calibración" previa con una imagen conocida y calcular los desplazamientos, por lo que se autocorregirá, pero me gustaría entender lo que está sucediendo primero.

¿Esto es un error?
¿Alguna idea sobre por qué sucede esto?

+1

supongo que esto podría tener que ver con la convención en la que los centros de píxeles se encuentran en relación con la cuadrícula de coordenadas. Si un algoritmo supone que la cuadrícula de coordenadas se alinea con los límites de los píxeles y el otro asume que la cuadrícula está alineada con los centros de píxeles, se obtienen resultados inconsistentes. –

Respuesta

6

siento la página doc para ComponentMeasurements contiene la solución:

Posición, área y longitud mediciones se toman en la imagen de la norma sistema de coordenadas donde la posición {0,0} corresponde a la parte inferior -fuera de esquina, x se extiende de 0 a ancho, y y se extiende de 0 a alto.

usted está contando píxeles enteros y ComponentMeasurements medidas de píxeles posiciones. En este sistema, el centro del píxel inferior izquierdo está en {1/2,1/2}.

+0

Parece que es eso. Por supuesto que lo leí antes de publicarlo, pero lo entendí tal como me quedaba. Ahora tengo que ocuparme de tres sistemas de coordenadas diferentes: el utilizado por ImageData [], el otro utilizado por Graphics [] y este. Tendré que ponerle un sufijo a mis vars, o lo estropearé todo. Muchas gracias. –

+1

Cuente también en 'MatrixPlot' y' ArrayPlot'. Sin embargo, este último tiene 'DataReversed' para arreglar las cosas. –