2. MTF测试原理:点扩散函数(PSF)与线扩散函数(LSF),MTF的计算方法

好,咱们直接进入正题。MTF这个指标,说白了就是衡量镜头“能不能把细节拍清楚”的能力。你想想看,一个理想镜头,拍一个点,它还是一个点。但现实中的镜头呢?拍一个点,它会变成一个模糊的斑。这个斑,就是我们要聊的点扩散函数。

2.1 点扩散函数(PSF)—— 镜头的“指纹”

PSF,全称Point Spread Function。我习惯叫它“点斑”。它描述的是:一个理想点光源,经过镜头成像后,在像平面上能量是如何分布的。

理想情况下,PSF应该是一个完美的脉冲。但实际中,由于衍射、像差、加工误差等因素,能量会扩散开来。这个扩散的形态,就是镜头的“指纹”。

核心理解:PSF越集中,镜头分辨率越高。PSF越分散,镜头越“肉”。

我在项目中遇到过一件事:有次我们评测一款手机镜头,MTF曲线看着还行,但实拍总觉得不够锐利。后来一查PSF,发现它虽然中心能量高,但周围有一圈“晕轮”。这就是典型的“高频好、中频差”的情况。所以,光看MTF曲线还不够,PSF的形态也很关键。

2.2 线扩散函数(LSF)—— 更实用的工具

PSF是二维的,分析起来比较麻烦。实际测试中,我们更常用线扩散函数(LSF)。

LSF怎么来的?很简单。你拍一条理想的细线(比如一个像素宽的亮线),经过镜头后,这条线会变宽、变模糊。这个模糊后的亮度分布曲线,就是LSF。

说白了,LSF就是PSF在某个方向上的积分。比如水平方向的LSF,就是把PSF在垂直方向上累加起来。这样做的好处是:

  • 数据量小:从二维降到了一维,处理速度快得多
  • 方向明确:可以分别测水平、垂直、对角线方向的性能
  • 计算方便:MTF可以直接从LSF的傅里叶变换得到

我的经验:实际测试时,我建议优先用LSF。除非你要分析非对称像差(比如彗差、像散),否则LSF完全够用。而且LSF对噪声的鲁棒性更好,不容易被单个坏点带偏。

2.3 从PSF/LSF到MTF —— 傅里叶变换的妙用

好,现在我们有PSF或LSF了。怎么得到MTF呢?

答案就是傅里叶变换。你想想看,一个点光源包含所有空间频率的信息(从低频到高频)。镜头把这个点变成了一个模糊斑,其实就是对不同频率的“过滤”。

数学上,MTF就是PSF的傅里叶变换的模。用公式表示:

MTF(f) = |FT{PSF(x,y)}|

对于LSF,更简单:

MTF(f) = |FT{LSF(x)}|

其中f是空间频率,单位是lp/mm(线对每毫米)。

为什么会这样?因为傅里叶变换能把空间域的分布,转换到频率域。PSF在空间域越窄,它在频率域就越宽,意味着高频信息保留得好。反之,PSF越宽,高频信息丢失越多。

2.4 实际计算步骤

嗯,这里要注意。实际测试中,我们不会真的去拍一个点或一条线。而是用刀口法或狭缝法。我简单说一下流程:

  1. 采集刀口图像:拍一个黑白分明的刀口边缘
  2. 提取边缘扩散函数(ESF):沿着垂直刀口方向,提取灰度变化曲线
  3. 微分得到LSF:对ESF求导,就得到了LSF
  4. 傅里叶变换:对LSF做FFT,取模,归一化
  5. 得到MTF曲线:横轴是空间频率,纵轴是对比度传递值(0~1)

避坑指南:我曾经犯过一个低级错误——直接用原始ESF做FFT,结果MTF曲线全是毛刺。后来才想起来,ESF是阶跃信号,直接做FFT会有严重的频谱泄漏。必须先微分得到LSF,或者对ESF做差分处理。这个坑,你们千万别踩。

2.5 知识体系结构图

下面这张图,我把整个MTF计算的逻辑串起来了。你可以把它当作一个思维导图来看:

MTF计算核心逻辑 理想点/线光源 被测镜头 PSF(二维)或 LSF(一维) 傅里叶变换(FFT) MTF曲线(频率 vs 对比度) 关键要点 • PSF越集中,MTF越高 • LSF是PSF的积分 • 刀口法→ESF→LSF→MTF • 空间频率单位:lp/mm • MTF值范围:0~1 常见误区: 1. 直接用ESF做FFT 2. 忽略噪声预处理 3. 采样频率不足 我的建议: 先看LSF形态 再算MTF曲线 两者结合分析

2.6 一个简单的计算示例

光讲理论太枯燥。我写个简单的Python代码片段,演示一下从LSF到MTF的计算过程。你可以在自己的环境里跑跑看:

import numpy as np
import matplotlib.pyplot as plt

# 模拟一个高斯形状的LSF(实际测试中从刀口图像提取)
x = np.linspace(-5, 5, 1000)
sigma = 0.5  # 控制模糊程度
lsf = np.exp(-x**2 / (2 * sigma**2))
lsf = lsf / np.sum(lsf)  # 归一化

# 对LSF做傅里叶变换
mtf = np.abs(np.fft.fft(lsf))
mtf = mtf[:len(mtf)//2]  # 取正频率部分
mtf = mtf / mtf[0]       # 归一化到0频率=1

# 空间频率轴(假设像素尺寸2um)
pixel_size = 2e-3  # mm
freq = np.fft.fftfreq(len(lsf), d=pixel_size)[:len(mtf)]

# 绘制
plt.plot(freq, mtf)
plt.xlabel('空间频率 (lp/mm)')
plt.ylabel('MTF')
plt.title('从LSF计算得到的MTF曲线')
plt.grid(True)
plt.show()

小技巧:实际测试中,sigma值越小,MTF曲线下降得越慢,说明镜头分辨率越高。你可以试着把sigma改成0.2和1.0,看看MTF曲线有什么变化。我经常用这个方法来快速评估不同镜头的性能差异。

2.7 总结一下

PSF是基础,LSF是实用工具,MTF是最终评价指标。三者的关系,说白了就是:

  • PSF:告诉你镜头对“点”的反应
  • LSF:告诉你镜头对“线”的反应
  • MTF:告诉你镜头对“不同粗细条纹”的反应

我个人习惯,拿到一款新镜头,先看它的LSF形态。如果LSF对称、窄、没有旁瓣,那MTF曲线一般不会差。如果LSF不对称或者有拖尾,那就要小心了——可能像散或者彗差比较严重。

嗯,这一节的内容就到这里。记住,MTF不是万能的,但没有MTF是万万不能的。下一节我们会聊MTF测试设备的具体选型,到时候再细说。


公众号:蓝海资料掘金营,微信deep3321