||
在图像处理相关运算中,傅立叶变换很重要。于是:
1. fft2作用:计算二维快速傅立叶变换。
B=fft(I) %返回图像I的二维fft变换矩阵。输入图像I与输出B大小相同
fft所得的频域数据
2. fftshift与ifftshiftfftshift作用:将变换后的图象频谱中心从矩阵的原点移到矩阵的中心。
B1=fftshift(B) %将B的一、三象限和二、四象限进行互换。
如:>> x=[1 2 3 4 5]
x =
1 2 3 4 5
>>y=fftshift(x)
y =
4 5 1 2 3
>>y1=ifftshift(y)
y1 =
1 2 3 4 5
3. ifft2作用:计算图像的二维傅里叶反变换
B2=ifft(B1) %
4. 例1%初识fft,fftshift
clear all;close all
clc
%%初始参数
fs=100; %采样频率
N=256; %数据点数
n=0:N-1;
t=n/fs; %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
y1=fft(x,N);
y2=fftshift(y1);
mag1=abs(y1);%傅氏变换后的振幅
mag2=abs(y2);
f1=n*fs/N; %频率序列
f2=f1-fs/2;
%%绘图
subplot(3,1,1),plot(f1,mag1,'r')%频率-振幅变化图
xlabel('频率/Hz');ylabel('振幅');title('图1:usual','color','r');grid on
subplot(3,1,2),plot(f2,mag1,'b')%频率-振幅变化图
xlabel('频率/Hz');ylabel('振幅');title('图1:without fftshift','color','b');
grid on
subplot(3,1,3),plot(f2,mag2,'c')%频率-振幅变化图
xlabel('频率/Hz');ylabel('振幅');title('图1:hit','color','c');
grid on
TheGerchberg-Saxton (GS) algorithm
%初识GS算法
%DigitalHolography M.Isabel Ruiz López
clear all;closeall
clc
%Step1:选择图像
J=imread('C:UsersbwzongDesktopPrettybeauty051.jpg');
J1=rgb2gray(J);
J2=double(J1);
[M,N]=size(J2)
J3=J(50:M/2,50:N/2);
%imshow(J3,[])
%Step2:Randomphase
ph=2*pi*(rand(M,N));
JJ=J2.*(i*ph);
%Step3: Addrandom phase and amplitud
ft=fftshift(fft(JJ));
JJJ=exp(i*(angle(ft)));
imshow(JJJ,[])
B = imresize(A,m);
返回的图像B的长宽是图像A的长宽的m倍,即缩放图像。 m大于1,则放大图像; m小于1,缩小图像。
B = imresize(A,[numrows numcols]);
numrows和numcols分别指定目标图像的高度和宽度。显而易见,由于这种格式允许图像缩放后长宽比例和源图像长宽比例不相同,因此所产生的图像有可能发生畸变。
(2)double;im2double;mat2gray****************假设某图像数据A(uint8格式)**********************
A =
235 200 89 20
>>double(A) %返回与原矩阵数值相同但类型为double的矩阵
ans =
235 200 89 20
>>im2double(A)
%返回矩阵类型:double;数值范围[0 1] ,0对应uint8中的0;1对应uint8中的255;
ans =
0.9216 0.7843 0.3490 0.0784
>>mat2gray(A) %对原矩阵归一化
ans =
1.0000 0.8372 0.3209 0
*****假设矩阵A为一般二维数组,非图像数据(double格式)*****************
A =
235 200 89 20
>>double(A)
ans =
235 200 89 20
>>im2double(A)
ans =
235 200 89 20
>>mat2gray(A)
ans =
1.0000 0.8372 0.3209 0
**********************小结***************************
im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;如果输入类型是double,输出没有处理;
double:返回数值与输入相同的double类型矩阵;
mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。
在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据
(3)GS算法%GS算法
%图像经过多次傅里叶变换,最后提取图像的相位信息,加载SLM,观察图像
clear all;clc
%close all
A=imread('图1.jpg');
B=imresize(A,[7681024]);
C=im2double(rgb2gray(B));
C1=abs(C);
for p=1:100;
C=fftshift(C);
D=ifft2(C);
D=fftshift(D);
D2=angle(D);
D=exp(i.*D2); %给D振幅赋值1,相位不变
D=fftshift(D);
C=fft2(D); %D傅里叶变换回到C
C=fftshift(C);
C2=angle(C);
C=C1.*exp(i.*C2); %C振幅不变,仍然赋值初始振幅C1
p=p+1;
end
C=fftshift(C);
D=ifft2(C);
D=fftshift(D);
D=angle(D);
imwrite(D,'zzy.jpg','jpg');
figure,imshow(D,[])
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 18:57
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社