从Matlab / Octave fft2()函数输出中读出特定点

时间:2017-04-03 19:26:02

标签: matlab output fft octave

我熟悉Octave和函数fft2()。在这个玩具示例中,我的目标是生成以下256 x 256 png图像的2D DFT:

enter image description here

为了能够轻松理解输出,我尝试将此图像转换为256 x 256图像,消除了颜色信息:

Im = imread('circ.png');
pkg load image
Im = rgb2gray(Im);
figure, imshow(Im)

在这本簿记预备之后我跑了:

A = fft2(double(Im));

enter image description here

行。现在我拍摄相同的图像,并使用ImageJ进行分析,检查点(157, 96)的输出,如下所示:

enter image description here

所以幅度将是sqrt(7.448^2 + 10.458^2) = 12.83

阶段arctan(-10.458 / 7.448) = 54.54 degrees

问题是,如何从fft2()输出中获取这些值?

如果它有所不同,这就是我绘制Octave输出2D DFT的方式:

subplot(132);
h = imshow(abs(fftshift(A)),[24 100000]);
h2 = get(h,'Parent');
set(h2,'YDir','Normal');
axis equal tight;
title("2D FFT Magnitude");

subplot(133);
h = imshow(angle(fftshift(A)),[-pi pi]);
h2 = get(h,'Parent');
set(h2,'YDir','Normal');
axis equal tight;
title("2D FFT Phase");

这是ImageJ中的过程:

enter image description here

1 个答案:

答案 0 :(得分:2)

以下是一些应该澄清使用的缩放的观察结果:

  • ImageJ的X和Y位置是从0开始的,而Matlab的索引是从1开始的。
  • 增加ImageJ的X位置对应于在Matlab中递增列索引,并且递增ImageJ的Y位置对应于在Matlab中递增行索引,以便在索引{{1}处找到ImageJ中的application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool坐标对在Matlab中。
  • ImageJ在图像中间显示0频率分量的图像,因此有效地进行了相当于(X,Y)
  • 的测量
  • ImageJ将0-255灰度值缩放为0.0-1.0范围内的浮点值(即通过除以255来缩放所有值)

因此,考虑到这一点,我们有:

(Y+1,X+1)

分别与位置fftshift(Im)>> Ashifted = fftshift(A); >> Ashifted(97,158)/255 ans = 7.4484 - 10.4582i >> Ashifted(93,165)/255 ans = 12.1928 - 4.9850i 处的实部和虚部的所示测量值完全对应。

请注意,通过FFT的线性属性,您还可以划分输入并获得相同的结果:

(X,Y) = (157,96)