Composición en tiempo real con imágenes del sol de la ESA y NASA


¿Qué es?

En esta página se pueden ver imágenes actualizadas generadas por un programa que creé. Se descargan una serie de imágenes de las agencias ESA y NASA captadas por la sonda SOHO y se crean estas composiciones. Todas las que se ven en esta web son del sol tal como se encuentra en estos momentos, incluidos los fondos de los títulos.

Recreación del videojuego Nemesis 3 de MSX. Descargar


Esta es más simple pero me gusta como queda. Descargar


Los soles de colores corresponden a diferentes longitudes de onda de luz ultravioleta extrema (estas imágenes son PNGs con transparencia):

Algunas imágenes originales que provee la sonda SOHO usando diferentes instrumentos:

Imágenes del proceso

La primera de las dos imágenes siguientes procede de un coronógrafo con el que va equipado el satélite, un aparato que capta luz ultravioleta extrema (invisible a nuestros ojos pero "teñida" aquí de rojo) ayudado por un disco colocado enfrente, a modo de simulacro de eclipse para que la imagen no resulte cegada:

El proceso siguiente es realizado automáticamente por mi programa, un script bash que el servidor ejecuta cada pocos minutos para comprobar si hay nuevas tomas (son solo varias al día y no se realizan a intervalos demasiado regulares), y de haberlas las descarga y trata con la ayuda de la utilidad ImageMagick.

Realizo la máscara para aislar el sol en un fichero PNG con transparencia. Selecciona los colores del sol, los convierte a niveles de grises y le aplica un difuminado gausiano para agrandar el contorno de la máscara:

Finalmente cambia el tamaño de la corona, recorta la imagen, superpone el sol dentro de la corona y añade las firmas:

Descargar Descargar Descargar

Con el caso de las composiciones más complejas pasé a usar Inkscape por línea de comandos. Mientras lo diseño uso imágenes "estáticas" locales, pero al subirlo al servidor basta sustituir las rutas en el fichero SVG (este formato es texto plano)

Hay aplicaciones para poder colocarlas como fondo de escritorio que se actualiza. En el escritorio de Linux KDE se hace con el botón derecho del ratón sobre el escritorio -> Fondo de pantalla -> Presentación -> Carpetas personalizadas -> Indicarle donde está la imagen que se descarga el script, o indicar la URL de la imagen.

Observaciones

  • En ocasiones aparecen dentro del sol unos perfectos cuadrados negros, bastante pequeños. Creo que se debe a que la resolución que obtienen ESA/NASA originalmente es muchísimo mayor, se compondría a partir de cientos de fotos.
  • Hay épocas en las que el encuadre de las imágenes cambia y tengo que ajustarlo manualmente, por lo que puede que no se vea bien.
  • A veces las imágenes de la NASA tienen fallos de transmisión desde el satélite, o la foto no se realiza correctamente.

El script

Puedes descargarlo:

#!/bin/bash
# Composición con las imágenes de la sonda SOHO de la NASA:
# http://sohowww.nascom.nasa.gov/data/realtime-images.html
# URL: https://airsynth.es/nasa
# Autor: Marce Luna

# IMPORTANTE: No ejecutar con usuario root, si no cron no podrá modificar los ficheros
# Para volver a crear las imágenes manualmante hay que borrarlas

# Para corregir el desplazamiento de sol me fue bien modificar la máscara en Gimp poniendo debajo la imagen original de la NASA

limpiarFecha() {
	fecha="$1"
	salida=$(echo $fecha | tr -d '\r')
	salida="${salida/Last-Modified: /}"
	echo "$salida"
}

ficheroModificado() {
	url="$1"
	destino="$2"
	echo "Comprobando modificación: $url"
	if [ -f "$destino" ]; then
		longitudFicheroAnterior=$(stat -c%s "$destino")
	else
		longitudFicheroAnterior="no existe"
	fi
	longitudFicheroRemoto="$(curl -s --head "$url" 2>&1 | grep '^Content-Length: ')"
	longitudFicheroRemoto=$(echo $longitudFicheroRemoto | tr -d '\r')
	longitudFicheroRemoto="${longitudFicheroRemoto/Content-Length: /}"
	if [ "$longitudFicheroRemoto" != "$longitudFicheroAnterior" ]; then
		echo "   El fichero ha sido modificado"
		echo "   Longitud remoto: $longitudFicheroRemoto"
		echo "   Longitud anterior: $longitudFicheroAnterior"
		return 1
	else
		echo "   El fichero remoto no ha cambiado"
		return 0
	fi
}

procesarImagenes() {
	echo "Agrandando la corona"
	convert "$temp/nasa-soho-sun-c2-latest.jpg" -resize "1990"x "$temp/nasa-soho-sun-c2-big-latest.png"

	echo "Recortando la imagen a proporción 16:9"
	convert "$temp/nasa-soho-sun-c2-big-latest.png" -gravity Center -crop 1990x1119+0+0 +repage "$temp/nasa-soho-sun-c2-latest-16-9.png"

	echo "Colocando firmas"
	composite -gravity SouthWest nasa-logo.png -geometry 130x+50+80 "$temp/nasa-soho-sun-c2-latest-16-9.png" "$temp/fondo.png"
	composite -gravity SouthEast airsynth.png -geometry +0+35 "$temp/fondo.png" "$temp/fondo-sin-hora.png"
	echo "Colocando hora"
	convert "$temp/fondo-sin-hora.png" -pointsize 19 -font "Arial" -fill "rgba(255,255,255,0.4)" -gravity SouthWest -annotate +190+121 "$horaActualFichero" "$temp/nasa-soho-sun-c2-big-latest.png"
	# convert "$temp/fondo-sin-hora.png" -pointsize 22 -draw "gravity SouthWest fill white text 190,121 '$horaActualFichero'" "$temp/nasa-soho-sun-c2-big-latest.png"

	# El primer parámetro es el código que le da la NASA a la imagen y el segundo es el valor alcance de la "varita mágica". En airsynth.es va bien un 35 y en mi Kubuntu 14.10 un 120
	if [ "$servidor" == "local" ]; then
		# amarillo
		procesarSol 284 118
		# verde
		procesarSol 195 119
		# azul
		procesarSol 171 115
		# rojo
		procesarSol 304 110
	else
		# amarillo. Estaba a 26
		procesarSol 284 32
		# verde
		procesarSol 195 34
		# azul
		procesarSol 171 30
		# rojo
		procesarSol 304 25
	fi
	rm $temp/nasa-soho-sun-c2-big-latest.png
	rm $temp/nasa-soho-sun-c2-latest-16-9.png
	rm $temp/fondo-sin-hora.png
	rm $temp/fondo.png
}

procesarSol() {
	echo "Sol $1":
	echo "   Descargando imagen del sol"
	wget "http://sohowww.nascom.nasa.gov/data/realtime/eit_$1/1024/latest.jpg" -O "$temp/nasa-soho-sun-eit_$1-latest.jpg"

	echo "   Borrando la hora del sol"
	convert -draw "rectangle 3,997 230,1021" -fill black "$temp/nasa-soho-sun-eit_$1-latest.jpg" "$temp/nasa-soho-sun-eit_$1-latest.png"

	echo "   Máscara para recortar el sol"
	echo "      Creando"
	convert "$temp/nasa-soho-sun-eit_$1-latest.png" \( +clone -fx 'p{0,0}' \) -compose Difference -composite -modulate $2,0 -alpha off $temp/difference.png
	echo "      Modificando"
	convert $temp/difference.png -threshold 7% -blur 0x15 $temp/halo_mask.png
	echo "      Sumando la máscara a la redonda"
	composite -gravity Center round_sun_mask.png $temp/halo_mask.png $temp/final_mask.png
	echo "      Aplicando"
	convert "$temp/nasa-soho-sun-eit_$1-latest.png" $temp/final_mask.png -alpha Off -compose CopyOpacity -composite $img/nasa-soho-sun-eit_$1-latest-transparent.png
	echo "   Generando versión reducida del sol transparente"
	convert "$img/nasa-soho-sun-eit_$1-latest-transparent.png" -resize x320 -interlace line $img/nasa-soho-sun-eit_$1-latest-transparent-small.png

	echo "   Insertando una imagen dentro de la otra"
	echo "   2015-12-25: Eliminado en el parámetro -geometry un desplazamiento hacia abajo (-0+60 tenía). Parece que a veces se mueve."
	composite -gravity Center -geometry -0+0 -quality 85 -interlace line "$img/nasa-soho-sun-eit_$1-latest-transparent.png" "$temp/nasa-soho-sun-c2-big-latest.png" "$img/nasa-soho-sun-composition-eit_$1-c2-latest.jpg"

	echo "   Generándola a 720"
	convert "$img/nasa-soho-sun-composition-eit_$1-c2-latest.jpg" -resize x720 -quality 70 -interlace line "$img/nasa-soho-sun-composition-eit_$1-c2-latest-720.jpg"

	echo "   Borrando imágenes temporales"
	rm "$temp/nasa-soho-sun-eit_$1-latest.png"
}

echo > ejecutando.flag
directorioScript="/var/www/clients/client1/web11/web/img/nasascript/"
# Variable según estemos en local o en servidor
if [ -d "$directorioScript" ]; then
	servidor="remoto"
	cd "$directorioScript"
else
	servidor="local"
fi
servidor="remoto"
echo "Ya no es necesario el ajuste diferente de "varita mágica" entre local y remoto"
echo "EJECUTANDO EN ORDENADOR $servidor"
img="../nasa"
temp="../nasa/tmp"

horaActual="$(date "+%Y-%m-%d %H:%M %Z")"
echo "$horaActual" > ejecucionultima.txt
if [ ! -d "$img" ]; then mkdir "$img"; fi
if [ ! -d "$temp" ]; then mkdir "$temp"; fi

ficheroModificado "https://sohowww.nascom.nasa.gov/data/realtime/eit_304/1024/latest.jpg" "$temp/nasa-soho-sun-eit_304-latest.jpg"
cambio="$?"
if [ "$cambio" == "0" ]; then
	ficheroModificado "https://sohowww.nascom.nasa.gov/data/realtime/c2/1024/latest.jpg" "$temp/nasa-soho-sun-c2-latest.jpg"
	cambio="$?"
else
	solCambiado="1"
fi
if [ "$cambio" == "1" ]; then
	horaSol="$(curl -s --head "http://sohowww.nascom.nasa.gov/data/realtime/eit_304/1024/latest.jpg" 2>&1 | grep '^Last-Modified: ')"
	horaSol="$(limpiarFecha "$horaSol")"
	horaSolComp="$(date --date="$horaSol" "+%Y%m%d%H%M")"
	horaSol="$(date --date="$horaSol" "+%Y-%m-%d %H:%M %Z")"
	horaCorona="$(curl -s --head "$temp/nasa-soho-sun-c2-latest.jpg" 2>&1 | grep '^Last-Modified: ')"
	horaCorona="$(limpiarFecha "$horaCorona")"
	horaCoronaComp="$(date --date="$horaCorona" "+%Y%m%d%H%M")"
	horaCorona="$(date --date="$horaCorona" "+%Y-%m-%d %H:%M %Z")"
	echo "   Hora sol: $horaSol"
	echo "   Hora corona: $horaCorona"
	if [ "$horaSolComp" -ge "$horaCoronaComp" ]; then
		horaActualFichero="$horaSol"
		echo "   El sol es más actual"
	else
		horaActualFichero="$horaCorona"
		echo "   La corona es más actual"
	fi
	horaMensaje="Imágenes del sol de la sonda SOHO de la ESA/NASA en tiempo real a "
# 	horaActualFichero="$horaMensaje$horaActualFichero"
	horaActualFichero="$horaMensaje$horaActual"
	horaSol="$horaMensaje$horaSol"
	echo "Descargando imagen de la corona"
	wget "http://sohowww.nascom.nasa.gov/data/realtime/c2/1024/latest.jpg" -O "$temp/nasa-soho-sun-c2-latest.jpg"
	echo $horaActualFichero >> listaactualizaciones.txt
	procesarImagenes
	if [ "$solCambiado" == "1" ]; then
		# Árbol de navidad
# 		echo "Generando árbol de navidad en tiempo real:"
# 		inkscape "nasa-realtime-christmas-tree.svg" --export-png="$temp/arbol.png"
# 		convert "$temp/arbol.png" -quality 85 -interlace line -pointsize 58 -font "Arial" -fill "rgba(255,255,255,0.2)" -gravity SouthWest -annotate +415+206 "$horaSol" "$img/nasa-realtime-christmas-tree.jpg"
# 		# Listar tipografías: convert -list font
# 		convert "$temp/arbol.png" -quality 85 -interlace line -pointsize 64 -draw "gravity SouthWest fill white text 415,206 '$horaSol'" "$img/nasa-realtime-christmas-tree.jpg"
# 		convert "$img/nasa-realtime-christmas-tree.jpg" -resize x720 -quality 85 -interlace line "$img/nasa-realtime-christmas-tree-720.jpg"
# 		rm "$temp/arbol.png"

		# Nemesis 3
		echo "Generando fake Nemesis 3 en tiempo real:"
		inkscape "esa-nasa-nemesis.svg" --export-png="$temp/nemesis3.png"
		convert "$temp/nemesis3.png" -quality 85 -interlace line -pointsize 38 -font "Arial" -fill "rgba(255,255,255,0.7)" -gravity SouthEast -annotate +15+20 "$horaSol" "$img/esa-nasa-realtime-nemesis3.jpg"
	fi
fi

cp ../nasa/nasa-soho-sun-composition-eit_171-c2-latest-720.jpg ../../wp-content/uploads/sites/11/2014/12/nasa-soho-sun-composition-eit_171-c2-latest.jpg

rm "ejecutando.flag"

whoami > /var/www/clients/client1/web11/web/img/nasascript/nasaw

echo "Terminado"

Publica un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *