Friday, June 30, 2006

Un pequeño código en awk para crear imágenes a partir de una lista de números reales

El truco de hoy consiste en lo siguiente. Supongamos que hemos hecho una simulación de un problema en dos dimensiones, o en una pero queremos representar en una figura el espacio (eje x) y el tiempo (eje y). Podemos integrar una rutina en nuestro código (lo cual lo ralentiza) o podemos crear la imagen mediante un software de visualización (por ejemplo MATLAB).

Lo que yo os propongo es más sencillo, utilizar un pequeño script basado en la shell bash y en el potentísimo awk (o gawk) para crearlo.

Así, supongamos que tenemos un fichero con una lista (o matriz) que contiene los dimension_x*dimension_y valores de nuestra figura (por ejemplo en un problema de crecimiento para un sistema 100x100, el fichero sería una lista de 10000 líneas que contienen el valor de la altura en cada uno dos los 100x100 puntos). Se supone que ese fichero lo crea nuestra aplicación.

Una vez que tenemos ese fichero (llamémosle height.dat), creamos un fichero de texto (llamado, p. ej. array2pnm) que contenga la siguiente información




#!/bin/bash

if [ $# -ne 3 ]; then
echo "Sintaxis: $0 Nx Ny fichero_de_entrada "
exit
fi

awk '
BEGIN{max=-100000000; min=100000000;}
{
for (i=1;i<=NF;i=i+1){
if (max<$i) max=$i; if(min>$i) min=$i;
}
}
END{print max,min}' $3 | awk -v Nx=$1 -v Ny=$2 '
BEGIN{print "P2\n#\n\n" Nx,Ny "\n65535"}
NR==1 {
max=$1;
min=$2;
}
{
for(i=1;i<=NF;i=i+1)
print int(($i-min)*65535/(max-min))
}' - $3 >$3.pnm



Y lo ejecutamos con la siguiente sintaxis

./array2pnm 100 100 height.dat

Este comando creará el fichero "height.dat.pnm" que se puede visualizar con cualquier programa (por ejemplo display). Si queremos convertirlo a otro formato existen infinidad de librerías. Yo os recomiendo que instaléis el paquete ImageMagick que viene con todas las distribuciones de Linux. Tiene un programa llamado "convert" que hace todo el trabajo.

Por ejemplo

convert height.dat.pnm height.gif

Y ya está...

Hoy empieza todo (esto)

Espero poder dedicar algo de tiempo a este blog y que os resulte de utilidad. Algunas de las cosas que publicaré me han costado algo de tiempo aprenderlas (por mi ineptitud) y espero que os resulten de utilidad.

Bienvenidos, y hasta el próximo "post".