Si has usado alguna vez el Street View de Google o cualquier motor visor de imágenes panorámicas que permita mover el punto de vista de la cámara (giro a derecha, izquierda,...), o las herramientas de corrección de perspectiva típicas de los reveladores RAW, lo que está ocurriendo en las tripas de tu ordenador es justo la transformación matemática que vamos a estudiar.
Una imagen obtenida con una proyección rectilínea (modelo de proyección pinhole o cámara oscura), es decir aquella que produce la inmensa mayoría de cámaras y ópticas del mercado, puede transformarse muy fácilmente para obtener la imagen equivalente a haber apuntado la cámara en cualquier otra dirección arbitraria solo con definir 3 parámetros de ajuste:
- Pitch = Cabeceo: rotación arriba/abajo
- Yaw = Paneo: rotación a izquierda/derecha
- Roll = Alabeo: rotación sobre el eje de la cámara

Cualquiera de estas operaciones, o combinaciones de varias de ellas, puede ejecutarse de la siguiente manera: las coordenadas 2D de los píxeles de la imagen de entrada se convierten a coordenadas 3D, obviamente contenidas en un plano. A continuación multiplicando esas coordenadas por una matriz R3x3 se lleva a cabo la rotación de las mismas en el espacio tridimensional de acuerdo a la operación o grupo de operaciones codificadas en la matriz. Finalmente las nuevas coordenadas 3D vuelven a proyectarse sobre el plano, obteniendo una nueva imagen 2D pero ya con los píxeles situados en nuevas posiciones de acuerdo a las transformaciones ejecutadas.
El cálculo de la matriz R para realizar cada una de las anteriores rotaciones se lleva a cabo con trigonometría euclídea estándar (hacer clic para implementación en R):
En la siguiente imagen tenemos el criterio de signos de las rotaciones tal y como las hemos implementado, mostrándose para valores de ángulos positivos (con ángulos negativos se tendría el efecto simétrico correspondiente):

Al ser operaciones lineales, las rotaciones pueden acumularse en una única matriz que ejecute todas las rotaciones con tan solo multiplicarlas entre sí, ahorrando tiempo de procesado así como pérdida de calidad en la imagen al hacer una única interpolación. NOTA: las operaciones de rotación en general no son conmutativas.
~~~
Con Gemini Pro y tras unas iteraciones para añadir parámetros de zoom y desplazamiento, he obtenido una función en C++ ultrarrápida que aplica las transformaciones definidas por cualquier matriz de rotación sobre una imagen arbitraria. Solo necesita el parámetro de la distancia focal con que fue obtenida dicha imagen.
Aquí se muestra una escena de partida sobre la que se aplica una rotación completa que incluye cambios de Pitch, Yaw y Roll, ejecutados los tres en un solo paso (hacer clic para ver en alta resolución con los detalles de la operación):
Podemos ir un paso más allá sabiendo que si en una escena del mundo real existe algún rectángulo que por efecto de la perspectiva aparece en la fotografía como un trapezoide irregular, podremos realizar una corrección del punto de vista hasta llevar la cámara a una dirección perpendicular a dicho rectángulo, con lo que este aparecerá en sus proporciones reales.
He pedido a Gemini Pro que, a partir de la localización de las 4 esquinas del trapezoide (marcado en amarillo), calcule la matriz de rotación que aplicada a la imagen haga que la cámara apunte de forma perpendicular a dicho rectángulo, restaurando su relación de aspecto en el mundo real. Aquí los 9 números mágicos que codifican la transformación y el resultado:
> R_frontal
[,1] [,2] [,3]
[1,] 0.97121407 -0.1405165 -0.1923495
[2,] -0.01256382 0.7761435 -0.6304311 [3,] 0.23787681 0.6147002 0.7520361La imagen es tal y como la obtuvimos, de una forma mucho más rebuscada todo hay que decirlo, en 'Corrección de perspectiva preservando la relación de aspecto'. Así pese a seguir vías diferentes de cálculo, en las dos ejecuciones se obtuvo la misma relación de aspecto para la figura de referencia autovalidando en cierto modo un ejercicio con el otro.
Ya dijimos entonces que esto que ha construido Gemini Pro en un par de horas de vibe coding, incomprensiblemente no lo hace ningún programa profesional de tratamiento de imágenes. Photoshop, Lightroom y Capture One permiten definir el trapezoide irregular pero luego ninguno de ellos es capaz, a partir de él, de restaurar la relación de aspecto real del objeto. Poder obtener automáticamente las proporciones reales de un sujeto es algo realmente útil, por no decir imprescindible, en fotografía de arquitectura, interiorismo, obras de arte,...
~~~
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.