0
点赞
收藏
分享

微信扫一扫

MATLAB绘制前21个Zernike多项式,按照径向级次$n$垂直排序,角向级次$m$水平排序

目录

  • 结果
  • 代码
  • 通俗解释部分光学名词
  • 参考和拓展阅读

结果


MATLAB绘制前21个Zernike多项式,按照径向级次$n$垂直排序,角向级次$m$水平排序_点光源

代码

clear all;close all;clc;
% Define the range for n and m
n_values = 0:5;
pixels=100;%image x,y pixels

%%The transverse and longitudinal dimensions of the pupil surface
% can enhance the Fourier transform results by reducing the proportion of pupil area
q=300;   



% Initialize a figure
fig=figure('name','ZernikePolynomials');
figWidth = 620; % Set the figure width
figHeight = 620; % Set the figure height
set(fig, 'Position', [200, 200, figWidth, figHeight]);


%% Creating mask for unit circle
X = linspace(-1, 1, pixels);
[X, Y] = meshgrid(X, X);
circleMask = (X.^2 + Y.^2) <= 1;


% Loop over n values
for i = 1:length(n_values)
    n = n_values(i);

    % Loop over m values, incrementing by 2
    for m = -n:2:n
        % Calculate index for the subplot
        subplot_index = (i-1)*(n+1) + (m+n)/2 + 1;

        % Calculate radial polynomial
        [RmnC,rhoExp] = calcRmn(abs(m),n);
        % Calculate zernike polynomial as raster scan
        myData = zeros(pixels);
        myData = calcZP(RmnC,rhoExp,m,n,pixels);

        % Apply mask to myData
        myData(~circleMask) = NaN;

        
        % Create subplot
        margin=0.04; % Adjust this to control the spacing between subplots
        subplot_tight(length(n_values), n+1, subplot_index, margin);
        imagesc(myData);
        axis square;
        colormap("jet");
        title(['$m=' num2str(m) ', n=' num2str(n) ', Z_{' num2str(subplot_index-(1+n)*n/2 ) '}$'], 'Interpreter', 'latex');

        % Remove x and y labels
        set(gca,'xtick',[],'ytick',[]);
    end
end


%%
function [PC,PExp]=calcRmn (m,n)
%CALCRMN calculate the radial polynomial
%Inputs Zernike polynomial values m,n
%Returns the coefficients for polynomial exponents
%Parameters
OET=(n-m);%check if odd or even
mC=OET/2;%number of coefficients calculated
%Initialize
RmnC= zeros(1,mC);
rhoExp=zeros(1,mC);
%Calculation of radial polynomial
if mod(OET,2)==0
    %do if test is even;otherwise dont
    k=0;Rmn=0;
    while k<=mC
        Rmn=(-1)^k*factorial(n-k)/(factorial(k)*factorial((n+m)/2-k)*factorial((n-m)/2-k));
        k=k+1;
        PC(k)=Rmn;%Polynomial coefficients
        PExp(k)=(n-2*(k-1));%Polynomial exponents
    end
end
end%End function

function mD =calcZP(RmnC,rhoExp,m,n,pX)
%CALCZP calculate the zernike polynomial shape
%Inputs radial polynomial,plus m,n,pixels
%Returns the Zernike polynomial data set
%Calculate Zernike polynomial shape


mD=zeros(pX);
for r=1:pX
    for c=1:pX
        x=(2*c-pX-1)/pX;%convert to x,y
        y=(2*r-pX-1)/pX;%convert to x,y
        %Calculate quadrant correct angle
        phi=atan2(y,x);
        %Convert rectangular coord to distance
        rho=sqrt(x^2+y^2);
        RMN =0;
        for count =1:(n-abs(m))/2+1
            RMN =RMN+RmnC(count)*rho.^rhoExp(count);
        end
        %Calculate ZP wavefront
        if m<0 || n==0   %select for+/-m
            Z=-RMN*sin(abs(m)*phi);
        else
            Z=RMN*cos(abs(m)*phi);
        end
        %Control visual appearance
        if rho<=1%zero outside unit circle
            mD(r,c)=Z;%load value
        else
            mD(r,c)=0;%change to Nan to hide
        end
    end
end
end%End Function

通俗解释部分光学名词

Pupil: 光瞳(pupil)是一个黑色开口,光通过它进入光瞳。你可以把它看作是相机中的光圈,控制着多少光线可以进入镜头。当光线充足时,光瞳会收缩,减少光线进入;当光线不足时,光瞳会扩大,让更多光线进来。

光阑光瞳都是光学系统中的重要概念。虽然它们有时被用来指代类似的概念,但在严格的技术语义上,它们有明显的区别:

  • 光阑 (Aperture):光阑是光学系统中用于限制光束通过的开口或孔洞。这可以是一个物理的元件,如相机镜头的光圈,或者是光学系统内部结构产生的虚拟开口。光阑的大小和形状会影响到通过系统的光量和光束的形状。
  • 光瞳 (Pupil):光瞳是指从光学系统的前或后看到的光阑的像。换句话说,光瞳就是观察者实际看到的光阑。例如,在相机镜头中,当你直接看向镜头时看到的那个黑色圆圈就是光瞳。光瞳的大小决定了通过镜头的光束量。

简单来说,光阑就像是光学系统的“门”,控制着光的进入,而光瞳就是我们实际看到的那个“门”。

这两者的区别在于,光阑是物理存在的,而光瞳可能是虚拟的,取决于观察者的观察位置。例如,当你远离一个窗户看时,窗户看起来很小;当你靠近窗户看时,窗户看起来很大。但无论你在哪里看,窗户的实际大小(即光阑)并没有改变,改变的只是你看到的窗户的大小(即光瞳)。

Point Spread Function (PSF): 点扩散函数是一种描述光学系统如何响应一个点光源的函数。简单来说,当一个点光源通过一个光学系统(如望远镜、显微镜、相机等)时,由于各种因素(如透镜的不完美,光的散射和衍射等),这个点光源在成像平面上会被“模糊”或“扩散”成一个光斑,而非一个完美的点。点扩散函数就是描述这个“扩散”或“模糊”程度的函数。

Modulation Transfer Function (MTF): 调制传递函数是用于描述光学系统对于空间频率(也就是图像的细节)的响应的度量。简单来说,它告诉我们系统在不同级别的细节上的性能如何。比如,一个高质量的相机或望远镜在高空间频率(即细节丰富)的图像上可能有很好的性能,能够清晰地显示出图像的细节,这就意味着它的MTF高。反之,如果一个系统的MTF低,那么它在细节丰富的图像上的性能可能就较差。

Wavefront: 在物理学中,波前(wavefront)是指同一波动(如光波、声波、电磁波等)中相位相同的点构成的面。想象你在水面上扔一块石头,石头落水产生的涟漪就形成了一个个同心圆,这些同心圆就类似于波前,它们表示的是水波在同一时间到达的位置。在光学中,光的波前通常被描述为光的传播方向垂直的平面。如果光源是一个点光源,那么波前就像是一个个膨胀的球壳;如果光源是无限远的平行光(比如太阳光),那么波前就是平面。

Phase Screen:"相位屏"(Phase Screen)模型是大气和其他介质中的光学传播研究中的一个重要工具。这种模型主要用于描述光波通过含有随机不均匀性的介质时产生的相位延迟。对于大气光学,这种不均匀性通常是由于大气中随机的折射率波动,这种波动是由温度和压力的小范围变化引起的。

在这种模型中,介质被看作是一系列的二维“屏幕”,每个屏幕都会引入一定的相位变化。这些屏幕通常被假设为平均折射率是恒定的,但是折射率的微小变化会导致经过的光波的相位在空间上产生随机的变化。这就像光通过一系列微妙的镜子,每个镜子都会以不同的方式稍微扭曲光的波前。

相位屏模型的一个关键参数是所谓的结构常数(通常用Cn^2表示),它描述了折射率波动的强度。这个参数决定了通过相位屏后的光波的统计特性,包括其相位结构函数和功率谱。

实际上,相位屏模型是一个简化的模型,它忽略了多屏幕之间的相互作用,以及光的散射和吸收等效应。然而,尽管这些限制,相位屏模型在对大气光学效应的理解和预测中仍然非常有用。

参考和拓展阅读

subplot_tight下载Zernike Polynomial 泽尼克像差多项式 相关资料 - 悦椿一的文章 - 知乎

MathematicaStackExchange - How to plot heatmap function over the unit circle

Wolfram Demonstration - Zernike Polynomials and Optical Aberration

Wolfram Demonstration - Zernike Coefficients for Concentric, Circular, Scaled Pupils

Wolfram Demonstration - Plots of Zernike Polynomials



举报

相关推荐

0 条评论