Estás empezando a leer uno de los ejercicios más bonitos, interesantes y gratificantes que haya escrito. Pero a la vez está casi garantizado que será de los más incomprendidos y candidato a pasar desapercibido. Voy a intentar que no sea así para ti y le encuentres el valor que creo que tiene, pero debes poner un poco de tu parte. Lo que vamos a hacer, aún con sus limitaciones y hándicaps, es calcular la distancia focal con que se hizo una fotografía, solo analizando el contenido de la imagen. Si aguantas los primeros compases del artículo y una muy breve descripción matemática, verás que funciona y es mágico.
Durante muchos años he tenido la intuición, pero sin poder comprobarlo con certeza, de que a partir de una escena afectada por una deformación de perspectiva (fugas cónicas), debía ser posible automatizar el cálculo de la corrección precisa a realizar para restaurar las proporciones reales exactas (relación de aspecto) de cualquier sujeto plano que se fotografíe de forma no perpendicular.
Las herramientas software clásicas de corrección geométrica (Photoshop, Adobe Camera RAW, Lightroom y Capture One básicamente) no me han ayudado demasiado a desentrañar el misterio porque sorprendentemente están muy orientadas a la corrección por puro tanteo, sembrando todas las dudas sobre si realmente pueden hacer lo que buscaba.
"Because of the perspective distortion, the image of a rectangle appears to be a quadrangle. However, since we know that it is a rectangle in space, we are able to estimate both the camera’s focal length and the rectangle’s aspect ratio."
Fuente: Zhengyou Zhang
Lo que viene a decir Zhang es que si en una fotografía aparece cualquier objeto o superficie plana que, teniendo en el mundo real la forma de un rectángulo, se muestre por efecto de la perspectiva como un trapezoide o cuadrilátero sin ningún lado paralelo, a partir de la localización de sus cuatro esquinas podemos calcular matemáticamente dos parámetros muy potentes:
- Por un lado las proporciones reales del rectángulo o relación de aspecto del mismo, lo que nos permitirá con una simple transformación trapezoidal realizar una corrección de perspectiva que elimine las fugas y a la vez restaure las proporciones reales del objeto (por ejemplo una fachada de un edificio o una obra pictórica).
- Por otro lado la distancia focal con que se realizó la toma, o más precisamente el ángulo de visión abarcado en la misma (FOV), parámetro clave en cualquier fotografía. Traducir luego esta FOV en una distancia focal en mm asociada a cualquier tamaño de sensor (típ. FF) será inmediato.
El trapezoide debe tener fugas en los dos ejes, es decir debe tener claramente dos puntos de fuga cónicos:
- Si no tuviera ninguno (fotografía tomada con el plano del objeto perpendicularmente a la cámara) ya tendríamos la relación de aspecto sin necesidad de calcular ni corregir nada, pero la distancia focal quedaría indeterminada.
- Si solo tuviera un punto de fuga, teniendo los otros dos lados paralelos, será el escenario peor: no podremos calcular ni la relación de aspecto real del rectángulo ni la distancia focal.
- Paradójicamente un trapezoide sin ángulos paralelos, es decir el más deformado que podemos tener, es el que aporta más información, pudiendo derivar de él tanto las proporciones del rectángulo origen como la distancia focal.
El cálculo es extremadamente sensible a cualquier error en la localización de las esquinas del trapezoide, lo cual incluye el caso de ópticas con distorsión geométrica que debería corregirse previamente a este cálculo. Como el método además requiere fugas lo más explícitas posibles, las ecuaciones que lo soportan empiezan a sufrir conforme aumentamos la focal, ya que con ángulos de visión tele los lados de cualquier rectángulo se proyectan cada vez más paralelos.
El método no es apto para imágenes obtenidas con descentramiento ya que asume que el centro de la imagen coincide con el eje óptico. Por el mismo motivo una imagen recortada de forma no simétrica respecto al centro no arrojará datos correctos. Si el recorte es simétrico respecto al centro el cálculo sí será correcto, aunque proporcionará la distancia focal también afectada por el recorte.
Tomando prestada una
implementación en Java de las ecuaciones de Zhang, y pidiéndole a ChatGPT que me la convierta a R he dispuesto de una función
get_aspectratio_focallength_FOV() que a partir de las dos dimensiones de la imagen en píxeles y de las coordenadas también en píxeles de las esquinas del trapezoide identificado, proporciona los datos buscados en la forma (primero muestra el formato de la imagen usada, después la relación de aspecto en el mundo real del rectángulo escogido para hacer el cálculo, y finalmente la distancia focal en mm relativos al formato FF y sus FOV correspondients en cada eje):
Image aspect ratio (W/H): 1.50 [3:2]
Rectangle aspect ratio (W/H): 3.02
Focal length FF: 23.89mm
FOV X/Y/Diag: 74.0° / 53.3° / 84.3°
Para comprobar la precisión de los cálculos construimos con Rhinoceros dos escenas 3D "fotografiadas" con distancias focales de 24mm y de 50mm. El objeto es un ortoedro de dimensiones relativas conocidas 3x2x1 para poder evaluar caras con relaciones de aspecto 3:1 , 2:1 y 3:2 o lo que es lo mismo relaciones de valores 3, 2 y 1,5. Además las he rotado ligeramente para tener situaciones aún más diferentes (hacer clic para ver en alta resolución):
Las estimaciones son excelentes como por otro lado era esperable al ser escenas sintéticas canónicas, debiéndose las desviaciones solo al hecho de haber situado las esquinas de cada trapezoide a ojo, redondeando a píxeles. En las siguientes gráficas podemos comparar las cifras obtenidas con las esperadas tanto en distancia focal como en relaciones de aspecto:
La siguiente secuencia de imágenes aplica el cálculo de la distancia focal valiéndonos de elementos rectangulares deformados presentes en todas ellas, y marcando los trapezoides usados en amarillo (hacer clic para verlas en alta resolución):
Fuente: Panasonic S1R con 14-28mm a 14mm → 14,60mm estimados
Fuente: Fuji X-S10 con 16,5mm (eq.) → 16,84mm estimados
Fuente: Ricoh GR IV con 28mm (eq.) → 28,26mm estimados
Fuente: Nikon Z8 con 45mm → 46,51mm estimados
Fuente: Canon R5 II con 85mm → 82,80mm estimados
Fuente: Sony A7R V con 100mm → 95,87mm estimados
Fuente: Sony A7R V con 200mm → 169,19mm estimados
Como avanzamos, conforme aumenta la focal aumenta el error de la estimación. El reducido ángulo de visión de las focales tele hace imposible lograr fugas importantes que son la base de la precisión del método.
En cambio en focales angulares tengo confianza en que el cálculo es muy preciso, dependiendo la desviación más de lo que el fabricante haya considerado informar como la focal nominal (que siempre se desvía un poco de la real) que de un error del cálculo:
Como remate de casi ciencia ficción, porque el trapezoide que he localizado en la foto apenas tiene fugas apreciables y tampoco sabemos cuánto recorte se pudo aplicar al positivar, estimamos la distancia focal de la famosa foto 'Lunch atop a Skyscraper' en 43,92mm para un formato de presentación 4:3:
Fuente: 'Lunch atop a Skyscraper' → 43,92mm estimados
Abandonando el ámbito fotográfico, y tal y como comprobamos con las "fotografías" sintéticas que usamos para validar el método al principio, las escenas rectilíneas de los videojuegos 3D son perfectas candidatas a dar valores muy precisos ya que cumplen todas las premisas ideales: amplias FOV (lo que proporciona fugas potentes) y ausencia total de distorsión de la óptica o no idealidad de los edificios.
Aplicando el cálculo a dos elementos rectangulares de esta captura de Quake III Arena calculamos con precisión una distancia focal cercana a los 19mm:
Fuente: Quake III Arena → 19,05mm estimados
Y para acabar por qué no atrevernos a estimar la distancia focal aplicable a un dibujo del señor Maurits Cornelis Escher?. Dado que está utilizando una perspectiva cónica con tres puntos de fuga, lo esperable es que los elementos rectangulares de la escena sean todos coherentes con una misma distancia focal, que estimamos de unos 30mm:
Fuente: Escher → ~30mm estimados
Repositorio con el código R:
GitHub.
Enhorabuena. Me sorprende la precisión que logras en algo tan ambíguo.
ResponderEliminar