Как сделать преобразование Фурье изображения с использованием haskell

Как сделать дискретное преобразование Фурье изображения с использованием haskell. Я полагаю, что две библиотеки repa-devil и repa-fftw могут быть полезны, но я не знаю, как их объединить. Причина, по которой я хотел бы этого, состоит в том, что я мог экспериментировать с гибридными изображениями (у меня есть замечательная идея, что вместо того, чтобы фильтровать изображения отдельно и затем усреднять их, я мог бы просто сделать средневзвешенное значение на основе частоты).

Примечание. Также, как только вы это сделаете, как вы будете интерпретировать это как изображение.

Примечание. На самом деле я не уверен, как точно применить обработку изображений. Я видел уравнения и знаю, как их можно оценить, и знаю "значение" для 1D и грубую идею для 2D. Я также знаю, как можно как-то использовать его, чтобы как-то отфильтровать высокие или низкие "частоты" изображения. Я просто не уверен точно, как сложные частотные изображения генерируются с использованием dft.

1 ответ

Вы можете преобразовать 2D-изображение (матрицу) также с помощью 1D-преобразования.

  1. сначала преобразовать ваше изображение в матрицу

    • БПФ нужен сложный домен
    • поэтому для черно-белого изображения установите мнимую часть равной 0, а действительную часть - интенсивность пикселей
    • если у вас есть цветное изображение, то обрабатывайте каждую цветную полосу как отдельное изображение
  2. применить 2D-преобразование (DFT,DCT,...)

    • Вот пример 2D DCT с помощью 1D DFT-преобразования в C++
    • в нижней части этого ответа приведены подробности этого
    • вы просто конвертируете все строки матрицы
    • а затем все столбцы
    • +/- некоторая нормализация константы масштабирования
  3. теперь делай свои вещи в частотной области

  4. преобразовать обратно во временную область

    • почти так же, как пуля 2.
    • просто используйте обратные преобразования и масштабную константу обратной нормализации
  5. преобразовать матрицу обратно в изображение

[Заметки]

  • БПФ имеет сложный выход
  • так что вам нужно извлечь цвет из него, например, как intensity = sqrt (re*re+im*im);
  • Я использую DCT для спектрального анализа, это более интуитивно
Другие вопросы по тегам