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

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

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

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


person PyRulez    schedule 10.10.2014    source источник
comment
что ты уже испробовал? Почему не сработало? В какой момент вы не могли комбинировать ваши Repa Arrays от repa-devil с fft2d repa-fftw?   -  person Cirdec    schedule 11.10.2014
comment
Если у вас есть изображение в оттенках серого (Array F DIM2 Word8), преобразуйте Word8 в сложный и используйте fft2d напрямую - это должно быть очевидно. Если у вас есть цветное изображение, обычная процедура заключается в выполнении БПФ индивидуально для каждого цветового канала. Вам нужно преобразовать Array F DIM3 Word8 в Array F DIM2 Word8, для этого взгляните на Data.Array.Repa.Slice, а именно на функцию slice.   -  person user2407038    schedule 11.10.2014
comment
@ user2407038 Значит, они просто интерпретируются как комплексные числа с мнимой частью 0? Нравится (:+ 0) . fromIntegral :: Word8 -> Complex Float?   -  person PyRulez    schedule 11.10.2014


Ответы (1)


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

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

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

    • here is an example 2D DCT by 1D DFT transform in C++
    • внизу этого ответа приведены подробности этого
    • вы просто конвертируете все строки матрицы
    • а затем все столбцы
    • +/- некоторое масштабирование константы нормализации
  3. теперь занимайтесь своими делами в частотной области

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

    • almost the same as bullet 2.
    • просто используйте обратные преобразования и константу масштабирования обратной нормализации
  5. преобразовать матрицу обратно в изображение

[Примечания]

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