【问题标题】:JTransforms FFT on ImageJ对图像进行 FFT 变换
【发布时间】:2016-10-28 18:16:31
【问题描述】:

我有一个图像,我想使用 FFT 将其转换为频域,Java 似乎缺少此库,但我找到了两个。一个是 JTransforms,另一个是鲜为人知的,没有名字。

对于不太知名的,2D 只能有 2 的幂的长度值,但可以使用简单的方法,如 FastFourierTransform.fastFT(real, imaginary, true);,实部是包含每个像素值的双精度的 2D 数组,虚部是相同大小的二维数组,充满零。布尔值将取决于正向或反向变换。这对我来说很有意义,除了两个要求的力量破坏了我所做的任何变换(我最初在图像周围添加了黑色空间以使其适合最接近的两个幂)之外,它起作用了,我正在努力解决如何使用 JTransforms 的等效方法,并希望得到任何指导。我会说明我目前在做什么。

我相信相关的类会是DoubleFFT_2D,它的构造函数需要一些行和列,我认为它们是我图像的宽度和高度。因为我的图像没有虚部,我想我可以使用doubleFFT.realForwardFull(real);,它将虚部视为零并传递充满像素的真实二维数组。不幸的是,这根本不起作用。 JavaDoc 声明 the input array must be of size rows*2*columns, with only the first rows*columns elements filled with real data 但我不明白这与我的形象有何关系,以及我必须做什么才能满足这一要求。

对于冗长而糟糕的解释感到抱歉,如果需要任何其他信息,我很乐意提供。

JTransforms 库和文档可以在这里找到:https://sites.google.com/site/piotrwendykier/software/jtransforms

【问题讨论】:

    标签: java image-processing fft


    【解决方案1】:

    太糟糕了,除了压缩的download 之外,JTransforms 的文档无法在线获得。它非常完整且有用,您应该检查一下!

    回答您的问题:DoubleFFT_2D.realForwardFull(double[][] a) 采用实数数组(您的像素)。然而,FFT 的结果将有每个输入值的两个输出值 - 每个频率仓的实部和虚部。这就是为什么您的输入数组需要是实际图像数组的两倍大,其中一半是空的/用零填充。

    请注意,所有 FFT 函数都使用a 不仅用于输入,还用于输出 - 这意味着其中的任何图像数据都将丢失,因此可能需要复制到不同/更大的数组!

    对于您的方案,简单而明显的解决方法是改用DoubleFFT_2D.realForward(double[][] a)。这个只会计算正谱,因为负侧将与其对称。这是因为您的输入值是真实的。

    另外,请查看 JTransforms 中的 RealFFTUtils_2D 类,这将使您之后从数组中检索结果变得更加容易:)

    【讨论】:

    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2011-11-30
    相关资源
    最近更新 更多