This page was generated from a Jupyter notebook. Check the source code or download the notebook..

使用 ZOSPy 创建 Escudero-Sanz 眼睛模型#

本示例展示了如何创建并分析由 I. Escudero-Sanz 和 R. Navarro 在论文 Off-axis aberrations of a wide-angle schematic eye model 中描述的广角眼睛模型。

包含的功能#

  • 序列模式:

    • 使用 zospy.solvers.material_model 来模拟眼睛各部分的折射率。

    • 使用 zospy.analyses.systemviewers.CrossSectionzospy.analyses.systemviewers.ShadedModel 打开查看器。

    • 使用 zospy.analyses.psf.HuygensPSF 进行 Huygens PSF 分析。

引用#

除了 引用 ZOSPy,使用本示例提供的数据时,请同时引用以下论文:

Escudero-Sanz, I. & Navarro, R. (1999). Off-axis aberrations of a wide-angle schematic eye model. Journal of the Optical Society of America A, 16(8), 1881-1891. https://doi.org/10.1364/JOSAA.16.001881

免责声明#

示例按“原样”提供。没有担保,也不能从中获得任何权利,正如本仓库的通用许可证中所声明的。

导入依赖#

[2]:
from warnings import warn

import matplotlib.pyplot as plt
import pandas as pd

import zospy as zp
from zospy import solvers
from zospy.analyses import OnComplete

定义眼睛模型#

[3]:
wavelength = 543.0  # nm

定义眼睛光学组成的折射率

[4]:
refinds = pd.DataFrame(
    columns=[458, 543, 589.3, 632.8],
    index=["Cornea", "Aqueous", "Lens", "Vitreous"],
    data=[
        [1.3828, 1.3777, 1.376, 1.3747],
        [1.3445, 1.3391, 1.3374, 1.336],
        [1.4292, 1.4222, 1.42, 1.4183],
        [1.3428, 1.3377, 1.336, 1.3347],
    ],
)

定义眼睛模型的几何结构

[5]:
# 角膜前表面
cf_radius = 7.72  # mm
cf_conic = -0.26
cf_thickness = 0.55  # mm

# 角膜后表面
cb_radius = 6.50  # mm
cb_conic = 0
cb_thickness = 3.05  # mm

# 瞳孔
pupil_semidiameter = 1.5  # mm

# 晶状体前表面
lf_radius = 10.20  # mm
lf_conic = -3.1316
lf_thickness = 4.00  # mm

# 晶状体后表面
lb_radius = -6.00  # mm
lb_conic = -1.0
lb_thickness = 16.3202  # mm

# 视网膜
ret_radius = -12.00  # mm
ret_conic = 0

连接 OpticStudio#

[ ]:
zos = zp.ZOS()
oss = zos.connect("extension")

创建模型#

打开一个新的光学系统并将其设置为序列模式

[ ]:
oss.new()
oss.make_sequential()
True
[ ]:
# 设置波长
wl_1 = oss.SystemData.Wavelengths.GetWavelength(1)
wl_1.Wavelength = wavelength / 1000  # 转换为纳米

# 设置孔径类型
oss.SystemData.Aperture.ApertureType = zp.constants.SystemData.ZemaxApertureType.FloatByStopSize
[ ]:
# 输入光束(用于在系统查看器中可视化输入光束)
input_beam = oss.LDE.InsertNewSurfaceAt(1)
input_beam.Comment = "InputBeam"
input_beam.Thickness = 10  # mm

# 角膜前表面
cornea_front = oss.LDE.InsertNewSurfaceAt(2)
cornea_front.Comment = "Cornea Front"
cornea_front.Radius = cf_radius
cornea_front.Conic = cf_conic
cornea_front.SemiDiameter = 6  # mm
cornea_front.MechanicalSemiDiameter = 6  # mm
cornea_front.Thickness = cf_thickness
solvers.material_model(cornea_front.MaterialCell, refinds.loc["Cornea", wavelength], 0, 0)

# 角膜后表面
cornea_back = oss.LDE.InsertNewSurfaceAt(3)
cornea_back.Comment = "Cornea Back"
cornea_back.Radius = cb_radius
cornea_back.Conic = cb_conic
cornea_back.SemiDiameter = 5  # mm
cornea_back.MechanicalSemiDiameter = 6  # mm
cornea_back.Thickness = cb_thickness
solvers.material_model(cornea_back.MaterialCell, refinds.loc["Aqueous", wavelength], 0, 0)

# 虹膜/瞳孔
iris = oss.LDE.GetSurfaceAt(4)
iris.Comment = "Iris"
iris.SemiDiameter = pupil_semidiameter
iris.MechanicalSemiDiameter = 6  # mm
solvers.material_model(iris.MaterialCell, refinds.loc["Aqueous", wavelength], 0, 0)

# 晶状体前表面
lens_front = oss.LDE.InsertNewSurfaceAt(5)
lens_front.Comment = "Lens Front"
lens_front.Radius = lf_radius
lens_front.Conic = lf_conic
lens_front.SemiDiameter = 4.5  # mm
lens_front.MechanicalSemiDiameter = 4.5  # mm
lens_front.Thickness = lf_thickness
solvers.material_model(lens_front.MaterialCell, refinds.loc["Lens", wavelength], 0, 0)

# 晶状体后表面
lens_back = oss.LDE.InsertNewSurfaceAt(6)
lens_back.Comment = "Lens Back"
lens_back.Radius = lb_radius
lens_back.Conic = lb_conic
lens_back.SemiDiameter = 4.5  # mm
lens_back.MechanicalSemiDiameter = 4.5  # mm
lens_back.Thickness = lb_thickness
solvers.material_model(lens_back.MaterialCell, refinds.loc["Vitreous", wavelength], 0, 0)

# 视网膜
retina = oss.LDE.GetSurfaceAt(7)
retina.Comment = "Retina"
retina.Radius = ret_radius
retina.Conic = ret_conic
retina.SemiDiameter = 12  # mm
solvers.material_model(retina.MaterialCell, refinds.loc["Vitreous", wavelength], 0, 0)
<ZOSAPI.Editors.ISolveMaterialModel object at 0x0000023FC9408700>

使用OpticStudio的三维布局功能绘制眼睛模型#

[ ]:
# 定义绘图设置
cornea_front.DrawData.DoNotDrawEdgesFromThisSurface = False
cornea_back.DrawData.DoNotDrawEdgesFromThisSurface = True
iris.DrawData.DoNotDrawEdgesFromThisSurface = True
lens_front.DrawData.DoNotDrawEdgesFromThisSurface = False
lens_back.DrawData.DoNotDrawEdgesFromThisSurface = True
[ ]:
def draw_model(oss):
    """在三维查看器中绘制眼睛模型,或者如果当前的 OpticStudio 版本不支持此功能,则发出警告。"""
    cross_section = zp.analyses.systemviewers.CrossSection(
        delete_vignetted=True, number_of_rays=11, surface_line_thickness="Thick"
    ).run(
        oss,
    )
    zp.analyses.systemviewers.ShadedModel().run(oss, oncomplete=OnComplete.Release)

    if zos.version < (24, 1, 0):
        warn("在此版本的OpticStudio中,无法导出3D查看器数据。")
    else:
        plt.imshow(cross_section.data)
        plt.axis("off")


draw_model(oss)
../../_images/examples_Escudero-Sanz%E7%9C%BC%E7%9D%9B%E6%A8%A1%E5%9E%8B_Escudero-Sanz_eye_model_18_0.png

计算并绘制眼球模型的惠更斯点扩散函数#

[ ]:
psf_analysis = zp.analyses.psf.HuygensPSF(pupil_sampling="256x256", image_sampling="256x256", normalize=False)
psf = psf_analysis.run(oss, oncomplete=OnComplete.Sustain)
[ ]:
fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(
    psf.data,
    cmap="plasma",
    extent=(
        psf.data.columns[0],
        psf.data.columns[-1],
        psf.data.index[-1],
        psf.data.index[0],
    ),
)
plt.colorbar(im)
<matplotlib.colorbar.Colorbar at 0x23fc94199a0>
../../_images/examples_Escudero-Sanz%E7%9C%BC%E7%9D%9B%E6%A8%A1%E5%9E%8B_Escudero-Sanz_eye_model_21_1.png

针对不同偏心率下的光线,重新进行这些计算。#

[ ]:
field1 = oss.SystemData.Fields.GetField(1)
field1.Y = 15  # 角度
[ ]:
# 可视化新的光束设置
draw_model(oss)
../../_images/examples_Escudero-Sanz%E7%9C%BC%E7%9D%9B%E6%A8%A1%E5%9E%8B_Escudero-Sanz_eye_model_24_0.png

重新计算惠更斯点扩散函数#

[ ]:
psf = psf_analysis.run(oss, oncomplete=OnComplete.Sustain)
[ ]:
fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(
    psf.data,
    cmap="plasma",
    extent=(
        psf.data.columns[0],
        psf.data.columns[-1],
        psf.data.index[-1],
        psf.data.index[0],
    ),
)
plt.colorbar(im)
<matplotlib.colorbar.Colorbar at 0x23fc986d370>
../../_images/examples_Escudero-Sanz%E7%9C%BC%E7%9D%9B%E6%A8%A1%E5%9E%8B_Escudero-Sanz_eye_model_27_1.png