Каким должен быть ввод и вывод для преобразования изображения FFT?
Я пытаюсь получить спектр изображения в градациях серого, используя алгоритм БПФ Кули – Тьюки в Java. Я не знаю точно, как сформировать входные данные для алгоритма и какие значения из выходных данных использовать для формирования спектрального изображения.
В настоящее время мои входные данные представляют собой массив комплексных чисел, с Re = значением пикселя в 8-битной серой области и Im = 0; После запуска алгоритма я получаю другой массив комплексных чисел с вещественной частью, имеющей много значений вне диапазона [0,255] и мнимой части 0. Я попытался создать изображение из массива действительных чисел по модулю 256.
Вот так должен выглядеть спектр:
И вот что я получил:
Очевидно, я делаю что-то ужасное неправильно, но я не знаю что.
1 ответ
Вы не предоставили свой исходный код...
ваш результат выглядит как дерево разрешения
используется для рекурсивного масштабирования информации о разрешении / частоте и извлечения признаков, не FFT!!! Поэтому, возможно, ваша рекурсия неверна или вы перекрываете данные (кодировать на месте БПФ - это практически безумие), вам следует начать с 1D преобразования, а затем использовать его для 2D и визуально проверять каждый этап (также обратное преобразование для соответствия исходным данным).
ваш выход FFT должен иметь ненулевую мнимую часть!!!
смотрите здесь Как вычислить дискретное преобразование Фурье и во все подлинки в этом моем ответе
ваше разрешение изображения точная сила 2?
если бы не ноль, он или БПФ не будет работать должным образом
ваш пример неверен
Вот как это выглядит в реальности:
- слева - входное изображение (скопировано с вашего вопроса)
- середина реальная часть
- право мнимая часть
Вы можете объединить их в спектр мощности
=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, приложение здесь