在光学成像中,景深几乎是最直观也最关键的参数。它直接决定了成像系统在特定参数下能够清晰呈现的场景纵深范围。在摄影、显微、视觉检测等应用中,合理控制景深有助于在分辨率与亮度之间取得最佳平衡。

但景深计算其实并不简单。它涉及焦距、光圈、物距和弥散圆等多个参数,手算不仅麻烦,而且容易出错。于是我决定用Matlab做一个“能算、能画、能分析”的交互式景深计算与可视化工具。

一、景深背后原理

景深是光学成像中的一个核心概念,它描述了在成像系统中,能够形成清晰影像的物体在光轴方向上的纵深范围。当摄影师或成像设备对某一特定距离的物体进行对焦时,理论上只有一个垂直于光轴的平面(即焦平面)能够形成完全清晰的像。

然而,由于人眼或图像传感器的分辨率有限,在焦平面前后一定距离范围内的物体,其成像的模糊程度仍在可接受的限度内,这个范围就被称为景深 。景深范围内的物体在最终的图像上看起来都是清晰的,而超出这个范围的物体则会逐渐变得模糊。景深的存在使得我们能够在二维平面上表现出三维空间的纵深感和层次感,是摄影艺术和视觉技术中一个至关重要的控制手段。

在理想的光学系统中,与光轴平行的光线经过透镜折射后,会汇聚于光轴上的一点,这个点被称为焦点。当相机对一个物体进行对焦时,该物体所在的与光轴垂直的平面被称为焦平面。焦平面上的每一个点都能在成像平面上形成一个精确的点像,因此焦平面上的物体在最终图像中呈现为最清晰的状态。焦平面的位置由镜头的焦距和对焦距离决定,根据高斯成像公式

1/f = 1/u + 1/v

( f 是焦距,u 是物距,v 是像距),当物距u确定后,像距v也随之确定,从而决定了焦平面的位置 。景深正是围绕这个焦平面向前后延伸的一段距离范围。

在焦平面前后的物体,由于它们不在焦平面上,其发出的光线经过透镜后无法在成像平面上汇聚成一点,而是会形成一个模糊的圆斑,这个圆斑被称为弥散圆。弥散圆的大小与物体离焦平面的距离成正比:物体离焦平面越远,其形成的弥散圆就越大,图像也就越模糊。然而,人眼或图像传感器对细节的辨别能力是有限的。当弥散圆的直径小到一定程度时,它所引起的模糊将无法被察觉,看起来仍然像一个清晰的点。这个能够被接受的最大弥散圆直径,就被称为容许弥散圆。容许弥散圆是定义景深范围的关键阈值。

景深的前边界和后边界,正是由两个弥散圆直径恰好等于容许弥散圆直径的物平面所决定的。容许弥散圆的取值通常与成像系统的最终用途有关,例如,对于35mm胶片相机,常用的容许弥散圆直径约为0.035mm 。

二、几何光学原理

景深的范围并非固定不变,它受到四个主要因素的共同影响:光圈值、镜头焦距、拍摄物距和容许弥散圆直径。景深的计算基于几何光学原理,通过一系列公式可以精确地计算出在给定参数下的景深范围。

前景深(ΔL1)是指从对焦点到景深最近清晰点的距离。其计算公式为

ΔL1 = (F * δ * L²) / (f² + F * δ * L)

后景深(ΔL2)是指从对焦点到景深最远清晰点的距离。其计算公式为:

ΔL2 = (F * δ * L²) / (f² - F * δ * L)

总景深(ΔL)是前景深和后景深的总和,代表了整个清晰成像的范围。其计算公式为:

ΔL = ΔL1 + ΔL2

= (2 * f² * F * δ * L²) / (f⁴ - F² * δ² * L²)

超焦距(H)是一个特殊的对焦距离,当镜头对焦在超焦距上时,景深范围会从超焦距的一半延伸到无穷远,从而获得最大的景深。超焦距的计算公式为:

H = (f²) / (F * δ) + f

二、Matlab程序设计 

主要分为三个模块:输入参数模块、核心计算模块和结果可视化模块。

1.输入参数模块

主要负责用户交互,获取计算景深所需的所有外部参数。用户需要输入镜头焦距(f)、光圈值(F)、对焦距离(L)和容许弥散圆直径(δ)这四个关键参数。

程序会依次显示“请输入镜头焦距 f (mm):”、“请输入镜头光圈值 F:”等提示信息,并等待用户输入。用户输入的数值将被存储在相应的变量中,为后续的计算模块提供数据。

2.核心计算模块

这一模块将按照第二部分中介绍的景深计算公式,分别计算前景深(ΔL1)、后景深(ΔL2)、总景深(ΔL)以及超焦距(H)。计算完成后,该模块还会负责将结果以清晰、规范的格式输出到命令行窗口,并添加单位说明,方便用户查看。

三、案例展示

假设我们使用一台全画幅相机,配备一支50mm标准镜头,拍摄一个距离相机20米(20000mm)的物体。光圈设置为f/1.8,容许弥散圆直径取全画幅相机的常用值0.0035mm。

图片

得到计算结果如下,同时可以在图里显示景深范围。关于图示如何显示比较好,读者里的matlab画图高手也可以改一改,代码我放在知识星球了,大家也可以检查一下是否正确。

图片

图片

至此,我们完成了景深计算器从原理推导到 Matlab 实现的全过程。

完整源代码和小程序已同步到我们的知识星球,想要获取的朋友可以在那里查看。