如何使用haskell对图像进行傅里叶变换

如何使用haskell对图像进行傅里叶变换,haskell,image-processing,fft,fftw,repa,Haskell,Image Processing,Fft,Fftw,Repa,如何使用haskell对图像进行离散傅里叶变换。我相信这两个库可能会有所帮助,但我不知道如何将它们整合起来。我之所以想这样做,是因为我可以用混合图像进行实验(我有一个奇妙的想法,那就是不必单独过滤图像,然后对它们进行平均,我可以简单地根据频率进行加权平均。) 注:同样,一旦你做到了这一点,你会如何重新解释它作为一个形象 注:我不确定如何将dft应用于图像处理。我看过这些方程式,知道如何计算它们,知道1D的“意义”和2D的大致概念。我也知道如何用它过滤掉图像的高或低“频率”。我只是不确定使用dft

如何使用haskell对图像进行离散傅里叶变换。我相信这两个库可能会有所帮助,但我不知道如何将它们整合起来。我之所以想这样做,是因为我可以用混合图像进行实验(我有一个奇妙的想法,那就是不必单独过滤图像,然后对它们进行平均,我可以简单地根据频率进行加权平均。)

注:同样,一旦你做到了这一点,你会如何重新解释它作为一个形象


注:我不确定如何将dft应用于图像处理。我看过这些方程式,知道如何计算它们,知道1D的“意义”和2D的大致概念。我也知道如何用它过滤掉图像的高或低“频率”。我只是不确定使用dft生成的频率图像到底有多复杂。

您也可以通过1D变换变换2D图像(矩阵)

  • 首先将图像转换为矩阵

    • FFT需要复域
    • 所以对于BW图像,将虚部设置为0,将实部设置为像素强度
    • 如果有彩色图像,则将每个色带作为单独的图像处理
  • 应用二维变换(DFT、DCT等)

    • 下面是一个C语言的例子++
    • 答案的底部是这方面的细节
    • 您只需转换矩阵的所有行
    • 然后是所有列
    • +/-一些归一化常数标度
  • 现在在频域上做你的工作

  • 转换回时域

    • 几乎和子弹2一样
    • 只需使用逆变换和逆归一化缩放常数
  • 将矩阵转换回图像

  • [附注]

    • FFT具有复数输出
    • 因此,您需要从中提取颜色,例如,
      intensity=sqrt(re*re+im*im)
    • 我使用DCT进行频谱分析,它更直观

    到目前为止您尝试了什么?为什么不起作用?在哪一点上,你不能将你的Repa
    数组
    s从Repa devil与Repa fftw的
    fft2d
    ?如果你有一个灰度图像(
    Array F DIM2 Word8
    ),将单词8转换为复数,并直接使用
    fft2d
    ),这一点应该是显而易见的。如果您有彩色图像,通常的程序是对每个彩色通道分别执行FFT。您需要将
    数组F DIM3 Word8
    转换为
    数组F DIM2 Word8
    ,为此,请查看
    Data.Array.Repa.Slice
    ,即
    Slice
    函数。@user2407038所以它们被解释为虚数部分为0的复数?比如
    (:+0)。fromIntegral::Word8->复数浮点