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!

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.


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