Matlab数字图像处理,要求详细解释代码,每个函数都要解释.这个是对图像求幅值谱和相位谱,并对其进行重构.

>> I=imread('辣椒bmp.bmp');
>> figure(1)
>> imshow(real(I));
>> I=I(:,:,3);
??? Index exceeds matrix dimensions.

>> fftI=fft2(I);
>> sfftI=fftshift(fftI);
>> RRfdp1=real(sfftI);
>> IIfdp1=imag(sfftI);
>> a=sqrt( RRfdp1.^2+IIfdp1.^2);
>> a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
>> figure(2)
>> imshow(real(a));
>> b=angle(fftI);
>> figure(3)
>> imshow(real(b));%
>> theta=30;
>> RR1=a*cos(theta);
>> II1=a*sin(theta);
>> fftI1=RR1+i.*II1;
>> C=ifft2(fftI1)*255;
>> figure(4)
>> imshow(real(C));
>> MM=150;
>> RR2=MM*cos(angle(fftI));
>> II2=MM*sin(angle(fftI));
>> fftI2=RR2+i.*II2;
>> D=ifft2(fftI2);
>> figure(5)
>> imshow(real(D));

我和你说说吧,先说基本函数:
fft2是求傅里叶变换;
fftshift是把变换后的图像转置,让非零值转到中心,好观察。
real就是求实部;
imag就是求虚部;

你知道经过傅里叶变换原来的空间域转到频域上了吧?
频域的概念是有实部有虚部的是吧,那你怎么能在平面上表示出来呢?
就用到了复数里的几个概念:
一个是虚部实部的平方和均值(sqrt( RRfdp1.^2+IIfdp1.^2);)
在一个就是夹角问题(b=angle(fftI);)
这个知识高数都有,我就不用说了吧?

至于a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
我觉得就是一个圆滑函数,比如235.536我想让它变成240.
就是乘以圆滑系数,再乘以225。
max(max(a))是求矩阵a里的最大的那个像素值。

希望你掌握好的学习方法,分析程序如果看不懂的话可以一行行的运行,通过workspace找到分步运行的结果,具体分析。

最后感慨一句:百度知道不是赚钱的地方,分多分少不是衡量知识的标准。我助人为乐我快乐,积分又不能换钱,要那么多干嘛。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-19
>> I=imread('辣椒bmp.bmp'); % 从当前目录读取图像
>> figure(1) % 创建一个视图,取名1
>> imshow(real(I)); % 将图像I只取实部(如果是虚数的话),并显示在视图1中
>> I=I(:,:,3); % 取图像I的蓝色分量,1为红色,2为绿色,3为蓝色。
??? Index exceeds matrix dimensions.

>> fftI=fft2(I); % 获取2维离散傅里叶变化后的图像,保存到fftI
>> sfftI=fftshift(fftI); % 将傅里叶变化的中心移到图像中心,保存到sfftI
>> RRfdp1=real(sfftI); % 取实部
>> IIfdp1=imag(sfftI); % 取虚部
>> a=sqrt( RRfdp1.^2+IIfdp1.^2); % 取模,即实部于虚部的平方和再开方
>> a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225; % 灰度拉升,将变换后的图像拉升到0~255区间
>> figure(2) % 创建一个视图,取名2
>> imshow(real(a)); % 将图像a只取实部(如果是虚数的话),并显示在视图2中
>> b=angle(fftI); % 取虚数fftI的弧度
>> figure(3) % 创建一个视图,取名3
>> imshow(real(b)); % 将图像b只取实部(如果是虚数的话),并显示在视图3中
>> theta=30; % 角度常量
>> RR1=a*cos(theta); % RR1 = a*cos(30),注意,这里可能有错误,30度角没有转到弧度,本意可能是cos(theta/180*pi);
>> II1=a*sin(theta); % II1 = a*sin(30),注意,这里可能有错误,30度角没有转到弧度,本意可能是sin(theta/180*pi);
>> fftI1=RR1+i.*II1; % 得到的实部RR1和虚部II1组合成虚数fftI1
>> C=ifft2(fftI1)*255; % 2维傅里叶反变化后*255保存到C
>> figure(4) % 创建一个视图,取名4
>> imshow(real(C)); % 将图像C只取实部(如果是虚数的话),并显示在视图4中
>> MM=150; % 常量
>> RR2=MM*cos(angle(fftI)); % 常量*cos(虚数fftI的弧度)
>> II2=MM*sin(angle(fftI)); % 常量*sin(虚数fftI的弧度)
>> fftI2=RR2+i.*II2; % 得到新的虚数fftI2
>> D=ifft2(fftI2); % 2维傅里叶反变化
>> figure(5) % 创建一个视图,取名5
>> imshow(real(D)); % 将图像D只取实部(如果是虚数的话),并显示在视图5中本回答被提问者采纳
第2个回答  2011-09-25
Image=imread('原图像');
subplot(2,2,1)
imshow(Image);
title('原图');
Spectrum=fft2(Image);
subplot(2,2,2)
imshow(Spectrum);
title('FFT 变换结果');
subplot(2,2,3)
Spectrum=fftshift(Spectrum);
imshow(Spectrum);
title('零点平移');
subplot(2,2,4)
imshow(log(abs(Spectrum)),[]);
title('系数分布图');
%低通滤波
figure; %建立一张空白图纸
subplot(2,2,1)
imshow(log(abs(Spectrum)),[]);
title('系数分布图');
Filter=zeros(180,240); %滤波数组赋初值,全零;自己根据图像的分辨率来确定,如180*240
r=50; %滤波窗口半径,从中心到半径窗口内滤波数组赋值1
for i=(180/2-r+1):(180/2+r);
for j=(240/2-r+1):(240/2+r);
Filter(i,j)=1;
end;
end;
subplot(2,2,2)
imshow(Filter,[]);
title('滤波窗口');
SpectrumN=Filter.*Spectrum; %频谱与滤波模板卷积
subplot(2,2,3)
imshow(log(abs(SpectrumN)),[]);
title('滤波后频谱');
SpectrumN=ifftshift(SpectrumN);
I2=ifft2(SpectrumN);
subplot(2,2,4)
imshow(abs(I2),[]);
title('反变换图像');

这是我们以前做实验时用的程序,用的傅里叶变换,你稍微改动下应该就行了~
第3个回答  2011-09-25

图像的时域分布具有随机性,而频域分布具有集中性,傅里叶变换后,图像的主要能量集中在直流和低频部分。大概就是这么个理。
第4个回答  2011-09-24
每个函数都要讲清楚?
只有10分?追问

如果满意,我可以再掏20分。其实我有的函数不太懂,譬如real(),fftI,sfft,fftI=fft2(I);
>> sfftI=fftshift(fftI);
>> RRfdp1=real(sfftI);
>> IIfdp1=imag(sfftI);
>> a=sqrt( RRfdp1.^2+IIfdp1.^2);
>> a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
也都不太懂,这个算法也看不懂,晕死了都快。所以才想要一份相当详细的解答。