Cómo extraer el relieve del terreno lunar a partir de una sola imagen — un pipeline experimental 2.5D
Resumen: Describo un proyecto de investigación que intenta estimar un mapa de alturas relativas de la superficie lunar a partir de una única fotografía orbital. Sin estereoscopía, sin aprendizaje automático — solo análisis clásico de sombras, gradientes de brillo y datos georreferenciados.
El problema: 3D a partir de 2D
Cada fotografía de la superficie lunar es una proyección de 3D a 2D. La información de elevación queda «aplanada». Para recuperarla, disponemos de algunas pistas:
- Sombras — cuanto más larga es la sombra, más alto es el objeto (con parámetros de iluminación conocidos)
- Gradientes de brillo — los cambios bruscos de brillo indican pendientes
- Albedo — el material de la superficie también altera el brillo, lo que complica los dos puntos anteriores
El problema es que el albedo y la topografía están entrelazados. Una mancha brillante en una imagen puede ser una llanura de regolito claro o una ladera inclinada hacia el Sol. No es posible separarlos completamente a partir de una sola toma — es una limitación física fundamental. El proyecto reconoce esto abiertamente y construye todo su sistema de confianza alrededor de esa restricción.

Arquitectura del pipeline
El código está dividido en 7 etapas, cada una generando su propia imagen diagnóstica:
Etapa 1 — Detección de sombras
La máscara de sombras se genera mediante un método de percentiles (por defecto: el 15% más oscuro de los píxeles) o de desviación estándar. Es un enfoque heurístico — el material oscuro puede ser clasificado erróneamente como sombra.
01_shadow_mask.png
Etapa 2 — Alturas a partir de sombras
Se miden las longitudes de las sombras a partir de la máscara y se convierten en alturas relativas:
height = shadow_length_px × pixel_scale_m × tan(sun_elevation°)
El supuesto es que los objetos que proyectan sombras son verticales. Es una aproximación, pero suficiente para rocas y bordes de cráteres.
02_shadow_length_map.png
03_shadow_height_map.png
Etapa 3 — Mapa de albedo
El algoritmo interpola el brillo «esperado» del fondo a partir de los llamados inspect boxes — pequeñas ventanas que muestrean el brillo del material en puntos geográficos conocidos. En la versión 2.6, las posiciones de estas ventanas se derivan de coordenadas lunares reales (lat/lon) procedentes de los datos de QuickMap, no se colocan aleatoriamente.
04_albedo_reference_map.png
Etapa 4 — Normalización del brillo
El brillo observado se divide por el brillo esperado del albedo para aislar el efecto de la topografía:
normalized = observed / expected_albedo
05_normalized_brightness.png
Etapa 5 — Gradientes
Se calculan gradientes espaciales (magnitud y dirección) sobre el brillo normalizado. Un gradiente fuerte indica una pendiente; la dirección del gradiente revela la orientación de la ladera.
06_gradient_magnitude.png
07_gradient_direction.png ← visualización HSV: matiz = dirección
Etapa 6 — Mapa de confianza
Este es el corazón del proyecto. El mapa de confianza combina 5 componentes independientes:
| Componente | Qué mide |
|---|---|
| Shadow distance | Proximidad a los bordes de sombra |
| Gradient | Intensidad del gradiente de brillo |
| Texture variance | Varianza local (textura) |
| Albedo stability | Proximidad a los inspect boxes |
| Failure penalty | Penalización por áreas inherentemente inadecuadas al análisis |
Mapa de confianza final = suma ponderada de componentes × penalización por regiones fallidas.
08_confidence_map.png ← verde = alta confianza, rojo = baja
Etapa 7 — Mapa de alturas final
Se combinan las alturas derivadas de sombras y las pendientes basadas en gradientes. En áreas de baja confianza, los resultados se suavizan hacia la mediana — para evitar presentar ruido como terreno.
09_height_map.png
10_height_map_confidence_overlay.png ← alturas + confianza como opacidad
Datos de entrada: QuickMap
El proyecto utiliza datos de QuickMap (LROC, Universidad Estatal de Arizona):
- Imagen LROC NAC — fotografía orbital de alta resolución (~1 m/píxel a resolución completa)
- Region Data CSV — puntos de medición de QuickMap que contienen: coordenadas geográficas (lat/lon), altura del terreno (TerrainHeight), pendiente (Slope), composición óptica y otros
Un archivo .vrt (GDAL Virtual Dataset) proporciona los metadatos de georreferenciación: sistema de coordenadas, transformación geográfica y escala de píxel.
Iteraciones del proyecto
El código pasó por tres iteraciones, cada una añadiendo una nueva capa:
Iteración 2 — pipeline básico (sombras + gradientes + mapa de confianza)
Iteración 2.5 — capa diagnóstica: desglose del mapa de confianza en 5 componentes, histograma de gradientes, superposición de valores atípicos, interacción sombra–gradiente. Objetivo: *»¿Estoy confiando en el pipeline por las razones correctas?»*
Iteración 2.6 — coordenadas reales: inspect boxes posicionados con datos de QuickMap en lugar de aleatoriamente. Mapeo lat/lon → píxel mediante aproximación lineal (sin corrección de proyección cartográfica).
Iteración 3 (validate_iteration3.py) — validación de tendencias: comparación de las direcciones de gradientes con un DEM externo (LOLA/LROC). No optimiza — solo responde a la pregunta: *»¿Son las tendencias reconstruidas coherentes con la topografía real?»*
Lo que el proyecto no hace
Esta lista es tan importante como la lista de funcionalidades:
- No genera un DEM — las alturas son relativas, sin referencia absoluta
- No utiliza aprendizaje automático — cada paso es interpretable por un ser humano
- No es fotogrametría — no hay pares estéreo, no hay triangulación
- No funciona bien en llanuras — las áreas uniformes no producen señal topográfica
- No separa completamente el albedo de la topografía — es imposible a partir de una sola imagen
Resultados y validación
Al probar en una región lunar de ejemplo (7,63°N, 6,53°E), a resolución completa de LROC NAC (1 m/px), utilizando un DEM sintético (sin acceso a LOLA durante las pruebas), la validación de la Iteración 3 clasifica:
- aproximadamente un 3,6% de las áreas de alta confianza como coherentes con la tendencia del DEM
- aproximadamente un 17,7% como incoherentes
- el resto: confianza demasiado baja para extraer conclusiones
Los resultados se reportan con honestidad — el proyecto no intenta explicar ni «arreglar» estas cifras. La incoherencia es información, no un error que ocultar.
Potencial y aplicaciones
Vale la pena mencionar el contexto más amplio de los datos que utiliza este proyecto.
Las imágenes de la superficie lunar capturadas por LROC NAC representan el mapeo más detallado de la superficie de un cuerpo celeste fuera de la Tierra. Con una resolución de ~1 m/píxel, cada píxel corresponde a un metro cuadrado de superficie — un nivel de detalle inalcanzable para cualquier otro planeta o luna del Sistema Solar. La ausencia de atmósfera lunar elimina el desenfoque y las distorsiones ópticas, lo que mejora aún más la calidad de las imágenes.
QuickMap también ofrece una vista 3D reconstruida a partir de datos LOLA (LRO Laser Altimeter). Proporciona una noción ampliada de la forma del terreno, pero al igual que este pipeline, presenta la topografía en un alcance limitado — no es fotogrametría completa y precisa.
Qué más se podría extraer
La principal premisa limitante de este proyecto es una sola imagen desde un solo ángulo. Si estuvieran disponibles dos o más imágenes de la misma zona con resolución comparable y diferentes ángulos de iluminación, las posibilidades analíticas crecen significativamente:
Evaluación de transitabilidad — identificación de terrenos con pendiente mínima y pocos bloques rocosos, útil para planificar rutas de rovers.
Estimación del espesor del regolito — las sombras de los bloques rocosos y su relación con el entorno pueden indicar la profundidad de la capa superficial suelta.
Análisis de formaciones rocosas — la distribución y morfología de los bloques rocosos bajo diferentes ángulos de iluminación permite una clasificación litológica preliminar.
Todo esto es aún territorio de investigación, no una herramienta lista para usar. Pero el punto de partida es excepcionalmente bueno: los datos son públicos, gratuitos y de la más alta calidad posible.
Código y licencia
El código Python (~1.600 líneas, sin frameworks externos de IA) utiliza únicamente: numpy, opencv-python, scipy, matplotlib
El código fuente está disponible públicamente en GitHub: github.com/MarcinSFox/Lunar_2.5D
Todos los pasos son explícitos y están documentados. Cada etapa genera su propia imagen diagnóstica, lo que permite entender dónde el pipeline funciona bien y dónde falla.
Datos de prueba: región lunar de ejemplo (~7,63°N, 6,53°E), imagen LROC NAC de QuickMap, escala ~1 m/px.
Trato este proyecto como un experimento de investigación y una herramienta de aprendizaje. Los resultados son hipótesis sobre la forma del terreno, no mediciones. El valor del proyecto reside en la transparencia del método y el modelado explícito de la incertidumbre — no en la precisión de los resultados.
