domingo, 1 de marzo de 2026

Corrección de perspectiva preservando la relación de aspecto

Este artículo puede verse como el colofón de tres artículos previos que sentaron las bases: 'Transformación trapezoidal de imágenes con R (I). Algoritmo' donde poníamos la herramienta matemática para realizar una corrección geométrica trapezoidal (transformar una imagen en otra garantizando la preservación de rectas y la correspondencia origen-destino entre los cuatro vértices de dos trapezoides arbitrarios), 'Transformación trapezoidal de imágenes acelerada con C++' donde acelerábamos por un factor 100 el proceso R anterior compilándolo en C++ y 'Calculando la distancia focal con que se hizo una fotografía' donde implementábamos una función capaz de calcular la relación de aspecto (y la distancia focal, aunque no será el dato que usaremos esta vez) a partir de una imagen donde apareciese algún objeto presentando fugas en ambos ejes pero tuviera forma de rectángulo en la escena real.

El problema a abordar es el siguiente: cuando hacemos una fotografía de cualquier sujeto contenido en un plano (la fachada de un edificio, una obra pictórica,...), si por los motivos que sean no mantenemos la cámara perpendicular a dicho plano, por efecto de la perspectiva (proyección modelo pinhole o cámara oscura) en la imagen final todas las líneas que fueran paralelas en la escena real aparecerán convergiendo en una fuga cónica que distorsionará su apariencia (hacer clic para ver en alta resolución):

Fuente: galerías DPReview + estimación geométrica


Estas fugas pueden corregirse con multitud de herramientas software (Photoshop, Adobe Camera RAW, Lightroom, Capture One,...) pero todas adolecen del mismo problema: no parecen darle importancia a ponerlo fácil para restaurar las proporciones reales del objeto, asumiendo una incertidumbre en la relación de aspecto (proporción ancho/alto) que el usuario debe elegir manualmente.

Nosotros vamos a ir un paso más allá, y como vimos en 'Calculando la distancia focal con que se hizo una fotografía' la solución la encontramos en la propia imagen, donde si somos capaces de localizar algún trapezoide correspondiente a un rectángulo del edificio real podremos estimar con mucha precisión la relación de aspecto de dicho rectángulo.

En la imagen anterior se ha superpuesto este dato estimando que el rectángulo que se muestra en amarillo tiene unas proporciones ancho/alto de 3,04. Es decir esa pieza arquitectónica resaltada es en el mundo real unas 3 veces más ancha que alta.

Con ese dato clave ya solo tenemos que recurrir al algoritmo de transformación trapezoidal definido en 'Transformación trapezoidal de imágenes acelerada con C++' para, forzando que la transformación se haga con destino a un rectángulo que tenga exactamente esas proporciones:



Obtener sin ajustes manuales una vista frontal del edificio con sus dimensiones reales. Ésta sería la única imagen que coincidiría geométricamente con la obtenida con un objetivo descentrable, el cual proporciona directamente la relación de aspecto genuina de la fachada (hacer clic para ver en alta resolución):


~~~

Vamos a hacer otro ejercicio equivalente pero de una escena donde conocemos de antemano la relación de aspecto del sujeto principal, para ver cuánto podemos acercanos con el método matemático. He medido las proporciones de las láminas: 21,00cm x 29,75cm (aunque no lo creas siempre me he sentido capaz de medir medios mm con una regla, de ahí los decimales) que corresponden a una relación de aspecto de 0,706.

Además añadimos otra lámina similar rotada y unos posavasos cuadrado y circular que, contenidos en el mismo plano que la lámina de referencia, deberán recuperar sus proporciones como efecto colateral de la corrección (hacer clic para ver en alta resolución):



Sobre la anterior imagen está superpuesto el cálculo de relación de aspecto de 0,707 obtenido de la lámina derecha, suponiendo un error calculado con todos los decimales respecto al exacto de solo un 0,2%. Para que la prueba saliera lo mejor posible he usado un objetivo Canon FDn 50mm f/3,5 Macro con muy poca distorsión, aunque ya vemos que enfocado a corta distancia como es el caso su focal efectiva aumenta notablemente. Este objetivo respira una barbaridad al mover el aro de enfoque.

Con el dato calculado la corrección que vamos a aplicar es la siguiente:



Y nos proporciona la escena original corregida en todos sus elementos al ser coplanarios (hacer clic para ver en alta resolución):



Como puede verse la restauración ha sido fantástica. Más que en la lámina usada para corregir, que no podía salir mal, lo comprobamos en la otra y en los posavasos, que recuperan sus proporciones geométricas exactas. Aquí está la verdadera magia de este ejercicio! (he rotado los recortes para poder comprobar su ortogonalidad, mostrándolos inscritos en marcos de proporciones 1:1 para los posavasos y 0,706:1 para la lámina):






~~~

Y para acabar una pequeña crítica a los programas clásicos de procesado en el apartado de corregir perspectivas. Tanto Lightroom como Capture One tienen la opción de definir con asistencia del usuario las direcciones a verticalizar y/u horizontalizar. Hasta ahí cero quejas porque es la manera más potente, cuando se puede (existen trapezoides en la escena), de especificar qué transformación queremos hacer.

Pero luego desaprovechan torpemente la oportunidad de calcular, con unas ecuaciones que no ocupan más de 4 líneas de código, la relación de aspecto real del objeto a partir del trapezoide que definió el propio usuario, para permitir una corrección automática y precisa. Incluso aunque solo se use como punto de partida para un refinamiento final.

Aquí la corrección que generan Lightroom y Capture One en la escena anterior, donde ambas aparecen claramente achatadas. Lo peor además es que no siempre el usuario tendrá referencias conocidas (cuadrados o círculos como en este caso) para realizar los ajustes que nos den las dimensiones reales:




~~~

Repositorio con el código R: GitHub.

No hay comentarios:

Publicar un comentario

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.