Как сделать преобразование Фурье изображения с использованием haskell
Как сделать дискретное преобразование Фурье изображения с использованием haskell. Я полагаю, что две библиотеки repa-devil и repa-fftw могут быть полезны, но я не знаю, как их объединить. Причина, по которой я хотел бы этого, состоит в том, что я мог экспериментировать с гибридными изображениями (у меня есть замечательная идея, что вместо того, чтобы фильтровать изображения отдельно и затем усреднять их, я мог бы просто сделать средневзвешенное значение на основе частоты).
Примечание. Также, как только вы это сделаете, как вы будете интерпретировать это как изображение.
Примечание. На самом деле я не уверен, как точно применить обработку изображений. Я видел уравнения и знаю, как их можно оценить, и знаю "значение" для 1D и грубую идею для 2D. Я также знаю, как можно как-то использовать его, чтобы как-то отфильтровать высокие или низкие "частоты" изображения. Я просто не уверен точно, как сложные частотные изображения генерируются с использованием dft.
1 ответ
Вы можете преобразовать 2D-изображение (матрицу) также с помощью 1D-преобразования.
сначала преобразовать ваше изображение в матрицу
- БПФ нужен сложный домен
- поэтому для черно-белого изображения установите мнимую часть равной 0, а действительную часть - интенсивность пикселей
- если у вас есть цветное изображение, то обрабатывайте каждую цветную полосу как отдельное изображение
применить 2D-преобразование (DFT,DCT,...)
- Вот пример 2D DCT с помощью 1D DFT-преобразования в C++
- в нижней части этого ответа приведены подробности этого
- вы просто конвертируете все строки матрицы
- а затем все столбцы
- +/- некоторая нормализация константы масштабирования
теперь делай свои вещи в частотной области
преобразовать обратно во временную область
- почти так же, как пуля 2.
- просто используйте обратные преобразования и масштабную константу обратной нормализации
преобразовать матрицу обратно в изображение
[Заметки]
- БПФ имеет сложный выход
- так что вам нужно извлечь цвет из него, например, как
intensity = sqrt (re*re+im*im);
- Я использую DCT для спектрального анализа, это более интуитивно