5.24. Transformadas polares

Las coordenadas polares identifican cada píxel mediante un ángulo respecto a una dirección de referencia y una distancia desde un centro elegido, en lugar de los desplazamientos horizontal y vertical respecto al origen en la esquina superior izquierda. Esta representación resulta útil gracias a una identidad: la rotación en torno al centro elegido se convierte en una traslación a lo largo del eje angular, lo que permite que un algoritmo invariante a la rotación explore un espacio de parámetros mucho más sencillo que el de las rotaciones directas. linpolar() y logpolar() realizan la reproyección.

5.24.1. Los dos métodos

linpolar() realiza la reproyección de coordenadas cartesianas a polares con un eje de distancia lineal. Cada columna de salida corresponde a un ángulo fijo alrededor del centro; cada fila de salida corresponde a una distancia fija desde el centro.

img.linpolar()

logpolar() realiza la misma reproyección con un eje de distancia logarítmico. El tratamiento del ángulo es idéntico; lo que cambia es que las distancias crecen exponencialmente a lo largo de las filas de la salida en lugar de hacerlo linealmente. La diferencia es importante por la segunda identidad geométrica que revelan las coordenadas polares: el escalado de la fuente en torno al centro elegido se convierte en una traslación a lo largo del eje de distancia, pero solo cuando ese eje es logarítmico. Con un eje de distancia lineal, el escalado estira la imagen polar; con un eje de distancia logarítmico, el escalado la desplaza en una cantidad fija.

img.logpolar()

Ambos métodos aceptan las palabras clave x= e y= que fijan el centro de la reproyección polar en coordenadas de píxel de la fuente, con valores por defecto iguales a la mitad del ancho y la mitad del alto de la imagen, respectivamente. La elección del centro es importante: una transformada polar en torno al punto equivocado acaba con el contenido revuelto de formas que destruyen la identidad de rotación / traslación.

Three panels in a row. The leftmost is a Cartesian source image showing a clock face -- two concentric circles with twelve tick marks around the outer rim at multiples of 30 degrees, and a single hand pointing in one direction. The middle panel shows the linpolar re-projection of that source: a rectangular output image where the twelve tick marks appear as evenly spaced vertical strokes along the top row, the two concentric circles appear as two horizontal lines at different vertical positions, and the clock hand appears as a single vertical line at the position corresponding to its angle in the source. The rightmost panel shows the logpolar re-projection: the same angular distribution along the horizontal axis, but with the gap between the inner and outer circles compressed because the distance axis is logarithmic.

Una esfera de reloj reproyectada por linpolar() y logpolar(). Los círculos concéntricos de la fuente se convierten en líneas horizontales en la salida; las marcas de graduación angulares se convierten en líneas verticales uniformemente espaciadas a lo largo del eje angular. La variante log-polar comprime el espaciado radial.

5.24.2. Cuándo recurrir a cada uno

La elección entre linpolar() y logpolar() es la elección de qué invarianza necesita la aplicación. Para la invarianza a la rotación por sí sola – detectar que la misma escena aparece en dos fotogramas, el segundo rotado un ángulo desconocido – linpolar() es suficiente: la rotación se convierte en un desplazamiento horizontal en la imagen polar, y un emparejador basado únicamente en traslación como find_displacement() recupera el ángulo como la magnitud del desplazamiento. Cuando la invarianza a la escala también importa – el segundo fotograma está rotado y ampliado – logpolar() reduce ambas incógnitas a traslaciones: horizontal para la rotación, vertical para la escala.

Esa es la receta estándar para un rastreador robusto frente a cambios de rotación y escala: reproyectar el fotograma de referencia y cada fotograma en vivo a log-polar en torno al mismo centro, ejecutar find_displacement() sobre el par, y leer los campos rotation y scale del resultado.

5.24.3. Desenrollado de características circulares

Un uso aparte de las transformadas polares es el desenrollado de características que son naturalmente circulares en la imagen. La esfera de un reloj, la carátula de un manómetro, un objetivo de inspección que es circular por diseño – todos ellos se vuelven lineales en la proyección polar, que es la forma con la que la mayoría de los algoritmos trabajan más fácilmente.

La figura anterior lo muestra directamente: las doce marcas de graduación de la esfera de un reloj, uniformemente espaciadas alrededor de la circunferencia en coordenadas cartesianas, se convierten en doce líneas verticales uniformemente espaciadas en la imagen polar. Un rectángulo alrededor de cualquiera de las marcas en la imagen polar identifica la posición de esa marca independientemente de la orientación en que estuviera rotada la esfera del reloj al capturarla. Un emparejador de plantillas ejecutado a lo largo de la imagen polar encuentra todas las marcas de graduación en una sola pasada.

5.24.4. El mapeo inverso

reverse=True ejecuta la inversa de la proyección polar directa: dada una imagen polar, produce la imagen cartesiana cuya proyección polar es. La aplicación llama a la forma directa para ejecutar un algoritmo en coordenadas polares, y luego llama a la forma inversa para proyectar el resultado de vuelta a coordenadas cartesianas para cualquier etapa posterior que necesite verlo.

El uso más común es modificar una imagen polar y proyectarla de vuelta: un filtro aplicado a la imagen polar – un suavizado horizontal que, en términos polares, difumina a lo largo de los ángulos pero preserva la estructura radial – produce un resultado cartesiano que ha sido difuminado angularmente, algo que un filtro cartesiano no puede hacer directamente.