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 la transformación matemática que vamos a estudiar.
Una imagen obtenida con una perspectiva 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 definiendo 3 parámetros de ajuste:
- Yaw = Paneo: rotación a izquierda/derecha
- Pitch = Cabeceo: rotación arriba/abajo
- 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: los píxeles planos de la imagen de entrada se convierten a coordenadas tridimensionales (x, y, z), 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 3D de acuerdo a la operación o grupo de operaciones codificadas en la matriz. Finalmente las nuevas coordenadas tridimensionales 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.
La obtención de la matriz R para realizar cada una de las anteriores rotaciones se lleva a cabo con trigonometría simple:

Las rotaciones pueden acumularse en una única matriz que ejecute todas las operaciones 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 algunas iteraciones para poder añadir un parámetro de zoom y cambiar un par de detalles menores sobre criterios de coordenas, he obtenido una función en C++ ultrarrápida que aplica las transformaciones definidas por cualquier matriz de rotación sobre cualquier imagen. 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 Roll, Pitch y Yaw, 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á en este tipo de aplicaciones: como vimos en 'Corrección de perspectiva preservando la relación de aspecto', 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), proporcione 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:
El resultado es impecable y exactamente igual al que obtuvimos, de una forma mucho más rebuscada todo hay que decirlo, en el artículo mencionado 'Corrección de perspectiva preservando la relación de aspecto'. Pese a seguir vías muy diferentes, en las dos ejecuciones se obtuvo la misma relación de aspecto para la figura de referencia.
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 las proporciones reales de un sujeto es algo utilísimo, 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.