【问题标题】:How to do a Fourier Transform of an image using haskell如何使用haskell对图像进行傅里叶变换
【发布时间】:2014-10-10 23:48:28
【问题描述】:

如何使用 haskell 对图像进行离散傅立叶变换。我相信repa-devilrepa-fftw 这两个库可能会有所帮助,但我不知道如何整合它们。我之所以喜欢这个,是因为我可以尝试混合图像(我有一个绝妙的想法,即我可以简单地根据频率进行加权平均,而不是单独过滤图像然后对其进行平均。)

注意:一旦完成此操作,如何将其重新解释为图像。

注意:我实际上不确定如何准确地应用 dft 图像处理。我已经看过方程式并且知道如何评估它们,并且知道一维的“含义”和二维的粗略想法。我也知道如何使用它以某种方式过滤掉图像的高或低“频率”。我只是不确定使用 dft 生成的复杂频率图像到底有多复杂。

【问题讨论】:

  • 到目前为止你尝试过什么?为什么它不起作用?什么时候你不能将你的 Repa Arrays 来自 repa-devil 与 repa-fftw 的 fft2d 结合起来?
  • 如果您有灰度图像 (​​Array F DIM2 Word8),请将 Word8 转换为 Complex 并直接使用 fft2d - 这应该很明显。如果您有彩色图像,通常的程序是分别对每个颜色通道执行 FFT。您需要将Array F DIM3 Word8 转换为Array F DIM2 Word8,为此,请查看Data.Array.Repa.Slice,即slice 函数。
  • @user2407038 所以它们只是被解释为虚部为 0 的复数?喜欢(:+ 0) . fromIntegral :: Word8 -> Complex Float

标签: haskell image-processing fft fftw repa


【解决方案1】:

你也可以通过一维变换来变换你的二维图像(矩阵)

  1. 首先将图像转换为矩阵

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

    • 这是 C++ 中的 2D DCT by 1D DFT transform 示例
    • 该答案的底部是此问题的详细信息
    • 你只需转换矩阵的所有行
    • 然后是所有列
    • +/- 一些标准化常数缩放
  3. 现在在频域上做你的事情

  4. 转换回时域

    • 几乎与第 2 条相同。
    • 只需使用逆变换和逆归一化缩放常数
  5. 将矩阵转换回图像

[备注]

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

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多