很简单。因为进行了傅氏变换以后图像上每点的值都成了复数,取abs(即取模值)后才能显示为图像。但是问题是进行变换再取模值后数字有时会变得非常大,拿常用的数据类型uint8(即8位无符号整型数)为例,所能表示的范围仅为0~255,如果数据超过255,在显示图像时系统自动把数据变成255,所以如果有很多数据都超过255,即使这些数据之间差别也蛮大,傅立叶变换显示的图像只会白茫茫一片(255代表白色),看不出差异来。所以需要对这些数据进行处理,常用的就是取对数(log),将很大的数据变成小一些的数据,落在0~255之间,能够准确地表示在图像上,更直观地发现数据之间的差异,也是进行傅氏变换的意义所在,区分高频分量和低频分量。
图像以im代替
r = im(:, :, 1);
g = im(:, :, 2);
b = im(:, :, 3);
fr = fft2(r); %傅里叶变换
fg = fft2(g);
fb = fft2(b);
or = ifft2(fr); %傅里叶反变换
og = ifft2(fg);
ob = ifft2(fb);
out(:, :, 1) = real(or);
out(:, :, 2) = real(og);
out(:, :, 3) = real(ob);
imshow(out) %out就是反变换回去的图像,如果没出错,显示出来的out应该与im一样
图像的细节对应的是高频部分,轮廓对应的是图像的低频部分,所以要留下轮廓的话应该去掉高频,结果是图像被模糊了。主要就是使用一个频域滤波器滤除高频部分,对应的是图像处理知识中的频域滤波部分,建议搜一些相关资料,冈萨雷斯的《数字图像处理——matlab版》中就有相关知识的详细介绍,包括频域滤波原理和滤波器设计实例代码都很详细。
不需要解析式,你学过数字信号处理的话看看matlab的fft函数就应该会用
fs=10000;%采样频率
N=1000; %采样点数
n=0:N-1;
t=n/fs;
y=sin(2pit)+01sin(4pit)+001sin(8pit);
%给定信号
figure(1);
subplot(211);
plot(t,x);%绘出信号的时域波形
xlabel('时间/t');
ylabel('幅值');
title('信号的时域波形');
grid on;
y=fft(x,N);%进行fft变换
m=abs(y(1:N/2))2/N;%求信号的真实幅值
f=nfs/N; %进行对应的频率转换
subplot(212);
stem(f(1:N/2),m(1:N/2));%绘出频谱图
xlabel('频率/Hz');
ylabel('幅值');
title('信号频谱图');
grid on;
现在用的非常广泛的一种图像压缩方法JPEG(即拓展名为jpg的)都是采用了将图像8X8分块再进行DCT变换的办法
DCT变换 级二维离散余弦变换,是傅里叶变换简化。
对于图像的傅里叶变换 因为图像是二维矩阵,所以有二维离散傅里叶变换和二维连续傅里叶变换
在matlab中也有对应的函数F1=fft2(I);
一般8X8的图像,DCT变换之后变成8X8的频谱图,左上角为直流分量,表示图像较为平滑没有太大变化的部分,其他为交流分量,右下为高频部分,对应图像中灰度数值变化比较快的部分
快断网了,如果还不清楚明天再说
file=get(handlesedit1,'string'); % 得到图像文件名和路径
X=imread(file); % 读入图像
fftI=fft2(X); % 傅立叶转换
sfftI=fftshift(fftI); % 平移
RR=real(sfftI); % 实部
II=imag(sfftI); % 虚部
A=sqrt(RR^2+II^2); % 距离
A=(A-min(min(A)))/(max(max(A))-min(min(A)))255;
axes(handlesaxes2); % 设置图像显示轴
imshow(A); % 显示图像
快速离散二维傅里叶变换
I=imread('Missbmp');
figure(1)
[m,n]=size(I)
for k=1:n
wht(:,k)=hadmard(m)I(:,k)/m;
end %沃尔什变换
以上在matlab实现
以上就是关于对一幅图像傅里叶变换后,显示其频谱图的MATLAB语句全部的内容,包括:对一幅图像傅里叶变换后,显示其频谱图的MATLAB语句、如何将彩色图像用Matlab进行傅里叶变换,再反变换回去、matlab图像处理,对一幅图像做傅里叶变换,去掉细节部分留下轮廓部分,是去掉高频还是低频等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)