Freqüência zero de centralização para Transformação Discreta de Fourier


11

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(-1)x+yxy1-1

De acordo com as notas, isto é equivalente a trocar os quadrantes de matriz lançando entre os e y eixo.xy

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


Você também pode encontrar alguma referência no Capítulo 4, 4.6-Implementação do Digital Image Processing de Gonzalez (eu tenho a segunda edição). Espero que ajude.
hakunami

Respostas:


18

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

xy

Aqui está uma imagem de teste: imagem de teste. Sua transformação de Fourier se parece com:transformação de Fourier da imagem de teste

Se você tomar a transformada de Fourier da imagem alternada ( imagem quadriculado), que resulta em um único ponto bem no centro da transformada de Fourier: insira a descrição da imagem aqui. (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: imagem convolvida, enquanto convolving a transformada de Fourier imagem com o kernel de rotação (no domínio da freqüência) dá-lhe: transformada de Fourier girada.

E podemos verificar que multiplicando o TestImage pelo quadriculado no domínio da imagem dá imagem de multiplicação, que tem uma transformada de Fourier: transformada de Fourier novamente rotacionada.


Estou confuso. Isso está usando convolução para implementar uma fftshiftfunção -like? Não é computacionalmente mais barato apenas reorganizar os quatro quadrantes diretamente?
Endolith

2
Não há convolução direta aqui. Isso está usando a multiplicação em pixels no domínio da imagem para obter o equivalente a uma convolução no domínio de quatro camadas. Sim, fftshiftnã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.
Wandering Logic

Oh, certo, é um sinal de virar, não uma multiplicação real.
endolith

Por que a transformação de Fourier da imagem de teste (a segunda imagem) se parece com isso? Na verdade, vejo duas imagens, uma preta sobre a outra.
hakunami

10

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:

(-1)k=ejωω2π(k/2)

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.