光学像差与泽尼克多项式
在光学像差分析中,泽尼克系数是非常重要的一种光学像差分析工具。在介绍泽尼克系数之前,我们先简单介绍一下光学像差的概念。
光学像差
光学系统的像差(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,θ)={Rn∣m∣(r)cos(mθ)Rn∣m∣(r)sin(∣m∣θ)m≥0m<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 n∣m∣≤n,n−∣m∣n - |m|n−∣m∣ 为偶数。
径向函数的表达式为:
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=0∑2(n−∣m∣)k!(2n+∣m∣−k)!(2n−∣m∣−k)!(−1)k(n−k)!rn−2k
泽尼克系数的正交性,在单位圆上满足:
∬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=0∑∞m=−n∑ncnmZnm(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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)