sábado, 28 de febrero de 2026

Calculando la distancia focal con que se hizo una fotografía

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 matemáticamente la distancia focal con que se hizo una fotografía, solo analizando el contenido de la imagen. Si aguantas la breve introducción histórica y geométrica, verás que funciona y es mágico.

Este ejercicio tiene su origen en el intento de corroborar algo que por intuición llevo años pensando, y es que a partir de una escena afectada por una deformación de perspectiva (fugas cónicas), debería ser posible automatizar el cálculo de la corrección 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 tanteo y no hacen hincapié en la recuperación de las proporciones del objeto corregido, sembrando todas las dudas sobre si realmente pueden hacer esto que buscaba.

Pues bien, en el artículo 'Whiteboard It! Convert Whiteboard Content into an Electronic Document', su autor Zhengyou Zhang precisamente aborda este problema matemático con la intención de poder corregir fotografías hechas a una pizarra:

"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 forma de rectángulo, se muestre por efecto de la perspectiva como un trapezoide (cuadrilátero sin ningún lado paralelo), a partir de la localización de sus cuatro esquinas podremos calcular matemáticamente dos parámetros muy potentes:
  • La relación de aspecto del rectángulo usado como referencia, lo que permitirá con una transformación trapezoidal realizar una corrección de perspectiva que elimine las fugas y a la vez restaure las proporciones reales del objeto (p.ej. la fachada de un edificio o una obra pictórica).
  • La distancia focal con que se realizó la toma en píxeles y su equivalencia en ángulo de visión abarcado (FOV). Traducir esta FOV en una distancia focal en mm asociada a cualquier tamaño de sensor (típ. FF) es inmediato. Para el autor la distancia focal, parámetro clave en fotografía, era solo un paso previo al cálculo de relación de aspecto que le interesaba.

Como requisito 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, siendo los otros dos lados paralelos, sería 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 lados paralelos, es decir el más deformado que podemos tener, es el que nos 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 cuando alguno de sus pares de lados se aproximan a ser paralelos. Para obtener resultados robustos es muy conveniente localizar trapezoides con el máximo de fuga en ambos ejes y lo más grandes posibles. La distorsión geométrica de la óptica se traduce en un error en la definición del trapezoide por lo que conviene mucho corregirla previamente. 

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, o ya corregida en perspectiva, no arrojará datos correctos. Si el recorte es simétrico respecto al centro el cálculo es factible, aunque proporcionará la distancia focal correspondiente al recorte.

Se requieren fugas lo más explícitas posible, ya que las ecuaciones implicadas empiezan a ser inestables conforme aumentamos la focal debido a que con ángulos de visión tele los lados de cualquier rectángulo se proyectan cada vez más paralelos.

Aunque hablemos de la necesidad de disponer de un trapezoide de referencia, en realidad este no requiere existir explícitamente en la escena. Es suficiente encontrar dos parejas de rectas, paralelas dos a dos en el mundo real, que nos sirvan como guías para derivar el trapezoide por sus intersecciones.

~~~

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 cuatro esquinas del trapezoide identificado, proporciona los datos buscados en la siguiente forma (formato de la imagen usada, después relación de aspecto en el mundo real del rectángulo escogido para hacer el cálculo, y finalmente distancia focal en mm relativos al formato FF y FOV correspondientes 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 (eq. FF) 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 arbitrarias (hacer clic para ver en alta resolución):




Las estimaciones son excelentes como 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 de la captura valiéndonos de elementos rectangulares deformados presentes en todas ellas, y marcando los trapezoides usados en amarillo. También se dan las proporciones reales del rectángulo elegido (hacer clic para verlas en alta resolución):

Fuente: Panasonic S1R con 14-28mm a 14mm14,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 45mm46,51mm estimados


Fuente: Canon R5 II con 85mm82,80mm estimados


Fuente: Sony A7R V con 100mm95,87mm estimados


Fuente: Sony A7R V con 200mm169,19mm estimados


Como ya dijimos, conforme aumenta la focal aumenta el error de la estimación. El reducido ángulo de visión de las focales tele (me da que a partir de 200mm la cosa se complica mucho) 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 preciso, dependiendo la desviación más de lo que el fabricante haya considerado informar como focal nominal (que siempre se desvía un poco de la real) que de un error del cálculo:



Como remate de ciencia ficción, porque el trapezoide que he localizado en la foto apenas tiene fugas apreciables y tampoco sabemos cuanto recorte se aplicó al positivar, estimamos la distancia focal de la famosa foto 'Lunch atop a Skyscraper' en 43,92mm para su 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

~~~

Un par de notas adicionales sobre este sistema. No es preciso que las cuatro esquinas del trapezoide considerado caigan dentro de la imagen, pueden caer fuera mientras puedan localizarse prolongando los lados del trapezoide y darles las coordenadas correspondientes, como hice en uno de los cuadros de la muestra de la Panasonic S1R.

En cuanto a las aplicaciones prácticas del método, además de la obvia de saber qué distancia focal se usó en una fotografía arbitraria de la que no tenemos datos EXIF, incluso si tuviéramos la focal en los metadatos podemos averiguar cuánto recorte pudiera llevar la imagen. También puede estimarse la focal efectiva de una óptica (preferentemente angular), como las de las cámaras de un móvil que siempre están rodeadas de cierto halo de ofuscación.

En 'Corrección de perspectiva preservando la relación de aspecto' usaremos también este cálculo, pero centrándonos en la obtención de la relación de aspecto del objeto original, para restaurar las proporciones reales de una escena mediante una corrección geométrica de sus fugas.

En 'La fotografía de 'Better Call Saul' y validaciones Montecarlo' se muestran más ejemplos de cálculos de distancia focal sobre fotografías reales, en este caso fotogramas de una serie de TV. Estudiamos más a fondo la inestabilidad que sufren las ecuaciones cuando no hay fugas claras y se propone un método estadístico de tipo Montecarlo para validar o invalidar el resultado.

Como último ejercicio en 'Calculando la distancia focal de la cámara de un móvil' utilizamos el método para calcular la distancia focal efectiva de la cámara principal de un móvil, un parámetro que no siempre es informado de forma clara por los fabricantes ni conocido por los usuarios.

Repositorio con el código R: GitHub.

1 comentario:

  1. Enhorabuena. Me sorprende la precisión que logras en algo tan ambíguo.

    ResponderEliminar

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.