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.
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.