从 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
我正在熟悉 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