第一次把单光子探测器的直方图数据导出到Matlab里,直接画出深度图的时候,我有点不太敢相信:每像素平均只有几个光子,居然能重建出清晰的3-D轮廓和反射率图。后来想明白了,单光子探测器(SPAD)这套系统里,真正值钱的技术已经不是“探测器有多灵敏”,而是后面的光子高效计算——用极少的光子事件把三维信息和材质信息都抠出来。
这篇内容不是从探测器手册抄的,而是沿着我仿真和实验的完整思路展开:先讲清楚为什么SPAD可以做低光子成像,再给一套用Matlab从零搭建的单光子3-D与反射成像仿真代码,然后聊算法里真正影响效果的部分,最后是我实测中踩过的几个坑。适合正在接触单光子雷达、时间相关单光子计数(TCSPC)或者想做低通量成像仿真验证的工程师和学生。
1. 为什么单光子探测器偏要用“少光子”做成像
1.1 从像素积分到飞行时间:SPAD和普通相机的本质区别
普通相机成像的逻辑是“积分”:每个像素在曝光时间内累积光子数量,最后输出一个与光子数成正比的灰度值。要得到一张信噪比可用的图,往往需要成千上万甚至上百万个光子。这就带来一个天然的矛盾——目标越暗、距离越远,回波光子越少,你越是需要更长曝光时间,然后运动模糊、背景噪声、动态范围问题一起涌上来。
SPAD的工作方式完全不同。它工作在盖革模式,一个光子触发雪崩后,会产生一个数字脉冲,所以它天然输出的是“事件”而不是“灰度”。这意味着我们能记录的不只是“有没有光子回来”,还能精确记录“这个光子是什么时候回来的”。这个时间信息,就是单光子3-D成像的核心。
把两种成像方式放在一起看更清楚:
| 维度 | 普通相机 | SPAD直接飞行时间 |
|---|---|---|
| 输出信号 | 光子积分数值 | 每个光子到达时间 |
| 成像维度 | 二维强度 | 三维深度+反射率 |
| 信息载体 | 光子数量 | 光子数量+时间位置 |
| 对光强要求 | 高,需要足够积分 | 低,单光子可触发 |
| 典型计算任务 | 去噪、增强、HDR合成 | 时间峰值估计、深度反演、正则化重建 |
所以说,单光子成像并不是用更少的像素去看东西,而是把信息从“强度幅度”搬到“时间分布”上。你看到的不是一张图,而是一堆时间戳,计算的目标就是从这些时间戳里把物理量还原出来。
1.2 光子高效计算的真实含义:信息藏在时间维度里
“光子高效”这个词我第一次听的时候也觉得是个营销术语,但用信息论的视角看确实站得住。
一个回波光子携带的信息可以拆成两路:
- 到达时间:由目标距离和系统时延决定,对应的是深度信息;
- 是否被探测到:由目标反射率、距离、系统效率共同决定,对应的是反射率信息。
所以一次单光子探测事件,同时给深度估计和反射率估计做出了贡献。问题就变成了:给定N个光子事件,如何用统计模型把时延参数和强度参数都估出来?这本质上是一个参数估计问题,而不是“图像是不是够亮”的问题。这也解释了为什么光子很少时依然有可能成像——只要每像素平均有几个光子,统计上就足以支撑几个参数的估计。
我实测中见过很多第一次接触SPAD的人,下意识会把所有精力都放在“如何增加回波光子数”上,比如提高激光功率、加大曝光时间。但真正有效的玩法往往是反过来:把单脉冲能量降下去,用算法把每个光子的时间信息用足,然后靠重复积累和空间正则化把质量提上来。这也是“光子高效计算”和传统“堆光子”思路最大的区别。
1.3 深度和反射率对应什么样的估计量
如果只从直方图角度看,SPAD输出的是一个时间直方图:横轴是时间bin,纵轴是该时间范围内触发的光子数。
深度信息体现在“直方图峰值出现在哪个时间bin”,反射率信息体现在“目标对应的bin附近总共积累了多少光子”。
于是整个成像任务就拆成两步:
- 估计时间峰值位置,再乘以光速除以2,得到深度;
- 估计目标信号的光子数,经过距离和系统效率补偿,得到反射率。
在传统的强脉冲激光雷达里,这两个估计都很容易,因为直方图峰值非常明显。但在光子预算低到每像素只有几个光子时,直方图会非常稀疏,很多bin是0,直接找峰值很容易被噪声带偏。这个时候就要引入正则化、先验信息和邻域约束,把空间相关性用起来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从光子事件到TCSPC直方图的测量模型
2.1 直接飞行时间测量的基本原理
单光子3-D成像大多采用直接飞行时间法,公式很简单:
code复制d = c * t / 2
激光器发出一个短脉冲,光打到目标后返回,SPAD记录光子的到达时刻t,距离d就是光在往返路径上花费时间所对应的长度。除以2是因为光走了一个来回。
实际系统里不是测单个光子的绝对时间,而是把时间轴切成很多等宽的小bin,记录光子落在哪个bin里。bin宽度直接决定了距离分辨率:
code复制Δd = c * Δt / 2
如果时间bin宽度是100 ps,距离分辨率就是约1.5 cm;bin宽度压缩到10 ps,距离分辨率可以到1.5 mm。这个分辨率是量化极限,实际还要叠加探测器时间抖动、激光脉宽等系统响应,所以最终有效分辨率会差一些。
2.2 从单个光子到TCSPC直方图
SPAD不可能单次脉冲就积累足
