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

Reading out specific points off the Matlab / Octave fft2() function output

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

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

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

在这个记账准备之后我运行:

A = fft2(double(Im));


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

所以幅度将是 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 中的过程:

这里有一些观察结果可以阐明所使用的缩放比例:

  • ImageJ 的 X 和 Y 位置是从 0 开始的,而 Matlab 的索引是从 1 开始的。
  • 增加ImageJ的X位置对应于增加Matlab中的列索引,增加ImageJ的Y位置对应于增加Matlab中的行索引,因此ImageJ中的(X,Y)坐标对将在索引(Y+1,X+1) 在 Matlab 中。
  • ImageJ 在图像中间显示频率分量为 0 的图像,因此有效地进行了相当于 fftshift(Im)
  • 的测量
  • ImageJ 将 0-255 灰度值缩放为 0.0-1.0 范围内的浮点值(即通过除以 255 缩放所有值)

考虑到这一点,我们有:

>> Ashifted = fftshift(A);
>> Ashifted(97,158)/255
ans =   7.4484 - 10.4582i
>> Ashifted(93,165)/255
ans =  12.1928 -  4.9850i

这与您分别在位置 (X,Y) = (157,96)(X,Y) = (164,92) 处对实部和虚部的图示测量值完全对应。

请注意,根据 FFT 的线性度 属性,您也可以对输入进行除法并得到相同的结果:

A = fft2(double(Im)/255.0);
>> Ashifted = fftshift(A);
>> Ashifted(97,158)
ans =   7.4484 - 10.4582i
>> Ashifted(93,165)
ans =  12.1928 -  4.9850i