dic 03 2007

Medir sobre figuras con python

Tag: Herramientas y Programaciónahc @ 11:42

Actualización: Hay una nueva versión de Srip disponible en la página web del proyecto.

Cuando en una publicación -del tipo que sea- queremos mostrar un conjunto de datos numéricos que guardan cierta relación entre sí, la forma habitual de hacerlo es mediante una tabla o un gráfico. A menudo, el gráfico es preferible porque la distribución de los valores salta a la vista, y permite una comprensión cualitativa de la información representada mucho más rápida y eficiente que la lectura de valores en una tabla. Por otro lado, cualquier análisis cuantitativo requerirá disponer de los valores numéricos tabulados.

 

Representar los datos gráficamente, si se dispone de una tabla, es una tarea trivial y rápida si se utiliza un ordenador. El proceso inverso -el de recuperar los valores numéricos representados en una figura- suele ser tedioso e impreciso, porque en general el ordenador no puede hacerlo y es necesario que el usuario lea los valores manualmente, uno por uno, y a menudo con la dificultad añadida de escalas logarítmicas en los ejes o pocas marcas de referencia.
captura de sripPor desgracia, es muy habitual que necesitemos utilizar información numérica que sólo está disponible en forma de gráficos. En astrofísica, casos comunes son las curvas de transmisión de filtros, de eficiencia de detectores, espectros, cartas de localización de astros, diagramas color-magnitud, etc etc.

 

Para facilitar la tarea del investigador que necesita medir valores sobre un gráfico, he escrito un programa en python que, aunque aún está en fase de desarrollo, ya ha facilitado la vida a más de uno.

 

El mecanismo de funcionamiento es muy simple: se calibra la imagen que contiene el gráfico para establecer una correspondencia entre las coordenadas en píxeles de la imagen, y las unidades físicas representadas en los ejes del gráfico. A continuación, el usuario simplemente marca los puntos de la imagen que quiere medir y obtiene sus valores en las unidades físicas.

 

La calibración consiste en marcar una serie de puntos (bastan dos para la coordenada X y otros dos para la Y) para los que conocemos su valor en unidades físicas (por ejemplo, las marcas en los ejes del gráfico), e indicarle al programa cuál es este valor.

 

Si los píxeles p0 = (px0,py0) y p1 = (px1,py1) tienen valores físicos v0 = (vx0,vy0) y v1 = (vx1,vy1), entonces para cualquier otro pixel p la correspondencia será:

 

v = v0 + (p - p0)(v1-v0)/(p1-p0)

si la escala de los ejes es lineal, y:

 

v = v0 exp[(p - p0) ln(v1/v0)/(p1-p0)]

si es logarítmica.
captura de srip
Con la imagen calibrada, las mediciones se realizan simplemente haciendo click sobre la imagen, y las coordenadas físicas de los puntos marcados van apareciendo en una tabla. La incertidumbre en la medida es del equivalente a un píxel en las unidades físicas -si se tiene buen pulso al marcar- y puede reducirse haciendo zoom sobre la imagen.

 

El código, disponible aquí, está escrito en python y usa la librería Numeric para los cálculos y pyGTK para la interfaz gráfica. Requiere ImageMagik (convert) para rotar/escalar la imagen original, y puede utilizarse con prácticamente cualquier formato de imagen.