在光学设计和镜头测评中,MTF (Modulation Transfer Function) 曲线是绝对的权威。
但对于很多工程师来说,MTF 的计算过程像是一个黑盒:输入一张图,输出一条曲线。
这个黑盒里到底发生了什么?其实,一切都要从一个"点"说起。
01. 一切的源头:点扩散函数 (PSF)
想象在一个漆黑的宇宙中,有一颗无限远、无限小的恒星(理想的点光源)。
当这颗恒星的光经过你的镜头,打在传感器上时,它还会是一个完美的几何点吗?
绝不可能。
由于衍射极限(物理规律)和像差(镜头缺陷),这个点会散开,变成一个模糊的光斑。
这个光斑在空间上的亮度分布,就叫 点扩散函数 (Point Spread Function, PSF)。
- 理想镜头:PSF 是一个完美的艾里斑 (Airy Disk)。
- 真实镜头:PSF 是一个不规则的、弥散的能量团。
核心物理意义 :
成像系统对图像的处理,本质上就是物体与系统 PSF 的卷积 (Convolution) 。
Image(x,y)=Object(x,y)∗PSF(x,y)Image(x, y) = Object(x, y) * PSF(x, y)Image(x,y)=Object(x,y)∗PSF(x,y)
02. 从空间到频率:MTF 与傅里叶变换
PSF 是在空间域 (Spatial Domain) 描述模糊程度的(光斑直径多少微米)。
MTF 是在频率域 (Frequency Domain) 描述对比度衰减的(每毫米多少线对时对比度剩多少)。
连接这两个世界的桥梁,就是傅里叶变换。
光学传递函数 (OTF) 被定义为 PSF 的傅里叶变换:
OTF(u,v)=F{PSF(x,y)}OTF(u, v) = \mathcal{F}\{PSF(x, y)\}OTF(u,v)=F{PSF(x,y)}
而我们常说的 MTF ,其实就是 OTF 的模(取绝对值):
MTF(u,v)=∣OTF(u,v)∣MTF(u, v) = |OTF(u, v)|MTF(u,v)=∣OTF(u,v)∣
通俗理解:
- PSF 越尖锐(光斑越小) →\rightarrow→ 傅里叶变换后的频谱越宽 →\rightarrow→ MTF 曲线下降得越慢(高频高)。
- PSF 越弥散(光斑越大) →\rightarrow→ 傅里叶变换后的频谱越窄 →\rightarrow→ MTF 曲线掉得越快(高频糊)。
03. 工业界实战:为什么要用"斜边法"?
虽然理论上 MTF=∣F(PSF)∣MTF = |\mathcal{F}(PSF)|MTF=∣F(PSF)∣,但在实际测量中,直接拍摄一个微小的"点"来计算 PSF 是非常困难的:
- 能量太弱:一个微米级的针孔过光量太少,信噪比 (SNR) 极差,会被噪声淹没。
- 对齐困难:很难保证这个点正好落在像素中心。
所以,工业界(包括 ISO 12233 标准)几乎都使用 "斜边法" (Slanted Edge Method)。
我们不测点,我们测一条刀锋边缘 (Edge)。
计算链路推导:ESF →\to→ LSF →\to→ MTF
这是一个经典的三步走过程:
第一步:获取边缘扩散函数 (ESF)
拍摄一张黑白分明的斜边图像。
理想情况下,边缘应该是 0 到 1 的阶跃跳变。但经过模糊的镜头后,边缘会有一个渐变的过渡区。
如果在垂直于边缘的方向上截取亮度数据,我们得到的一条 S 型曲线,这就是 边缘扩散函数 (Edge Spread Function, ESF) 。
注:ESF 本质上是 PSF 的二维积分。
第二步:获取线扩散函数 (LSF)
数学告诉我们,对阶跃响应求导,就是脉冲响应。
同理,对 ESF 求导(微分) ,就得到了 线扩散函数 (Line Spread Function, LSF) 。
LSF(x)=ddxESF(x)LSF(x) = \frac{d}{dx} ESF(x)LSF(x)=dxdESF(x)
LSF 代表的是一条无限细的亮线经过镜头后变宽的亮度分布。
注:LSF 本质上是 PSF 在某个方向上的一维积分(投影)。
第三步:LSF 变 MTF
最后,对一维的 LSF 进行一维傅里叶变换 (FFT),并进行归一化,就得到了 MTF。
MTF(ν)=∣∫−∞∞LSF(x)e−i2πνxdx∣MTF(\nu) = \left| \int_{-\infty}^{\infty} LSF(x) e^{-i 2\pi \nu x} dx \right|MTF(ν)= ∫−∞∞LSF(x)e−i2πνxdx
通常我们会把零频率 (MTF(0)MTF(0)MTF(0)) 归一化为 1。
04. 仿真软件(Zemax)是怎么算的?
如果你不是在测实物,而是在 Zemax/CodeV 里做设计,软件并没有去"拍摄"边缘,它是怎么算出 MTF 的?
它有两种核心算法:
1. 基于 FFT (快速傅里叶变换)
这是最常用的方法。
- 软件计算出光瞳面上的波前像差 (Wavefront Error)。
- 计算光瞳函数 (Pupil Function)(包含振幅和相位)。
- 对光瞳函数做自相关 (Autocorrelation) ,直接得到 OTF。
OTF=P(x,y)⋆P(x,y)OTF = P(x, y) \star P(x, y)OTF=P(x,y)⋆P(x,y)
或者先对光瞳函数做 FFT 得到 PSF,再对 PSF 做 FFT 得到 OTF。
2. 基于 Huygens (惠更斯积分)
当像差很大或者不连续时使用。
它直接模拟无数个子波源在像面上的相干叠加,硬算出 PSF,然后再 FFT 得到 MTF。这种方法更准但更慢。
05. 总结
MTF 的计算并不是玄学,它是一条严密的数学链条:
| 物理对象 | 数学函数 | 关系 |
|---|---|---|
| 点 (Point) | PSF | 系统的基本响应单元 |
| 线 (Line) | LSF | PSF 的一维投影 |
| 边 (Edge) | ESF | LSF 的积分 (实际最好测) |
| 清晰度 | MTF | LSF 的傅里叶变换 |
实际操作口诀 :
"拍个斜边,提取 ESF,求导得 LSF,做 FFT 得 MTF。"
这就是每一次你用 Imatest 或写 Python 代码分析镜头画质时,计算机在毫秒间完成的工作。