在光学像差分析中,泽尼克系数是非常重要的一种光学像差分析工具。在介绍泽尼克系数之前,我们先简单介绍一下光学像差的概念。

光学像差

光学系统的像差(Aberrations)是指实际成像与理想光学模型(如近轴光学理论)之间的偏差,导致图像模糊、变形或色彩失真。这些偏差源于光线传播的物理限制和光学元件的设计缺陷。像差大致可以分为以下几类:

在这里插入图片描述

光学工程师也会把像差进一步分为高阶像差和低阶像差:

  • 低阶像差:离焦(Defocus)、散光(Astigmatism)、倾斜(Tilt)
  • 高阶像差:彗差(Coma)、球差(Spherical Aberration)、三叶草像差(Trefoil)等。

光学像差的表征

一般光学工程师会利用相位差图来表征光学像差,因为光本身具有波粒二象性,所以光线在光学系统中传播的时候,由于波的性质,光线会有衍射效应,而衍射效应导致光线通过光学系统的时候,会有一个光程差,这个光程差将引入额外的相位差,这个相位差可以反应光学像差。所以光学像差会用波前像差图来表征。不同的像差,其对应的波前相位差图也会不同。

但是,不同的光学系统的波前相位差图可能也有很多,而且可能也很复杂,有没有什么办法对光学像差做一个统一的分析呢。答案是肯定的,其中一种方式就是引入基函数

空间中的向量基

在线性代数里面,我们以前都学习过空间基,比如二维空间的任何一点都可以表示为 (x,y)(x, y)(x,y) 的一个坐标点,这个坐标点本身可以看成是一个二维向量,在笛卡尔坐标系里,这个二维向量可以表示成两个标准基的线性加权:

r=(xy)=x(10)+y(01) r = \binom{x}{y} = x \binom{1}{0} + y \binom{0}{1} r=(yx)=x(01)+y(10)

这里的 (10),(01)\binom{1}{0}, \binom{0}{1}(01),(10) 其实就是二维空间的向量基,有了空间的向量基,那么就可以对这个空间中的任意一个向量进行表示。

光学像差的基–泽尼克多项式

前面我们介绍了空间中的基,就是一组正交且完备的向量基函数,可以实现对该空间中任意一个向量的表征。那么光学像差,或者说波前相位差这样一个空间,是否也存在这样一组基函数,可以实现对任意波前相位差的表征呢,答案是肯定的。我们今天介绍的泽尼克系数就是这样一组基函数。泽尼克多项式(Zernike Polynomials)是一类在单位圆域内正交的多项式,由荷兰物理学家弗里茨・泽尼克(Frits Zernike)于 1934 年提出,最初用于描述光学系统中的像差。

泽尼克多项式的某种表达形式为:

Znm(r,θ)={Rn∣m∣(r)cos⁡(mθ)m≥0Rn∣m∣(r)sin⁡(∣m∣θ)m<0 Z_{n}^{m}(r,\theta)= \begin{cases} R_{n}^{\vert m\vert}(r)\cos(m\theta) & m \geq 0 \\ R_{n}^{\vert m\vert}(r)\sin(\vert m\vert\theta) & m < 0 \end{cases} Znm(r,θ)={Rnm(r)cos(mθ)Rnm(r)sin(mθ)m0m<0

其中,r∈[0,1],θ∈[0,2π]r \in [0, 1], \theta \in [0, 2\pi]r[0,1],θ[0,2π] nnn 表示的径向 rrr 的阶数,mmm 表示的是角向频率 θ\thetaθ 的阶数,n,mn, mn,m 都是整数,并且 ∣m∣≤n|m| \leq nmnn−∣m∣n - |m|nm 为偶数。

径向函数的表达式为:

Rnm(r)=∑k=0(n−∣m∣)2(−1)k(n−k)!k!(n+∣m∣2−k)!(n−∣m∣2−k)!rn−2k R_{n}^{m}(r) = \sum_{k=0}^{\frac{(n - |m|)}{2}} \frac{(-1)^{k} (n - k)!}{k! \left( \frac{n + |m|}{2} - k \right)! \left( \frac{n - |m|}{2} - k \right)!} r^{n - 2k} Rnm(r)=k=02(nm)k!(2n+mk)!(2nmk)!(1)k(nk)!rn2k

泽尼克系数的正交性,在单位圆上满足:

∬r drdθ Zi(r,θ)Zj(r,θ)=πδij \iint r \, dr d\theta \, Z_i(r, \theta) Z_j(r, \theta) = \pi \delta_{ij} rdrdθZi(r,θ)Zj(r,θ)=πδij

有了泽尼克多项式,也就是光学像差的基,就可以用泽尼克多项式对光学像差进行表示,理论上任意的波前像差 W(r,θ)W(r, \theta)W(r,θ) 可以表示为:

W(r,θ)=∑n=0∞∑m=−nncnmZnm(r,θ) W(r,\theta) = \sum_{n=0}^{\infty} \sum_{m=-n}^{n} c_{n}^{m} Z_{n}^{m}(r,\theta) W(r,θ)=n=0m=nncnmZnm(r,θ)

泽尼克项与一般像差的对应关系:

系数 泽尼克项 像差类型 相位分布特征
c00c_0^0c00 Z00Z_0^0Z00 平移(常数项) 全局相位偏移
c1±1c_1^{\pm1}c1±1 Z1±1Z_1^{\pm1}Z1±1 倾斜(Tilt) 线性倾斜(类似棱镜)
c20c_2^0c20 Z20Z_2^0Z20 离焦(Defocus) 旋转对称二次曲面(碗状)
c2±2c_2^{\pm2}c2±2 Z2±2Z_2^{\pm2}Z2±2 像散(Astigmatism) 双曲抛物面(正交方向曲率相反)
c3±1c_3^{\pm1}c3±1 Z3±1Z_3^{\pm1}Z3±1 彗差(Coma) 非对称泪滴状
c40c_4^0c40 Z40Z_4^0Z40 球差(Spherical) 旋转对称四次曲面

从上面的公式可以看出,实际的泽尼克多项式可以由很多个,但一般会取前 N 项进行分析,对于一般的像差,取前 15 项就差不多够了,更复杂的像差,可能会取更多的项,zemax 里面一般取到 37 项。

zemax 里的 标准泽尼克系数:
在这里插入图片描述

光学像差与 PSF

前面介绍了光学像差与泽尼克多项式的关系,接下来利用一些 python 的工具库可以进一做泽尼克多项式的分析,我们可以选用 GitHub 上的 zernpy 这个工具库:

https://github.com/sklykov/zernpy

从 Github 上下载下来之后,可以看到这个工具库主要有两个主要的函数 ZernPol, ZernPSF

通过简单的调用,可以实现对不同泽尼克多项式在单位圆上的相位可视化:

import os
import numpy as np
from matplotlib import pyplot as plt
from zernpy import ZernPol, ZernPSF

if __name__ == '__main__':
    # Example usage of ZernPol class
    zp = ZernPol(m=-2, n=2)
    print(f"Zernike Polynomial for m=-2, n=2: {zp}")
    # Plot the Zernike polynomial profile
    ZernPol.plot_profile(zp)

上面这段代码,就可以对 m=−2,n=2m=-2, n=2m=2,n=2 这个泽尼克多项式单位圆上的相位进行计算以及可视化:

在这里插入图片描述
可以设置不同的 m,nm, nm,n 可以得到不同的泽尼克多项式的相位情况。

也可以用这个工具,进行 PSF 的仿真:

import os
import numpy as np
from matplotlib import pyplot as plt
from zernpy import ZernPol, ZernPSF

if __name__ == '__main__':

    zpsf = ZernPSF(ZernPol(m=1, n=3))  # horizontal coma
    NA = 0.95
    wavelength = 0.55
    expansion_coeff = -0.26
    pixel_physical_size = 0.2*wavelength   # example of physical properties
    zpsf.set_physical_props(NA, wavelength, expansion_coeff, pixel_physical_size)  # provide physical properties of the system
    kernel = zpsf.calculate_psf_kernel(normalized=True)  # get the kernel as the square normalized matrix
    
    print(f"PSF kernel shape: {kernel.shape}")
    plt.imshow(kernel, cmap='gray', interpolation='nearest')
    plt.title("PSF Kernel")
    plt.show()

上面的代码,可以生成某个泽尼克多项式下对应的 PSF,因为只模拟了单波长,所以显示的是一个单通道的黑白 PSF
在这里插入图片描述
也可以对多个泽尼克多项式进行加权,得到多个像差混合的 PSF

import os
import numpy as np
from matplotlib import pyplot as plt
from zernpy import ZernPol, ZernPSF

if __name__ == '__main__':

    # Example of using ZernPSF with multiple Zernike polynomials
    # Create multiple Zernike polynomials and calculate the PSF kernel
    zp1 = ZernPol(m=-1, n=3)
    zp2 = ZernPol(m=2, n=4)
    zp3 = ZernPol(m=0, n=4)
    pols = (zp1, zp2, zp3)
    coeffs = (0.5, 0.21, 0.15)
    zpsf_pic = ZernPSF(pols)
    zpsf_pic.set_physical_props(NA=0.65, wavelength=0.6, expansion_coeff=coeffs, pixel_physical_size=0.6/5.0)
    psf_kernel = zpsf_pic.calculate_psf_kernel()
    print(f"PSF kernel shape with multiple Zernike polynomials: {psf_kernel.shape}")
    plt.imshow(psf_kernel, cmap='gray', interpolation='nearest')
    plt.title("PSF Kernel with Multiple Zernike Polynomials")
    plt.show()

上面这段代码,实现了三种泽尼克多项式融合下的 PSF
在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐