5.24. Transformações polares

As coordenadas polares nomeiam cada pixel por um ângulo a partir de uma direção de referência e por uma distância a partir de um centro escolhido, em vez dos deslocamentos horizontal e vertical em relação à origem no canto superior esquerdo. Essa representação se justifica por uma identidade: a rotação em torno do centro escolhido se torna translação ao longo do eixo de ângulo, o que permite que um algoritmo invariante a rotação pesquise um espaço de parâmetros muito mais simples do que rotações diretamente. linpolar() e logpolar() executam a reprojeção.

5.24.1. Os dois métodos

linpolar() executa a reprojeção de cartesiano para polar com um eixo de distância linear. Cada coluna de saída corresponde a um ângulo fixo ao redor do centro; cada linha de saída corresponde a uma distância fixa a partir do centro.

img.linpolar()

logpolar() executa a mesma reprojeção com um eixo de distância logarítmico. O tratamento do ângulo é idêntico; o que difere é que as distâncias crescem exponencialmente ao longo das linhas da saída, em vez de linearmente. A diferença importa por causa da segunda identidade geométrica que as coordenadas polares expõem: escalonar a fonte em torno do centro escolhido se torna translação ao longo do eixo de distância – mas apenas quando esse eixo é logarítmico. Com um eixo de distância linear, o escalonamento estica a imagem polar; com um eixo de distância logarítmico, o escalonamento a desloca por um valor fixo.

img.logpolar()

Ambos os métodos aceitam as palavras-chave x= e y= que definem o centro da reprojeção polar em coordenadas de pixel da fonte, com valor padrão de metade da largura da imagem e metade da altura da imagem, respectivamente. A escolha do centro importa: uma transformação polar em torno do ponto errado acaba com o conteúdo embaralhado de formas que destroem a identidade de rotação / translação.

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.

Um mostrador de relógio reprojetado por linpolar() e logpolar(). Círculos concêntricos na fonte se tornam linhas horizontais na saída; marcas de tique angulares se tornam linhas verticais uniformemente espaçadas ao longo do eixo de ângulo. A variante log-polar comprime o espaçamento radial.

5.24.2. Quando usar cada uma

A escolha entre linpolar() e logpolar() é a escolha de qual invariância a aplicação precisa. Para invariância a rotação apenas – detectar que a mesma cena aparece em dois quadros, o segundo rotacionado por um ângulo desconhecido – linpolar() é suficiente: a rotação se torna um deslocamento horizontal na imagem polar, e um comparador apenas de translação como find_displacement() recupera o ângulo como o tamanho do deslocamento. Quando a invariância a escala também importa – o segundo quadro está rotacionado e com zoom – logpolar() reduz ambas as incógnitas a translações: horizontal para rotação, vertical para escala.

Essa é a receita padrão para um rastreador que é robusto contra mudanças de rotação e escala: reprojetar o quadro de referência e cada quadro ao vivo para log-polar em torno do mesmo centro, executar find_displacement() no par e ler os campos rotation e scale do resultado.

5.24.3. Desenrolando características circulares

Um uso separado das transformações polares é desenrolar características que são naturalmente circulares na imagem. Um mostrador de relógio, o disco de um medidor, um alvo de inspeção que é circular por projeto – todos eles se tornam lineares na projeção polar, que é a forma com a qual a maioria dos algoritmos acha mais fácil trabalhar.

A figura acima mostra isso diretamente: as doze marcas de tique em um mostrador de relógio, uniformemente espaçadas ao redor da circunferência em cartesiano, se tornam doze linhas verticais uniformemente espaçadas na imagem polar. Um retângulo em torno de qualquer uma das marcas de tique na imagem polar identifica a posição daquela marca de tique independentemente de para qual direção o mostrador do relógio estava rotacionado quando capturado. Um comparador de modelos executado pela imagem polar encontra todas as marcas de tique em uma única passagem.

5.24.4. O mapeamento inverso

reverse=True executa o inverso da projeção polar direta: dada uma imagem polar, produz a imagem cartesiana cuja projeção polar ela é. A aplicação chama a forma direta para executar um algoritmo em coordenadas polares e, em seguida, chama a forma reversa para projetar o resultado de volta para cartesiano para qualquer estágio posterior que precise vê-lo.

O uso mais comum é modificar uma imagem polar e projetá-la de volta: um filtro aplicado à imagem polar – uma suavização horizontal que, em termos polares, borra através dos ângulos mas preserva a estrutura radial – produz um resultado cartesiano que foi borrado angularmente, o que não é algo que um filtro cartesiano possa fazer diretamente.