БПФ изображения - PullRequest
       8

БПФ изображения

2 голосов
/ 11 июля 2009

У меня есть задание о fftw, и я пытался написать небольшую программу для создания fft изображения. Я использую CImg для чтения и записи изображений. Но все, что я получаю, это темное изображение с одной белой точкой: (* ​​1001 *

Скорее всего, я делаю это неправильно, и я был бы признателен, если бы кто-нибудь смог объяснить, как это сделать. Мне не нужен код, мне просто нужно знать, как правильно это сделать.

Вот мой код:

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");

1 Ответ

5 голосов
/ 11 июля 2009

Вам нужно взять логарифм величины. Одна белая точка является базовым значением (0 Гц, постоянный ток, как бы вы это ни называли), поэтому она почти ВСЕГДА будет самым большим компонентом любого изображения, которое вы берете (поскольку значения пикселей не могут быть отрицательными, значение постоянного тока будет всегда быть позитивным и большим).

Что вам нужно сделать, это рассчитать логарифм (в любом случае, логарифмический расчет какого-либо типа) величины (то есть после того, как вы перешли из комплексной формы в амплитудно-фазовую (фазорная запись iirc?)) Для каждой точки прежде чем вы нормализуете его.

Пожалуйста, обратите внимание, что значения есть, они просто ДЕЙСТВИТЕЛЬНО малы по сравнению со значением постоянного тока, принимая журнал (который делает меньшие значения больше, а большие только немного больше) сделает другие частоты видимыми.

...