(Aviso a navegantes: artículo práctico destinado principalmente a linuxeros con cámara de fotos digital. Quedan advertidos.)
Ésa de ahí arriba es una de las fotografías que saqué en mi reciente viaje a Londres. Así de lejos parece muy mona pero, si nos acercamos un poco, se ve algo muy feo:

¡Darwin está mirando fijamente a un píxel azul! Los píxeles calientes (aparecen normalmente rojos o azules) y los píxeles muertos (aparecen negros) están causados por fallos en el funcionamiento del CCD de la cámara. Suelen aparecer más cuanto más larga es la exposición de la imagen.
A los pocos días de comprar esta cámara que tengo ahora, en verano, encontré uno muy cantoso en una esquina, de color rojo. El servicio técnico me reparó la cámara, aunque se tiró su buen mes para hacerlo. Mientras buscaba por Internet qué era exactamente lo que hacían (me extrañaba la idea de que sustituyesen el CCD entero), leí que las cámaras internamente llevan un registro de qué píxeles están jodidos y su ubicación exacta, con lo que los ignoran a la hora de hacer la fotografía y utilizan para rellenar el hueco un valor sacado de la interpolación de los píxeles adyacentes. Al volver de Londres encontré otros dos puntos azules, pero me daba mucha pereza volver a enviar la cámara, sobre todo ahora que me vuelvo a ir a otra ciudad de vacaciones en breve; así que empecé a ver si me podía sacar las castañas del fuego yo solito.
Estuve buscando programas que corrigiesen ese defecto de forma sencilla, sin tener que editar cada imagen por separado y sin que tardasen demasiado en procesarlas todas. Mi primera opción fue buscar algún plugin para el GIMP, pero no tuve mucho éxito. Lo mejor que encontré fue este pequeño script que permitía procesar un directorio lleno de imágenes, pero tenía dos problemas:
- Había que introducir las coordenadas de cada píxel a mano. Si hay dos píxeles mal en cada imagen, hay que ejecutar el programa dos veces.
- El manoseo que realiza de las imágenes hace que la imagen corregida ocupe más que la imagen original. La lógica me dictaba que un píxel que ahora se parece más a los de su entorno debería ayudar a comprimir la imagen, no al revés.
Lo guardé por si acaso no encontraba nada mejor, pero buscando un poco más terminé llegando a una pequeña maravilla: jpegpixi.
‘Jpegpixi’ is short for ‘JPEG Pixel Interpolator’. The intent of the program is to interpolate pixels (single pixels, dots, stripes) in JPEG images. This is useful to correct images from a digital camera with CCD defects. For example, if one pixel is always bright green, this pixel can be interpolated with jpegpixi.
Es justamente lo que andaba buscando. Además viene junto con otro programa, jpeghotp, que detecta qué píxeles son más brillantes en una fotografía completamente negra y localiza automáticamente sus coordenadas (jpegpixi necesita saber dónde están los píxeles que tiene que corregir). El procedimiento normal para obtener una imagen sobre la que realizar este tipo de detección es el de sacar una fotografía con largo tiempo de exposición, y a oscuras, pero no fui capaz de conseguirlo con éxito: veía sólo uno de los puntos; de forma que tuve que encontrarlos a mano sobre alguna imagen antigua que ya los mostrase, usando display, por ejemplo. Simplemente hay que anotar la coordenada de la esquina superior izquierda (porque siempre aparecen como cúmulos de píxeles, aunque haya estado hablando todo el rato de un píxel único) y las dimensiones del cuadrado que se formaría. Ejemplo de lo que se ve en realidad:
Después de un rato de mirar y hacer pruebas, al final lo que tengo es un archivo de texto con este contenido:
579,527,7
1537,592,7
O dicho de otra forma: tengo dos puntos malos en mis fotografías. Uno está en 579×527 y el otro en 1537×592, y ambos grupos de píxeles defectuosos tienen unas dimensiones de 7×7. Si tenemos en cuenta que esto ocurre al disparar con un tamaño de imagen de 3264×2448 entendemos que es insignificante. El tamaño del cluster defectuoso lo he obtenido mediante ensayo y error, ejecutando el programa para una imagen y quedándome con el tamaño más pequeño que corrige el problema.
A continuación, y para terminar, hice un pequeño script que simplemente lanza este programa con todas sus opciones sobre toda imagen con extensión .jpg que haya en un determinado directorio:
#!/bin/sh
for imagen in *.jpg; do
echo -n “Corrigiendo $imagen… ”
jpegpixi -m 3 -f /home/chema/correccion_pixeles.txt $imagen $imagen.new
mv $imagen.new $imagen
echo “OK”
done
La opción -m 3 indica que quiero que se emplee interpolación bicúbica, y el resto simplemente indica el archivo de coordenadas, la imagen de origen y la imagen de destino (que luego machacará a la original). En mi ordenador de casa, un Centrino Duo a 2.2 GHz, tarda menos de un segundo en procesar un archivo del tamaño que he comentado antes. Y los resultados son impecables (y, efectivamente, ocupan menos que la imagen original):

Si esto le ha servido a alguien para arreglar sus fotos, bien está.

El verano pasado la tarjeta gráfica decidió que se iba a tomar un descanso. Siguió el mismo camino que el lector de CD y dos discos duros, que fueron convenientemente reemplazados. A esas alturas de la partida, no merecía la pena seguir poniendo parches en algo que se estaba cayendo a pedazos.

