1. 半高宽的知识

半高全宽FWHM(Full Width at Half Maxima)

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)=KtA(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)

如何用半高宽评价算法质量

  1. 我们有了衍射极限的半高宽。M/D。也可以通过如上述代码计算得到。
  2. 我们的降质图像和复原图像,可以通过计算二者的psf,然后计算其半高宽,看是否达到衍射极限。

为什么师兄的代码中,直接看图像的截面即可算其半高宽?

因为他用的是点源图像,这样得到的图像就是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

猜你喜欢

转载自blog.csdn.net/haronchou/article/details/78204233