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