All*_*din 2 matlab fft image-processing dft
我试图在不使用matlab内置函数(如fft())的情况下实现一维DFT.这是我的代码
function [Xk] = dft1(xn)
N=length(xn);
n = 0:1:N-1; % row vector for n
k = 0:1:N-1; % row vecor for k
WN = exp(-1j*2*pi/N); % Twiddle factor (w)
nk = n'*k; % creates a N by N matrix of nk values
WNnk = WN .^ nk; % DFT matrix
Xk = (WNnk*xn );
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令后运行代码时:
I = imread('sample.jpg')
R = dft1(I)
Run Code Online (Sandbox Code Playgroud)
我得到这个特殊的错误: 整数类不完全支持使用*MTIMES的错误.至少一个输入必须是标量.要计算元素TIMES,请改用TIMES(.*).
有人可以帮我弄清楚如何解决这个问题
注意:我还在学习Matlab的最初阶段非常感谢你
你只需要投中的数据double,然后再运行代码.基本上错误是说你在两个变量之间应用矩阵乘法时试图将数据类混合在一起.具体来说,您定义的数值向量和矩阵dft1都是一种double类型,但是uint8当您通过它读取时,您的图像可能是类型imread.这就是为什么你得到整数错误的原因,因为它uint8是一个整数类,你试图用这种数据类型和double数据类型的数据类型执行矩阵乘法.请记住,只要一个数字是单个数字/标量,就可以混合数据类型.这也是错误所暗示的.MATLAB不支持非浮点(double,single)变量的矩阵乘法,因此在应用算法之前,需要确保图像数据和DFT矩阵是相同的类型.
因此,只需:
I = imread('sample.jpg');
R = dft1(double(I));
Run Code Online (Sandbox Code Playgroud)
这段代码非常巧妙,它(默认情况下)将1D DFT应用于图像的所有列.输出将是一个大小相同的矩阵,I其中每列是每列的1D DFT结果I.
这是需要考虑的事情,但是如果你想将它应用于图像的所有行,你只需I在它进入之前进行转置,dft1这样行就会成为列,你可以对这些新的"列"进行操作.一旦完成,您只需将结果转换回来,这样您就可以从输出中获得输出结果,以便dft1每行应用结果.因此:
I = imread('sample.jpg');
R = dft1(double(I.')).';
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!祝好运!