从光子到像素:CMOS、SPAD与事件相机成像原理与选型指南 1. 从光子到像素为什么理解CMOS是计算成像的第一课很多人做计算成像一上来就研究重建算法、神经网络、压缩感知结果调了半天模型效果还不如别人用传统方法跑出来的。问题出在哪出在对前端传感器的工作机理缺乏基本认知。CMOS图像传感器是整个成像链路的第一环它决定了你能拿到什么样的原始数据、噪声水平如何、动态范围有多大、时间分辨率能到多少。这些物理层面的约束不是后端算法能凭空突破的。我做了几年计算成像相关的工作踩过最大的坑就是以为传感器就是个“黑盒”给它光它就出图。实际上从光子打到硅表面到最终输出一个数字值中间经历了光电转换、电荷收集、读出放大、模数转换等多个环节每个环节都在引入噪声、非线性、串扰。你不理解这些就没法设计出合理的成像方案更没法针对性地做标定和校正。这篇文章面向的是做计算成像、机器视觉、嵌入式图像处理的从业者和学生。不管你是刚入门想搞清楚CMOS到底怎么工作的还是已经有一定基础想深入了解SPAD和事件相机这些新型传感器的我都会从最底层的光子讲起一路讲到SPAD和事件像素的工作原理。读完你至少能搞清楚三件事普通CMOS像素怎么把光变成电信号、SPAD为什么能检测单光子、事件相机凭什么只输出变化信息就能做到微秒级延迟。2. 普通CMOS图像传感器从光子到数字值的完整链路2.1 光电转换的物理本质一切从光电效应开始。当光子打到硅材料表面如果光子能量大于硅的禁带宽度室温下约1.12 eV就能把价带上的电子激发到导带产生一个电子-空穴对。这个过程的量子效率决定了有多少入射光子能真正转化为可收集的电荷。量子效率不是固定的它跟波长强相关。硅在可见光波段400-700nm的量子效率通常能做到60%-90%但在近红外850nm以上会急剧下降因为光子能量接近禁带宽度吸收深度变深很多光生载流子在到达耗尽区之前就复合掉了。这就是为什么近红外成像通常需要更厚的硅层或者背照式结构。一个关键参数是满阱容量也就是一个像素能收集的最大电荷数。常见的工业级CMOS像素满阱容量在几千到几万电子之间。这个数字直接决定了动态范围的上限。你可以这样理解满阱容量就像一个水杯的容量光子就像雨滴杯子满了就溢出了对应到图像上就是过曝。2.2 像素电路的核心结构标准的CMOS有源像素APS通常采用4T结构传输门、复位晶体管、源极跟随器和行选晶体管。这四个晶体管配合一个光电二极管完成“复位-曝光-读出”的循环。工作流程大致是这样的首先复位晶体管把光电二极管拉到高电位然后传输门打开让光电二极管积累的电荷转移到浮空扩散节点源极跟随器把这个电荷量转换成电压信号最后行选晶体管把这个电压送到列读出电路。整个过程听起来简单但每个步骤都有讲究。传输门的设计直接影响电荷转移效率。如果传输门打开时间不够电荷转移不干净就会产生图像滞后。复位晶体管的噪声特性决定了复位噪声的大小这个噪声通常用相关双采样来消除。源极跟随器的线性度和噪声系数影响信号的保真度。2.3 读出电路与模数转换像素阵列输出的模拟信号需要经过列读出电路和模数转换器变成数字值。常见的读出架构有两种列并行ADC和像素级ADC。列并行ADC是目前主流方案每一列像素共享一个ADC。这种方式在速度和功耗之间取得了较好的平衡。列并行ADC的精度通常是10-12位对应1024-4096个灰度级。像素级ADC把ADC做在每个像素里面速度更快但填充因子更低因为ADC占用了像素面积减少了感光区域。这里有个容易忽略的细节ADC的量化噪声。一个N位ADC的量化噪声大约是LSB除以根号12。对于10位ADC如果满量程是1VLSB大约是1mV量化噪声约0.29mV。这个噪声在低照度条件下可能成为主导噪声源。2.4 噪声来源与信噪比分析CMOS图像传感器的噪声是一个系统工程问题主要来源包括以下几类散粒噪声光子到达的随机性导致的噪声服从泊松分布。散粒噪声的标准差等于信号电子数的平方根。这意味着信号越强绝对噪声越大但信噪比反而越高。这是物理规律决定的没法消除。读出噪声包括复位噪声、源极跟随器噪声、ADC噪声等。现代CMOS的读出噪声可以做到2-5个电子高端科学级传感器甚至能低于1个电子。暗电流即使没有光热激发也会产生电子-空穴对形成暗电流。暗电流随温度指数增长每升高约6-8摄氏度翻一倍。这就是为什么科学级相机需要制冷。固定模式噪声由于制造工艺偏差每个像素的响应不完全一致形成固定的空间噪声图案。可以通过平场校正来消除。信噪比的计算公式是SNR 信号电子数 / 总噪声电子数。总噪声是散粒噪声、读出噪声、暗电流噪声的平方和开根号。在实际应用中你需要根据具体场景来优化。比如低照度条件下读出噪声是主要矛盾需要选择低噪声传感器高照度条件下散粒噪声主导满阱容量更重要。3. SPAD与事件像素新型传感器的原理与突破3.1 SPAD的工作机理SPAD全称是单光子雪崩二极管。跟普通光电二极管最大的区别在于它工作在盖革模式反向偏压高于击穿电压。在这个状态下单个光子产生的电子-空穴对就能触发雪崩效应产生一个宏观可测的电流脉冲。这个机制的核心优势是单光子检测能力。普通CMOS需要积累几十上百个光子才能产生可检测的信号SPAD一个光子就能响应。这在极低照度成像、荧光寿命测量、激光雷达等场景下是革命性的。但SPAD也有明显的代价。首先是死时间每次雪崩发生后需要一段时间来淬灭和复位这段时间内探测器是“盲”的通常几十纳秒。其次是暗计数率即使没有光热激发也可能触发雪崩产生假计数。第三是填充因子SPAD的感光区域和淬灭电路共享像素面积填充因子通常只有百分之几到几十。3.2 SPAD阵列与时间相关单光子计数单个SPAD只能告诉你“有没有检测到光子”但结合时间数字转换器就能实现时间相关单光子计数。原理很简单记录每个光子到达的时间戳然后统计大量光子的到达时间分布。这个技术在飞行时间测距中特别有用。发射一个激光脉冲然后记录反射回来的光子到达时间通过时间差乘以光速除以2就能算出距离。时间分辨率取决于TDC的精度现代SPAD阵列的TDC精度可以做到几十皮秒对应几毫米的距离分辨率。SPAD阵列的读出方式跟普通CMOS完全不同。每个像素需要独立的淬灭电路和TDC电路复杂度高得多。这也是为什么SPAD阵列的分辨率通常远低于普通CMOS目前主流产品在几百乘几百的量级。3.3 事件相机的像素原理事件相机走了一条完全不同的路。它不输出帧而是输出事件流。每个事件包含四个信息像素坐标x、y时间戳t以及极性p变亮或变暗。事件像素的核心电路是一个差分放大器加比较器。它持续监测光电二极管的对数电压变化当变化超过设定阈值时就输出一个事件。对数响应意味着它能覆盖很宽的动态范围通常超过120dB远超普通CMOS的60-70dB。事件相机的最大优势是时间分辨率。普通CMOS受限于帧率通常几十到几百帧每秒事件相机的时间分辨率可以做到微秒级。而且因为是稀疏输出数据量和功耗都很低。在高速运动捕捉、自动驾驶、无人机避障等场景下事件相机有独特的优势。但事件相机也不是万能的。它只输出变化信息静态场景下几乎没有输出。而且事件流是非结构化的需要专门的算法来处理。传统的帧-based计算机视觉算法不能直接套用。3.4 三种传感器的对比与选型特性普通CMOSSPAD阵列事件相机感光机制电荷积累单光子雪崩对数响应变化检测输出形式帧图像光子时间戳异步事件流时间分辨率毫秒级皮秒级微秒级空间分辨率千万像素级百像素级百万像素级动态范围60-70dB受死时间限制120dB低照度性能受读出噪声限制单光子级中等数据率高全帧中稀疏低稀疏典型应用通用成像激光雷达、荧光高速追踪、避障选型的关键是看应用场景的核心需求。需要高分辨率静态成像普通CMOS是首选。需要单光子检测和精确测距SPAD更合适。需要高速运动捕捉和低延迟响应事件相机有独特优势。实际项目中也经常把多种传感器融合使用取长补短。4. 实操要点从传感器选型到数据采集的关键细节4.1 传感器选型的核心参数解读选传感器不能只看分辨率。我见过太多项目选型时只盯着像素数结果拿到手发现帧率不够、噪声太大、接口不匹配。以下是我总结的选型检查清单量子效率曲线不要只看峰值量子效率要看你的应用波段范围内的量子效率。比如做近红外成像峰值量子效率再高850nm处只有20%也没用。读出噪声单位是电子。这个参数直接决定低照度性能。如果应用场景光照充足读出噪声的重要性会降低。满阱容量单位是电子。决定动态范围上限。高动态范围场景需要大满阱容量。帧率与接口帧率要满足应用需求接口要跟你的采集平台匹配。常见的接口有USB3.0、GigE、Camera Link、MIPI等。高帧率通常需要高带宽接口。快门类型卷帘快门和全局快门。卷帘快门逐行曝光高速运动场景会有果冻效应。全局快门所有像素同时曝光适合运动捕捉但像素面积通常更大分辨率受限。像素尺寸像素越大满阱容量越大低照度性能越好。但同样光学格式下分辨率越低。这是一个权衡。4.2 曝光与增益的实操策略曝光时间的选择需要平衡信噪比和运动模糊。曝光时间越长信号越强信噪比越高但运动物体越容易模糊。经验法则是曝光时间内物体的移动不超过一个像素。增益分为模拟增益和数字增益。模拟增益在ADC之前放大信号同时放大噪声但不会引入额外量化噪声。数字增益在ADC之后放大会同时放大量化噪声。所以优先用模拟增益。实际调参时我通常这样做先把增益设为最低调整曝光时间让图像亮度合适。如果曝光时间已经到上限受帧率限制再增加模拟增益。数字增益尽量不用除非实在没办法。注意高增益下暗电流和固定模式噪声也会被放大需要配合暗场校正和平场校正。4.3 原始数据采集与标定做计算成像一定要保存原始数据。很多相机默认输出经过ISP处理后的图像白平衡、伽马校正、降噪都做过了这些处理会破坏原始信息的线性关系给后续的算法处理带来麻烦。标定是另一个关键步骤。至少需要做两类标定暗场标定和亮场标定。暗场标定是在完全遮光条件下采集多帧取平均得到暗场图案用于校正暗电流和固定模式噪声。亮场标定是在均匀光照下采集用于校正像素响应不一致和镜头渐晕。标定数据的质量直接影响最终成像效果。我的经验是暗场标定至少采集100帧取平均亮场标定要注意光源的均匀性最好用积分球。温度变化会影响暗电流标定时的温度要跟实际使用温度接近。4.4 SPAD与事件相机的数据采集要点SPAD阵列的数据采集跟普通CMOS完全不同。你需要配置淬灭模式被动淬灭还是主动淬灭、死时间、TDC量程和精度。被动淬灭电路简单但死时间长主动淬灭死时间短但电路复杂。事件相机的数据采集需要关注几个参数对比度阈值、 refractory period不应期、带宽。对比度阈值决定了事件触发的灵敏度阈值太低会输出大量噪声事件太高会漏掉有用信息。通常需要根据场景动态调整。事件流的数据量可能很大特别是高动态场景下。需要设计合理的降采样和滤波策略。常见的方法包括时间窗口内的多数投票、空间邻域一致性检查、基于运动模型的滤波等。5. 常见问题与排查技巧实录5.1 图像异常问题速查现象可能原因排查方法解决方案图像全黑镜头盖未取、曝光过短、增益为零检查光路、逐步增加曝光调整曝光和增益图像过曝曝光过长、增益过高、光源过强降低曝光时间加ND滤镜或降低光源固定图案噪声像素响应不一致采集平场图像分析平场校正暗电流大温度过高、曝光过长测量暗场图像制冷或缩短曝光图像有横纹电源干扰、读出时序问题检查电源和时钟加滤波电容、调整时序运动模糊曝光时间过长计算运动像素数缩短曝光或使用频闪果冻效应卷帘快门拍摄高速运动物体换全局快门传感器事件相机无输出阈值过高、场景静止检查阈值设置降低阈值或移动场景5.2 我踩过的坑与经验教训坑一忽略填充因子。早期做SPAD阵列项目没注意填充因子只有5%结果光收集效率极低信噪比惨不忍睹。后来加了微透镜阵列才改善。选SPAD时一定要看填充因子必要时考虑带微透镜的产品。坑二低估了数据带宽。事件相机在高速场景下每秒产生数百万个事件每个事件几个字节数据率轻松上百MB/s。一开始用的采集卡带宽不够丢了很多数据。做方案时一定要算清楚峰值数据率。坑三标定温度不一致。暗电流对温度极其敏感我在25度下标定实际使用环境35度暗电流翻了好几倍图像质量严重下降。后来养成习惯标定和使用必须在相同温度条件下或者做温度补偿。坑四忽视镜头匹配。传感器的像素尺寸和镜头的分辨率要匹配。如果镜头分辨率不够再好的传感器也发挥不出来。反过来像素太小而镜头分辨率不足会出现严重的混叠。选镜头时要看MTF曲线确保在传感器奈奎斯特频率处仍有足够的对比度。5.3 计算成像中的传感器相关技巧做计算成像时传感器的非线性特性既是挑战也是机会。比如利用光电响应的非线性可以实现单帧高动态范围成像。利用卷帘快门的时序特性可以做编码曝光。利用SPAD的死时间特性可以做光子数分辨。另一个技巧是不要试图消除所有噪声。散粒噪声是物理极限消除不了。但可以利用噪声的统计特性通过多帧平均、稀疏重建等方法在算法层面提升信噪比。关键是要准确建模噪声知道哪些噪声是相关的、哪些是独立的。对于事件相机我最大的体会是不要把它当普通相机用。事件流的数据结构完全不同需要专门的算法。我试过把事件流累积成帧再用传统算法处理效果很差。后来改用基于事件的时间表面、体素网格等表示方法效果明显提升。6. 传感器技术演进与计算成像的协同设计6.1 从传感器到算法的协同优化计算成像的核心思想是不再把传感器和算法割裂开而是联合设计。传统成像中传感器负责采集算法负责处理两者独立优化。计算成像中传感器的编码方式、读出模式、甚至像素结构都可以为特定算法定制。一个典型的例子是压缩感知成像。传感器不再采集完整图像而是采集经过编码的测量值。这要求传感器支持可编程的曝光模式或者像素级编码。算法端则利用信号的稀疏性从少量测量中重建图像。这种协同设计可以大幅降低数据量提高采集速度。另一个例子是深度估计。传统方法需要多帧或者多视角计算成像可以通过编码孔径或者事件相机的时间信息从单帧或者稀疏数据中估计深度。这要求传感器提供精确的时间戳或者编码信息。6.2 新型传感器的发展趋势CMOS图像传感器的发展方向是更高分辨率、更高速度、更低噪声、更智能。堆叠式结构把像素层和逻辑层分开制造再键合可以在不牺牲填充因子的情况下集成更多处理电路。背照式结构把电路层放在感光层后面进一步提高量子效率和填充因子。SPAD阵列的发展方向是更高分辨率、更低暗计数率、更小像素尺寸。3D堆叠技术让SPAD和淬灭电路、TDC可以分层制造有望把SPAD阵列的分辨率提升到百万像素级。事件相机的发展方向是更高分辨率、更低延迟、更丰富的输出格式。有些新型事件相机已经可以同时输出事件流和灰度帧兼顾两种数据的优势。6.3 给从业者的几点建议如果你刚入行计算成像我的建议是先把普通CMOS的成像链路搞清楚理解每个环节的物理约束。然后根据你的应用场景判断是否需要SPAD或事件相机。不要为了追新而用新传感器适合的才是最好的。如果你已经在做计算成像项目建议你花时间做传感器标定和噪声建模。很多算法效果不好不是算法本身的问题而是传感器模型不准确。准确的噪声模型可以让简单的算法发挥出意想不到的效果。最后多动手实验。看再多论文不如自己搭一套采集系统跑一遍。传感器的很多特性是数据手册上写不清楚的只有实际用过才知道。比如暗电流的实际分布、事件相机的噪声特性、SPAD的死时间一致性这些都需要实测才能掌握。我个人在实际操作中的体会是计算成像的门槛不在算法而在对成像物理过程的理解。你把传感器搞透了算法设计自然水到渠成。反过来传感器没搞明白再花哨的算法也是空中楼阁。