Estou trabalhando em um aplicativo de processamento de imagem que usa uma transformação fourier discreta para implementar a desfocagem / nitidez. O aplicativo está mais ou menos funcionando, mas algo sobre a mecânica ainda é confuso para mim.
Em particular, é como o processo de centralizar as frequências zero está sendo realizado.
O exemplo que eu vi processa previamente a imagem de entrada (de intensidades em escala de cinza) multiplicando-a por uma matriz de tamanho igual à imagem de entrada, cujos valores são , onde x é a linha, y é a coluna, então um padrão alternando 1 e - 1
De acordo com as notas, isto é equivalente a trocar os quadrantes de matriz lançando entre os e y eixo.
Entendo por que isso é feito e gostaria de enfatizar que entendo que meu código / material de Fourier estão funcionando, só não entendo por que multiplicar a matriz de entrada por 1 / -1 acaba centralizando o componente de frequência zero em torno de 0.
obrigado
Respostas:
Oh! Que truque legal! Funciona devido ao teorema da convolução (isto é, multiplicação no domínio espacial / tempo é equivalente a convolução no domínio da frequência).
Aqui está uma imagem de teste: . Sua transformação de Fourier se parece com:
Se você tomar a transformada de Fourier da imagem alternada ( ), que resulta em um único ponto bem no centro da transformada de Fourier: . (Lembre-se de que ainda não fizemos nossa rotação, o centro da transformação de Fourier são as altas e as baixas frequências ainda estão nos cantos.) Mas esse é o "núcleo de rotação!" A participação nesse kernel de rotação move tudo para baixo e para a direita (mas as coisas que caem do canto inferior direito giram para o canto superior esquerdo).
Convolving a imagem original com o kernel de rotação (no domínio da imagem) dá-lhe: , enquanto convolving a transformada de Fourier imagem com o kernel de rotação (no domínio da freqüência) dá-lhe: .
E podemos verificar que multiplicando o TestImage pelo quadriculado no domínio da imagem dá , que tem uma transformada de Fourier: .
fonte
fftshift
função -like? Não é computacionalmente mais barato apenas reorganizar os quatro quadrantes diretamente?fftshift
não é muito caro, mas esse truque pode ter um melhor comportamento de cache. A multiplicação de pixel é na verdade apenas lançando o sinal de qualquer outro pixel. Tão fácil de vetorizar, a gravação da leitura-modificação-gravação é um acerto garantido no cache, e é fácil para o processador pré-buscar as leituras.A resposta da Wandering Logic está correta e detalhada. Apenas pensei que você gostaria de ver um pouco de matemática em vez de fotos:
O efeito é que a frequência zero - que estava no índice 0 antes - agora está com metade da largura da imagem (ou altura, dependendo se você multiplica as colunas ou as linhas).
fonte