MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,'method')
Matlab中插值函数汇总和使用说明
说明:x, y为原始数据点,yi为在xi点处的插值结果;x, y为向量,method最邻近插值,’linear’线性插值,‘spine’三次样条插值,‘cubic’立方插值。默认为线性插值。
所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。
%只有光瞳,不含像差时的情况
xw = -1:2/511:1;
yw = -1:2/511:1;%[-1,1]分为511个间隔,即512个像素点
for i = 1:length(xw)
for j = 1:length(yw)
P(i,j) = (sqrt(xw(i)^2 + yw(j)^2) <= 0.5);%光瞳的直径占图像的一半 居中
end
end
imshow(P); title('无像差光瞳')
psf = fftshift(fft2(P));%使得频谱居中
psf = abs(psf) .^ 2;%因为OTF是光强,为幅度的平方
psf = psf ./ sum(psf(:));%能量归一化
x = 1:1:512;
[psfMax, ind] = max(psf(:));%psf换成一列,找到最大值的索引
[i, j] = ind2sub(size(psf), ind);%把这个索引换成二维索引 约为257*257
%计算半高全宽是几个像素
HM = max(max(psf(257,x)))/2;%psf是对称的,找257行/列的最大值(也就是上面的psfMax)
X1 = 1:0.1:512;
Y1 = interp1(x, psf(257,:), X1);%原始数据是psf=f(x),x=1:1:512,但是要
%计算X1=1:0.1:512每隔0.1的值,因此要插值(默认线性插值)
count = 0;
for k = 1:length(X1)
if(Y1(k) >= HM)
count = count +0.1;%因为步长是0.1,所以count也是0.1的增量
end
end
FWHM = count
(C:\Users\Haron\Desktop\Typora Files\P.PNG)
说明:光瞳如图所示,这是无像差下的光瞳。计算出的FWHM也就是衍射极限下的半高宽,而根据衍射理论、傅里叶变换理论、采样等推导,衍射极限的半高宽 = M/D。M为像素大小(M*M),D为光瞳直径。
假设M*M的图像,采样点之间的间隔为dx。其FFT变换后仍为 M×M 大小,频域中间隔设为dw。
(1)根据采样理论,FFT变换频域是空域的分辨率关系为: dw=1dx×M
(2)根据傅里叶光学衍射成像理论,OTF是psf的傅里叶变换,psf是光瞳P在焦面上的弗朗禾费衍射,也即傅里叶变换,公式表达为: H(fx,fy)=FFT(psf)=FFT(FFT(P))=P(−λfxzi,−λfyzi)=P(λfxzi,λfyzi) psf弗朗禾费衍射图样不是标准的傅里叶变换,而是 psf=Uf(u,v)=K∫∫tA(x,y)exp[−j2πλf(xu+yv)] 所以,图中dw就是 uλf=dw 的间隔,也就是直接FFT得到的图像的间隔。真实的psf的间隔不是FFT的间隔,而是FFT的间隔*lamada f。
(3)半高宽 FWHM=λfD 。而要计算是几个像素,则要看半高宽与整个图像分辨率的比例。 FWHMdv=λfDdv
可得FWHM = M/D.
(C:\Users\Haron\Desktop\Typora Files\PP.PNG)
为什么师兄的代码中,直接看图像的截面即可算其半高宽?
因为他用的是点源图像,这样得到的图像就是psf。而用lena作为输入图像,得到的频谱不是对称的,无法去计算半高宽等东西。
同时,评价算法质量的指标有很多,可以自己去看看。
下面是自己做的图,无像差psf和含像差psf仿真,半高宽和截面对比。
无像差半高宽:FWHM1=2.1
有像差半高宽:FWHM2 = 8.3
(C:\Users\Haron\Desktop\Typora Files\psf截面.PNG)
%%半高宽作为评价算法质量的例子
%材料准备:
%1.如上所示的光瞳 衍射极限FWHM=2
%2.加像差(加像差后的psf的FWHM=)
%3.复原图像得到的psf的半高宽
%只有光瞳,不含像差时的情况
xw = -1:2/511:1;
yw = -1:2/511:1;%[-1,1]分为511个间隔,即512个像素点
for i = 1:length(xw)
for j = 1:length(yw)
P(i,j) = (sqrt(xw(i)^2 + yw(j)^2) <= 0.5);%光瞳的直径占图像的一半 居中
end
end
imshow(P); title('无像差光瞳')
psf = fftshift(fft2(P));%使得频谱居中
psf = abs(psf) .^ 2;%因为OTF是光强,为幅度的平方
psf = psf ./ sum(psf(:));%能量归一化
[psfMax, ind] = max(psf(:));%psf换成一列,找到最大值的索引
[i, j] = ind2sub(size(psf), ind);%把这个索引换成二维索引 约为257*257
%计算半高全宽是几个像素
x = 1:1:512;
HM = max(max(psf(257,x)))/2;%psf是对称的,找257行/列的最大值(也就是上面的psfMax)
X1 = 1:0.1:512;
Y1 = interp1(x, psf(257,:), X1);%原始数据是psf=f(x),x=1:1:512,但是要
%计算X1=1:0.1:512每隔0.1的值,因此要插值(默认线性插值)
count = 0;
for k = 1:length(X1)
if(Y1(k) >= HM)
count = count +0.1;%因为步长是0.1,所以count也是0.1的增量
end
end
FWHM = count
%加像差的psf.
a = rand(65,1)/10;
psf2 = psfotf_fun(a,65);
HM2 = max(max(psf2(257,:)))/2;%psf是对称的,找257行/列的最大值(也就是上面的psfMax)
X1 = 1:0.1:512;
Y1 = interp1(x, psf2(257,:), X1);%原始数据是psf=f(x),x=1:1:512,但是要
%计算X1=1:0.1:512每隔0.1的值,因此要插值(默认线性插值)
count2 = 0;
for k = 1:length(X1)
if(Y1(k) >= HM2)
count2 = count2 +0.1;%因为步长是0.1,所以count也是0.1的增量
end
end
FWHM2 = count2
%%画图分析
%无像差时的PSF mesh看不出效果 还是要看截面
figure;plot(x, psf(257,:),'b', x, psf2(257,:),'r');
legend('无像差psf','有像差psf2');
参考文献:罗林, 王黎, 程卫东,等. 天文图像多帧盲反卷积收敛性的增强方法[J]. 物理学报, 2006, 55(12):006708-6714