Pergunta

Eu tenho uma atribuição sobre fftw e eu estava tentando escrever um pequeno programa para criar uma FFT de uma imagem. Eu estou usando CImg de ler e imagens de escrita. Mas tudo o que eu vejo é uma imagem escura com um único ponto branco: (

Estou muito provavelmente fazendo isso da maneira errada e eu apreciaria se alguém poderia explicar como isso deve ser feito. Eu não preciso o código, eu só precisa saber qual é o caminho certo para fazer isso.

Aqui está o meu código:

CImg<double> input("test3.bmp");
CImg<double> image_fft(input, false);

unsigned int nx = input.dimx(), ny = input.dimy();
size_t align = sizeof(Complex);

array2<Complex> in (nx, ny, align);

fft2d Forward(-1, in);

for (int i = 0; i < input.dimx(); ++i) {
    for (int j = 0; j < input.dimy(); ++j) {
        in(i,j) = input(i,j);
    }
}

Forward.fft(in);

for (int i = 0; i < input.dimx(); ++i) {
    for (int j = 0; j < input.dimy(); ++j) {
        image_fft(i,j,0) = image_fft(i,j,1) = image_fft(i,j,2) = std::abs(in(i,j));
    }
}

image_fft.normalize(0, 255);
image_fft.save("test.bmp");
Foi útil?

Solução

Você precisa ter o log da magnitude. O ponto branco único é o valor base (0 Hz, DC, o que você quiser chamá-lo), por isso vai ser quase sempre de longe o maior componente de qualquer imagem que você tomar (desde valores de pixels não pode ser negativo, o valor DC vai sempre ser positivo e grande).

O que você precisa fazer é calcular o log (ln, qualquer que seja, algum tipo de cálculo logarítmica) da magnitude (assim depois de ter convertido a partir de complexo de forma magnitude / fase (notação fasorial IIRC?)) Em cada ponto antes de normalizá-lo.

Por favor, note que os valores estão lá, eles são apenas realmente pequeno em comparação com o valor DC, tomando o log (que faz os menores valores maiores por um monte, e valores maiores apenas ligeiramente maior) fará com que as outras frequências visíveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top