FFT dos dados da imagem: "espelhamento" para evitar efeitos de contorno

8

Carrego e exibo uma imagem de arroz no Matlab:

g = imread('rice.png');
imshow(g);

arroz

Pego a FFT desta imagem e a desloco:

G = fft2(g);
imshow(log(abs(fftshift(G)) + 1), []);

FFT (arroz)

Se eu colocar os eixos ax e y no centro da imagem; Acho que a imagem é simétrica g (-x, -y) = g (x, y). Para um sinal 1D, temos que a FFT de um sinal real tem uma parte real simétrica e uma parte imaginária assimétrica. Eu acho que é o que vemos aqui em 2 dimensões?

Como a imagem original é mais escura na parte inferior do que na parte superior, há uma forte descontinuidade horizontal no limite periódico, causando a linha vertical na FFT.

Eu quero me livrar desse efeito de fronteira. Uma abordagem comum para isso parece ser de janelas .

No entanto, eu quero resolver esse problema por uma técnica que encontrei em um artigo chamado "espelhamento". O documento não era muito específico, por isso preciso da sua ajuda para descobrir essa abordagem :-).

Primeiro, crio um "bloco" simétrico a partir da imagem original:

tile=[flipdim(g,2) g; flipdim(flipdim(g,1),2) flipdim(g,1)];
imshow(tile);

insira a descrição da imagem aqui

Agora eu tomo a FFT desse "bloco":

Tile=fft2(tile);
imshow(log(abs(fftshift(Tile)) + 1), []) 

insira a descrição da imagem aqui

A linha vertical parece ter desaparecido (quase): boa. No entanto, o espelhamento parece ter introduzido mais simetria.

Qual é o resultado correto: a FFT da imagem original ou a FFT da imagem "espelhada"?

Existe uma maneira de eu "espelhar" para que eu me livre dos efeitos dos limites e obtenha uma FFT puramente real?

Agradecemos antecipadamente por qualquer resposta!

Andy
fonte

Respostas:

13

O FFT da imagem original está correto. Os artefatos que você está vendo são típicos para a DFT, porque as funções básicas da DFT têm dificuldade em representar sinais não periódicos. Embora o DFT tenha comprimento finito, na verdade representa um sinal periódico que se estende ao infinito negativo e positivo. As funções básicas da DFT são todos sinusóides com períodos que são divisores inteiros do tamanho da DFT; portanto, todos começam e terminam no mesmo valor, e é difícil ajustar sinais que não sejam periódicos dessa maneira. Então, imagine colocar sua imagem em mosaico: há de fato uma descontinuidade abrupta nas bordas. As arestas não combinam bem, e essa é a razão dos efeitos dos limites.

No processamento de sinal de áudio, onde a FFT é usada com frequência, uma abordagem muito comum é usar uma função de janela , como você observou. Isso reduz as bordas em direção a 0 e reduz esse efeito.

No processamento de imagens, o DCT é geralmente usado em vez do DFT, porque impõe restrições de simetria diferentes que fornecem melhores resultados. Em outras palavras, é usado para impedir exatamente o problema que você está vendo. Em contraste com as funções básicas do DFT (lembre-se de como todas elas iniciam e terminam no mesmo valor), as funções básicas do DCT são divisores inteiros ou metade dos divisores inteiros, muitos deles iniciam e terminam com valores diferentes. Como resultado, as condições de contorno implícitas são diferentes: supõe-se que o sinal seja simétrico em relação a suas bordas, o que é realmente um pouco semelhante ao "espelhamento" com o qual você estava experimentando. Aqui está outro post meu com um pouco mais de informações sobre o DCT: https://dsp.stackexchange.com/a/362/392

Portanto, como um breve resumo, se você está absolutamente decidido a usar a FFT, pode tentar fazer uma janelinha. No entanto, a melhor opção é provavelmente usar o DCT, o que implica condições de contorno semelhantes à sua idéia de "espelhamento" e, como resultado, lida melhor com as imagens.

schnarf
fonte
Pelo que pude entender, o DFT implica em extensão periódica, enquanto o DCT implica em extensão uniforme. Ao fazer a compactação de imagem, trabalha-se em pequenos blocos da imagem. Uma vez que a extensão periódica implícita na DFT causa saltos na fronteira, o que diminui a taxa de convergência; é melhor usar o DCT para compactação de imagem (convergência mais rápida-> arquivos menores com a mesma quantidade de informações visíveis). No entanto, o DCT parece ser mencionado principalmente neste contexto. O contexto em que estou trabalhando é que desejo filtrar uma imagem por um filtro Gabor. Isso pode ser feito usando o DCT?
Andy Andy
Se você quiser filtrar a imagem com um filtro Gabor, basta usar a FFT. As condições de contorno não serão um problema. Por que você está preocupado com as condições de contorno ou com um espectro puramente real para filtrar com um filtro Gabor?
Schnarf
Em relação a ter um espectro puramente real: preciso estimar as frequências dominantes: fu = Soma (u * G) / Soma (G) e fv, onde G (u, v) é a FFT da minha imagem g (x, y) . Eu não entendo como isso funciona se G é complexo. Eu receberia um fu complexo?
Andy Andy
Em vez de considerar os valores complexos, você deve considerar suas magnitudes. Ou seja, para cada bin de frequência complexa z = a + bi, sua magnitude é sqrt (a ^ 2 + b ^ 2).
Schnarf
Outra coisa a se pensar: pode parecer confuso que você esteja usando dados reais e obtendo um espectro complexo. O espectro complexo é apenas uma maneira de dar a cada sinusóide uma fase específica.
Schnarf