5.24. Transformações polares

As coordenadas polares identificam 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 a partir da origem no canto superior esquerdo. A representação justifica a sua utilidade através de uma identidade: a rotação em torno do centro escolhido torna-se uma translação ao longo do eixo angular, o que permite a um algoritmo invariante à rotação pesquisar um espaço de parâmetros muito mais simples do que trabalhar diretamente com rotações. 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 da saída corresponde a um ângulo fixo em torno do centro; cada linha da saída corresponde a uma distância fixa do centro.

img.linpolar()

logpolar() executa a mesma reprojeção com um eixo de distância logarítmico. O tratamento angular é idêntico; o que difere é que as distâncias crescem exponencialmente ao longo das linhas da saída, em vez de linearmente. Esta diferença tem importância por causa da segunda identidade geométrica que as coordenadas polares expõem: escalar a fonte em torno do centro escolhido torna-se uma 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 desloca-a de uma quantidade fixa.

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, sendo o valor padrão metade da largura da imagem e metade da altura da imagem, respetivamente. A escolha do centro é importante: uma transformação polar em torno do ponto errado resulta em conteúdo reorganizado 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.

Uma face de relógio reprojetada por linpolar() e logpolar(). Os círculos concêntricos na fonte tornam-se linhas horizontais na saída; as marcas de divisão angulares tornam-se linhas verticais igualmente espaçadas ao longo do eixo angular. A variante log-polar comprime o espaçamento radial.

5.24.2. Quando usar cada um

A escolha entre linpolar() e logpolar() é a escolha de qual invariância a aplicação necessita. Para invariância à rotação apenas – detetar que a mesma cena aparece em dois fotogramas, o segundo rodado por um ângulo desconhecido – linpolar() é suficiente: a rotação torna-se um deslocamento horizontal na imagem polar, e um correspondente só de translação como find_displacement() recupera o ângulo como a dimensão do deslocamento. Quando a invariância de escala também é importante – o segundo fotograma está rodado e ampliado – logpolar() colapsa ambas as incógnitas em translações: horizontal para a rotação, vertical para a escala.

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

5.24.3. Desdobramento de características circulares

Uma utilização separada das transformações polares é o desdobramento de características que são naturalmente circulares na imagem. Uma face de relógio, um mostrador de manómetro, um alvo de inspeção que é circular por design – todos eles tornam-se lineares na projeção polar, que é a forma com que a maioria dos algoritmos trabalha mais facilmente.

A figura acima mostra-o diretamente: as doze marcas de divisão numa face de relógio, igualmente espaçadas em torno da circunferência em Cartesiano, tornam-se doze linhas verticais igualmente espaçadas na imagem polar. Um retângulo em torno de qualquer marca de divisão na imagem polar identifica a posição dessa marca independentemente da orientação em que a face do relógio foi capturada. Um correspondente de template executado sobre a imagem polar encontra todas as marcas de divisão numa ú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 depois chama a forma inversa para reprojetar o resultado de volta para Cartesiano para qualquer etapa a jusante que precise de o ver.

A utilização mais comum é modificar uma imagem polar e reprojetar de volta: um filtro aplicado à imagem polar – uma suavização horizontal que, em termos polares, borra entre ângulos mas preserva a estrutura radial – produz um resultado Cartesiano que foi borrado angularmente, o que não é algo que um filtro Cartesiano consiga fazer diretamente.