Matlab 2D DFT fft2()函数中读出一个点的方向和频率
Reading out the direction and frequency of a point in the Matlab 2D DFT fft2() function
我正在熟悉 Matlab 和函数 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));
A
是一个 256 x 256 矩阵,可以从中计算幅度和相位。
问题是如何提取方向(theta)和频率(如pixels/cycle)?
在 SLEUTHEYE 的回答后比较 MATLAB 和 IMAGEJ 输出的示例:
与 ImageJ:
Frequency = 10.24 pixels/cycle (25 cycles)
Theta (direction) = 16.26 degrees
Real part = -1.255
Imaginary part = 10.142
Phase = arctan(10.142 / -1.255) = -82.95 degrees
Magnitude = sqrt(10.142^2 + 1.255^2) = 10.2194
和与 Matlab:
Im = imread('circ.png');
pkg load image
Im = rgb2gray(Im);
A = fft2(double(Im) / 255);
Ashifted = fftshift(A);
Ashifted(121,153)
i = 121;
j = 153;
center = size(A) / 2 + 1;
dx = (j - center(2)) / size(A,2);
dy = (center(1) - i - 1) / size(A,1);
direction = (atan2(dy, dx))
dir_degrees = direction * (360 / (2*pi))
frequency = 1 /sqrt(dx*dx + dy*dy)
输出:
ans = -1.2553 + 10.1425i
direction = 0.28379
dir_degrees = 16.260
frequency = 10.240
我假设这是 which describe your use of ImageJ 的后续,它提供方向和频率参数的直接读数。
假设您有一个特定的像素 A(i,j)
,那么可以使用以下方法获得 pixels/cycle 中的方向和频率(与 ImageJ 类似地获得):
center = size(A)/2 + 1;
dx = (j-center(2))/size(A,2);
dy = (center(1)-i-1)/size(A,1);
direction = atan2(dy, dx); % in radians
frequency = 1/sqrt(dx*dx + dy*dy);
我正在熟悉 Matlab 和函数 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));
A
是一个 256 x 256 矩阵,可以从中计算幅度和相位。
问题是如何提取方向(theta)和频率(如pixels/cycle)?
在 SLEUTHEYE 的回答后比较 MATLAB 和 IMAGEJ 输出的示例:
与 ImageJ:
Frequency = 10.24 pixels/cycle (25 cycles)
Theta (direction) = 16.26 degrees
Real part = -1.255
Imaginary part = 10.142
Phase = arctan(10.142 / -1.255) = -82.95 degrees
Magnitude = sqrt(10.142^2 + 1.255^2) = 10.2194
和与 Matlab:
Im = imread('circ.png');
pkg load image
Im = rgb2gray(Im);
A = fft2(double(Im) / 255);
Ashifted = fftshift(A);
Ashifted(121,153)
i = 121;
j = 153;
center = size(A) / 2 + 1;
dx = (j - center(2)) / size(A,2);
dy = (center(1) - i - 1) / size(A,1);
direction = (atan2(dy, dx))
dir_degrees = direction * (360 / (2*pi))
frequency = 1 /sqrt(dx*dx + dy*dy)
输出:
ans = -1.2553 + 10.1425i
direction = 0.28379
dir_degrees = 16.260
frequency = 10.240
我假设这是
假设您有一个特定的像素 A(i,j)
,那么可以使用以下方法获得 pixels/cycle 中的方向和频率(与 ImageJ 类似地获得):
center = size(A)/2 + 1;
dx = (j-center(2))/size(A,2);
dy = (center(1)-i-1)/size(A,1);
direction = atan2(dy, dx); % in radians
frequency = 1/sqrt(dx*dx + dy*dy);