Каким должен быть ввод и вывод для преобразования изображения FFT?

Я пытаюсь получить спектр изображения в градациях серого, используя алгоритм БПФ Кули – Тьюки в Java. Я не знаю точно, как сформировать входные данные для алгоритма и какие значения из выходных данных использовать для формирования спектрального изображения.

В настоящее время мои входные данные представляют собой массив комплексных чисел, с Re = значением пикселя в 8-битной серой области и Im = 0; После запуска алгоритма я получаю другой массив комплексных чисел с вещественной частью, имеющей много значений вне диапазона [0,255] и мнимой части 0. Я попытался создать изображение из массива действительных чисел по модулю 256.

Вот так должен выглядеть спектр:

И вот что я получил:

Очевидно, я делаю что-то ужасное неправильно, но я не знаю что.

1 ответ

Решение

Вы не предоставили свой исходный код...

  1. ваш результат выглядит как дерево разрешения

    используется для рекурсивного масштабирования информации о разрешении / частоте и извлечения признаков, не FFT!!! Поэтому, возможно, ваша рекурсия неверна или вы перекрываете данные (кодировать на месте БПФ - это практически безумие), вам следует начать с 1D преобразования, а затем использовать его для 2D и визуально проверять каждый этап (также обратное преобразование для соответствия исходным данным).

  2. ваш выход FFT должен иметь ненулевую мнимую часть!!!

    смотрите здесь Как вычислить дискретное преобразование Фурье и во все подлинки в этом моем ответе

  3. ваше разрешение изображения точная сила 2?

    если бы не ноль, он или БПФ не будет работать должным образом

  4. ваш пример неверен

    Вот как это выглядит в реальности:

    Пример 2D БПФ

    • слева - входное изображение (скопировано с вашего вопроса)
    • середина реальная часть
    • право мнимая часть

    Вы можете объединить их в спектр мощности =sqrt(Re*Re+Im*Im) изображение Re и Im усиливается, чтобы его можно было увидеть, иначе было бы видно лишь несколько белых точек в углах. Вот еще несколько примеров:

    больше примеров

    ваш ожидаемый результат выглядит как сдвинутое на половину разрешения изображения (поэтому центр симметрии находится в центре изображения, а не в углах)

[Edit1] power and wrap

добавили функции power и wrap в мое приложение, так что вот результат:

сила и результат обертывания

Сначала сила вычисляется так intensity=sqrt(Re^2+Im^2) и затем обтекание выполняется путем смещения изображения на половину размера вправо и вниз. Что пересекается с другой стороной назад, так что просто поменяйте местами все точки во всех линиях swap((x,y),(x+xs/2,y)) и то же самое для всех столбцов swap((x,y),(x,y+ys/2)), Теперь результат совпадает с тем из OP, приложение здесь

Другие вопросы по тегам