在Matlab 2D DFT fft2()函数中读取点的方向和频率
我越来越熟悉Matlab和函数fft2。在这个玩具示例中,我的目标是生成以下256 x 256 png图像的2D DFT: 为了能够轻松理解输出,我尝试将此图像转换为256 x 256图像,以消除颜色信息:在Matlab 2D DFT fft2()函数中读取点的方向和频率,matlab,fft,octave,dft,Matlab,Fft,Octave,Dft,我越来越熟悉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的矩阵,可以从中计算振幅和相
Im = imread('circ.png');
pkg load image
Im = rgb2gray(Im);
figure, imshow(Im)
在这段簿记准备工作之后,我运行:
A = fft2(double(Im));
A是一个256 x 256的矩阵,可以从中计算振幅和相位
问题是如何提取方向θ和频率,例如像素/周期
SLEUTHEYE回答后比较MATLAB和IMAGEJ输出的示例:
使用ImageJ:
使用Matlab:
输出:
ans = -1.2553 + 10.1425i
direction = 0.28379
dir_degrees = 16.260
frequency = 10.240
我假设这是一个后续的描述,你使用它可以直接读取方向和频率参数 假设您有一个特定的像素Ai,j,那么可以使用以下方法获得方向和频率,以像素/周期为单位,类似于通过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);
极好的非常感谢你的帮助。为了清楚起见,方向以弧度为单位,在运行代码之前需要手动输入i和j,例如,i=2和j=3以检索A点[2,3]处的方向和频率,对吗?我尝试在一个示例上运行代码,输出与ImageJ不同。我打赌我做错了什么,但我想知道你是否介意看一看我用两种软件平台的输出和代码编辑了OP。事实上,这是我的错。看起来我在dy计算中以1领先。@Toni这仍然是个问题吗?一点也不。。。只是避开志愿者的短信。。。它工作得很好。泰!你编辑的公式中的-i-1是从哪里来的?@Suever我认为这是一个误解,因为我使用的是同一个例子:这是一个不同的问题,我得到了一个完美的答案,是同一个人对我之前的问题给出的完美答案,你将其链接为相同。我再发一次同样的问题没有任何意义。这有什么不同?在我看来是一样的。你试图得到某个特定位置的大小和角度point@Suever据我所知,有4个值描述2D DFT:前一个问题的幅值和相位对象;方向θ角和频率有时被描述为矢量。这最后两个值是当前问题的目标。是的,但是你自己在上一个问题中确实计算了方向和频率。@Suever请检查侦探的答案,你会发现它们是不同的。
ans = -1.2553 + 10.1425i
direction = 0.28379
dir_degrees = 16.260
frequency = 10.240
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);