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.CrossSection和zospy.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)
计算并绘制眼球模型的惠更斯点扩散函数#
[ ]:
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>
针对不同偏心率下的光线,重新进行这些计算。#
[ ]:
field1 = oss.SystemData.Fields.GetField(1)
field1.Y = 15 # 角度
[ ]:
# 可视化新的光束设置
draw_model(oss)
重新计算惠更斯点扩散函数#
[ ]:
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>