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 sus bases: en 'Transformación trapezoidal de imágenes con R (I). Algoritmo' la herramienta matemática para realizar una corrección geométrica transformando una imagen según la correspondencia entre dos trapezoides arbitrarios, en 'Transformación trapezoidal de imágenes acelerada con C++' aceleramos por un factor 100 el proceso compilándolo en C++ y en 'Calculando la distancia focal con que se hizo una fotografía' implementamos una función que calcula la relación de aspecto (y la distancia focal, aunque no será el dato que usemos esta vez) a partir de una imagen que incluya algún objeto presentando fugas en ambos ejes pero con 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 (modelo de proyección pinhole o cámara oscura) en la imagen final todas las líneas del plano 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 ajustar manualmente. Algo para lo que muchas veces ni siquiera contará con las referencias necesarias para poder tomar una decisión.

Así que 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, cinta métrica en mano, 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++' y forzar que la transformación se haga con destino a un rectángulo que tenga exactamente esas proporciones:



Así obtendremos sin ajustes manuales una vista frontal del edificio con sus dimensiones reales. Esta 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 evaluar la precisión del método matemático. He usado una lámina cuyas medidas son: 21,00cm x 29,75cm (aunque no lo creas se pueden medir medios mm con una regla, de ahí los decimales) que corresponden a una relación de aspecto de 0,706.

Añadimos a la escena otra lámina del mismo tamaño ligeramente rotada respecto a la primera y dos posavasos, uno cuadrado con orientación arbitraria y otro circular. Por estar contenidos en el mismo plano que la lámina de referencia (en realidad bastaría que estuvieran en planos paralelos), todos estos elementos deberán recuperar sus proporciones reales 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, lo que supone un error tomando todos los decimales respecto al valor 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 de baja distorsión, aunque ya vemos que a la distancia de enfoque su focal efectiva estaba bastante por encima. 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 lámina y en los posavasos, que recuperan sus proporciones geométricas exactas así como sus ortogonalidades. 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 revelado RAW en el apartado de corregir perspectivas: Adobe Camera RAW, Lightroom y Capture One tienen la opción de definir con asistencia del usuario las direcciones (guías) a verticalizar y/u horizontalizar, de las que puede derivarse directamente por intersección un trapezoide de referencia. Hasta ahí cero quejas porque es la manera más potente, cuando se puede por disponibilidad de líneas rectas a usar de guía, de especificar qué transformación queremos hacer.

Pero luego desaprovechan torpemente la oportunidad de calcular, con unas ecuaciones que ocupan unas pocas líneas de código, la relación de aspecto real del objeto a partir de ese 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 ACR, LR y C1 en la escena anterior, donde todas aparecen achatadas en vertical. Además el usuario no siempre tendrá referencias conocidas (cuadrados o círculos como en este caso) para realizar ajustes manuales que lleven a las dimensiones reales, por lo que a efectos del usuario en esos casos será imposible recuperarlas.

Aparte he tenido que usar como ejemplo una toma distinta a la anterior ya que los tres programas fallaban en el establecimiento de las guías, supongo que porque consideraban la corrección excesivamente forzada. Una torpeza más porque las ecuaciones soportan cualquier corrección por extrema que sea:







Zhengyou Zhan, el autor original de las fórmulas en que se basan estos cálculos, solo las quería para crear una aplicación en Windows que digitalizase fotos hechas a pizarras físicas. Quizá estaba hilando fino de más al preocuparse de restaurar a sus proporciones originales algo que una persona hubiera garabateado a mano alzada. En cambio Adobe y Capture One, diseñando herramientas fotográficas profesionales que pueden usar fotógrafos de arquitectura por ejemplo, no se preocupan por afinar hasta ese punto. Es el mundo al revés.

~~~

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.