Вопрос

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

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

Вот мой код:

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");
Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top