Estou tendo problemas para identificar os componentes de frequência de uma imagem,
Aqui, simplesmente gerei, 256×256 binários- imagem.
a = [zeros(256,128) ones(256,128)]; imshow(a);
Pegando a imagem FFT e mudando a frequência zero ao centro,
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
resultará,
Como eu identifico quantos componentes de frequência existem e quais são essas frequências?
Além disso, se eu calcular FFT de qualquer sequência 1-D e plotar essa sequência, há certos valores negativos, o que isso significa? Como poderia haver frequências negativas?
Comentários
- Relacionados (possível duplicata): dsp. stackexchange.com/q/1637/77
- Uma das melhores maneiras de entender o que uma transformação faz é experimentar a transformação inversa . Desenhe um ponto e depois transforme-o no sentido inverso para ver as ondas que ele produz. Em seguida, tente um ponto em um lugar diferente, depois uma linha, etc. Quanto às frequências negativas, consulte dsp.stackexchange.com/q/431/29
Resposta
como pode haver frequências negativas?
Os coeficientes FFT não são frequências, mas amplitudes complexas. O módulo do coeficiente indica a amplitude, o argumento do coeficiente indica a fase.
Observe que você deve estar recebendo um aviso ou mensagem de erro do Matlab para calcular log(shft)
, como shft é uma matriz complexa, o resultado não é real e não pode ser plotado como uma imagem.
Comentários
- Tudo o que você diz é verdade, mas também está evitando a questão. Metade dos coeficientes pode ser interpretada como correspondendo a frequências negativas.
Resposta
Minha primeira sugestão é que você entender FFT em 1 dimensão antes de tentar interpretar resultados em 2D.
A Transformada Discreta de Fourier (FFT é uma implementação de DFT) é uma transformada complexa: ela transforma entre 2 vetores vetores complexos de tamanho N.
Portanto, no caso 1D, você obterá não apenas valores negativos, mas também valores complexos em geral.
O mesmo se aplica a 2D. A função imshow provavelmente está pegando a parte real da matriz complexa (não está claro na documentação do imshow).
Resposta
Está faltando o comando abs
.
Tente o seguinte:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching