Aviso para navegantes: el siguiente artículo es muy friki, comparado con la tendencia habitual de esta blogcosa.
En el artículo anterior, describí un método muy casero (y cutre) para fotografiar el firmamento con una cámara réflex. En este, voy a detallar cómo se puede mejorar el resultado con GIMP.
Brevemente, describo el problema: para captar la débil luz de las estrellas se necesita un tiempo de exposición prolongado (una ISO alta destroza la foto por el ruido que aparece entre tanta negrura). Durante ese tiempo, que puede ser del orden de varios minutos, la Tierra tiene la mala costumbre de no estarse quieta y, como se puede deducir y experimentar, la foto sale movida. Los modernos telescopios incorporan un servomotor que permite hacer un seguimiento de objetos que compensa la rotación.
Si no se tiene esa compensación, es necesario tomar muchas fotos breves (menos de 30 segundos) y superponerlas para aumentar la intensidad luminosa, en lugar de una o varias tomas largas.
GIMP ofrece la posibilidad de trabajar con capas y, lo que es más importante, con scripts. El siguiente script Python (basado en uno disponible en el magnífico tutorial de Python para GIMP de Javier Pérez Pacheco) superpone las imágenes disponibles en un directorio en distintas capas, aplicando a cada una un factor de corrección lineal.
earthrotation.py
#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Script for Gimp in Python
# Implemented by José Miguel Cotrino (https://www.cotrino.com)
# The purpose of this script is to combine a set of astronomical
# images and compensate the Earth rotation from one to another
# following a linear movement.
from gimpfu import *
import os
import math
def EarthRotation(img, drawable, path, angle, offset):
# begin of UNDO action
pdb.gimp_image_undo_group_start(img)
# load all images in the given folder
files = os.listdir(path)
files.sort()
# calculate offset stepping
offset_x = 0
offset_y = 0
angle_radians = math.radians(angle);
diff_x = offset * math.cos(angle_radians) / (len(files)-1);
diff_y = offset * math.sin(angle_radians) / (len(files)-1);
# load each file
for file in files:
# each files is loaded as a new layer
# and added to the current image
layer_mark = pdb.gimp_file_load_layer(img, path+os.sep+file)
pdb.gimp_image_add_layer(img, layer_mark, -1)
# the layer is translated with the calculated offset
pdb.gimp_layer_translate(layer_mark, offset_x, offset_y)
# set the layer in addition mode to increase the starlight
pdb.gimp_layer_set_mode(layer_mark, ADDITION_MODE)
# modify output levels to reduce ambient light and noise
# (it may also hide weak stars)
pdb.gimp_levels(layer_mark, HISTOGRAM_VALUE, 0, 255, 1.0, 0, 127)
# update offset for next image
offset_x += diff_x
offset_y += diff_y
# combine all visible layers
# pdb.gimp_image_merge_visible_layers(img, 1)
# end of UNDO action
pdb.gimp_image_undo_group_end(img)
# main function
if __name__ == '__main__':
# call to register function
register(
"earth_rotation",
"Compensate Earth rotation in a set of astronomical pictures",
"Compensate Earth rotation in a set of astronomical pictures",
"Jose Miguel Cotrino",
"Jose Miguel Cotrino",
"2007",
"<Image>/Python-Fu/Fix Eath rotation",
"RGB*, GRAY*",
[
(PF_FILE, "path", "Folder with input images", "/home/cotrino/estrellas"),
(PF_SPINNER, "angle", "Movement angle", 72, (0, 360, 1)),
(PF_SPINNER, "offset", "Total movement (in pixels)", 40, (0, 1000, 1)),
],
[],
EarthRotation)
main()
Para usar este script, es necesario GIMP 2.4 o superior, ya que en versiones anteriores no se soporta la carga de imágenes en capas vía scripting. El archivo earthrotation.py
se almacenará en el directorio $HOME/.gimp-2.4/plug-ins
y se le asignará permiso de ejecución (chmod +x earthrotation.py
).
Es necesario abrir la primera y última imagen del set para calcular el desplazamiento total, usando alguna estrella como referencia. Para ello, se puede utilizar la herramienta de medida de GIMP.
A continuación, con la primera imagen del set abierta, hay que ejecutar Python-Fu -> Fix Earth Rotation, que pide el directorio de las imágenes, el ángulo y el número de píxeles del desplazamiento.
Y listo:
Nota: como hemos mencionado al principio, la corrección es puramente lineal. Por lo tanto, funcionará bien en el ecuador, pero en los trópicos el movimiento será más parabólico en desplazamiento largos.