从成像模拟到计算光学
很多光学工程师在设计镜头时会用到成像模拟(Image Simulation)功能来查看镜头拍照的“实际效果”,本文的第一部分就来拆解一下成像模拟功能究竟是怎么一回事。
在知名光学软件Zemax中,用成像模拟功能,可以输入一张图片,输出这张图片被当前镜头成像后所得到的样子。
这个功能主要进行了三步计算:
1、 计算畸变,把原图按照畸变曲线扭曲。这也是在上图中最明显的一个改变。
2、 计算相对照度,添加边缘相对于中心的明暗变化。如果存在暗角等情况,就可以直观看到了。
3、 计算像差,模拟由于镜头像差带来的模糊化。
这三步里面,前两步相对直观,比较容易理解(本号之前解析过畸变和相对照度,如果有需求请自行翻阅)。第三步是相对而言最有技术纵深的,这边稍微展开一下。
首先,计算镜头像差带来的影响,其根本算法就是用PSF和原图做卷积——就是算出原图的一个点在像面上散成怎样的一片,然后把这个影响加进去就是了(如果不熟悉卷积,自行补课)。
在Zemax里有如下这些设置项:
Geometric意味着用点列(Spot Diagram)作为PSF,Diffraction则意味着使用FFT PSF。如果镜头画质一般,远未达到衍射极限,那么使用几何点列是一种省算力也不影响计算精度的方式;如果镜头画质很好,达到或者接近衍射极限,那么必须使用衍射算法的PSF才能正确仿真成像质量。当然我们也可以自己想办法用更加精准的算法获取PSF,比如使用Huygens PSF算法等,只是算起来很慢,Zemax没有提供了。
PSF-X Points和PSF-Y Points是说在整个画幅中,采样多少个格点的PSF,用以计算。对于格点之间没有被采样到的位置,Zemax的做法是——插值。
然而这里有一个问题:对PSF的插值合理吗?答案是,看情况吧,总的而言,不咋合理。如果是上图这种defocus占主导的情况,那么插值是OK的,但如果像质稍微好一点,在一个轴上球差主导的PSF和一个轴外慧差主导的PSF之间插值,能插出个鬼来?用专业一点的话说,就是PSF随视场的变化不是线性的,甚至一般不存在微分的线性区间,也不是简单的多次函数可以描述的。
那怎么办?采样很密的PSF格点,力大砖飞,避免PSF插值不准的问题,当然是一个办法。
有没有更巧妙的办法?也是有的。对PSF插值不准,但可以对波前插值呀。波前可以通过Zernike分解,每一个Zernike项目对于视场而言就是简单的多项式了。这个时候的插值,就有了明确的方案与物理依据了。
再说一点题外话吧,上文的成像模拟图片,是Zemax软件自带的demo图,这张图是一个糟糕的选择。因为这张照片里面人和建筑是带着很大的景深差异的,实际场景的大景深被摄像拍到一张2D没有景深的照片上,再被成像模拟仿真了一遍。成像模拟是不考虑景深的,只能根据镜头数据的设置针对某一个对焦点来进行,所以选用有景深的照片就是一件很迷惑的事情。换句话说,无法对实际场景的景深进行仿真也是当前光学软件的一个限制因素。
那如果我就是想要搞定实际场景带景深的仿真怎么办?尤其是想把焦外散景(bokeh)给仿清楚怎么办?
办法嘛,也是有的。可以就用CAD的建模思路,把需拍摄的场景的实体模型、散射函数、光源的模型原原本本建立出来,通过追踪海量光线,获取拍照的场景,这其实就和游戏引擎里的ray tracing是一回事了。由于计算量太大太大了,能给到float精度就不错了,不太可能用double,且多少需要一些近似、平滑处理,且必然只存在几何光线追迹,不会有衍射PSF什么事情,一般而言只是用以渲染视觉效果,不具备光学仿真精度。更糟糕的是,软件做了一堆后台近似而不明确告诉用户。
对于真实场景成像仿真有没有折衷一点的方案,既考虑景深,也考虑计算精度,还考虑到速度?我觉得,比较合理的方案是如下这样的:
使用CAD类的建模方式,但只提供2-3个景深,即被摄物在一个“合焦”景深区域、前景、后景,最多只允许3个。每个景深区域内的物体深度不能太大。
合焦景深区内的被摄物,其FFT PSF使用波前Zernike分解插值与外推获取(景深区域内的小离焦可以很轻松添加Z4离焦项解析获取)。
前景与后景一般不提供复杂建模,只提供强点光源,主要用以模拟bokeh。
所以,总结一下,成像模拟这个功能,现阶段的各种方案都做不到完备,甚至尚且谈不到什么精度。成像模拟主要是用来出个图放在ppt里作报告的,而不是工程师所用的严肃的分析工具。
讲到这里,成像模拟应该是清楚了,那计算光学(计算成像)呢?其实了解了成像模拟就理解了一半的计算光学。计算光学其实就是成像模拟的逆过程——把实际拍到的变糊、畸变、暗角的图片通过算法恢复过来!
计算光学的概念可以说是被华为P50以一己之力带出来的(遥遥领先!!!)。其实在那之前的很多年,广义的计算光学所有厂家都在做。HDR算不算计算光学?广义也算吧。但更难一点无疑是如果把模糊的图像复原,也就是把PSF的卷积效应去掉,就是去卷积。我相信华为P50是首个把去卷积算法重点攻关引入手机摄影的(只是我的个人猜测,我没有消息来源说P50以及其它手机厂的技术路径,假使有,那便是保密信息不能说了。或许苹果早就做了,却没有宣传?不清楚,只能猜)。
其实在显微成像领域(生物狗DNA动了),PSF去卷积是一个早就被广泛采用的标准做法了。
那为什么这一技术在近些年才进入了手机领域呢?我认为其主要原因是,手机镜头的PSF怎么求准的问题。每个镜头都会有公差,公差后的PSF可以是千奇百怪的,如果拿不到准确的PSF,那么去卷积的操作不会有任何帮助反而会使得图像一塌糊涂。在消费电子品领域,由于成本约束,没有办法把每一颗镜头的PSF数据完整准确地都测出来,只能结合制程收紧、部分实测、仿真等手段,把PSF中不论公差如何变化都共有的那一部分提取出来,把部分的PSF的效应通过去卷积操作处理掉。相反,在高端的显微成像领域,显微镜做到接近衍射极限是常规操作,于是先验地就有了准确的PSF;另外显微成像里往往有单个的荧光分子发光(点光源),它在像面上的分布直接就是PSF,所以在显微成像的过程中,相当于一直在实测获取PSF,那么做起去卷积来,岂不是得天独厚!
当然后来显微成像领域我们又有了进一步的超分辨成像手段,这个以后再聊。
(全文完)