你可能没想过手机拍照和一台上万元的科学相机核心其实都是同一类东西图像传感器。它把镜头汇聚的光子变成电信号再经过一长串信号处理最终才变成你屏幕上那张图。而这场光电转换的主角就是CCD和CMOS两种图像传感器。这篇文章不讲“参数表复读机”而是从底层原理到信号处理链路把CCD和CMOS的差异、选型和常见坑一次讲透。适合硬件工程师、嵌入式开发者、图像算法入门者以及正在为工业相机或科研设备选型的朋友。看完你会知道为什么高端工业领域还在用CCD为什么消费电子全面倒向CMOS以及那些跟“信号处理”相关的热词到底意味着什么。1. 从光子到像素图像传感器的底层工作原理1.1 光电效应与量子效率图像传感器本质上是一个光子计数器。光线进入硅片后如果光子能量大于硅的禁带宽度就会把价带电子激发到导带形成电子-空穴对。这个过程中光子转换为电子的比例叫做量子效率QE通常用百分比表示。比如说一颗QE为70%的传感器入射100个光子最终能收集到70个电子。这个指标直接决定了传感器的灵敏度。很多人以为像素数越高越好其实在相同工艺下单个像素面积越大能接收的光子就越多满阱容量也越大动态范围自然更高。所以手机摄像头虽然能到一亿像素但跟工业面阵相机全画幅传感器比起来单像素性能还是差不少。还有一个很容易忽略的点硅对不同波长的响应不一样。可见光波段响应较好但近红外区域效率会下降紫外波段因为硅表面复合效应更糟糕。做机器视觉选型时如果目标是红外光源或紫外光源一定要看传感器datasheet里的QE曲线不要只看“多少万像素”。1.2 像素阵列与读出逻辑传感器里最基础的单位是像素Pixel每个像素包含光电二极管和一些控制晶体管。这些像素按行列排列成阵列通过行列寻址逐行读出。这个“读出”过程很有意思——传感器并不像底片那样一次性把所有感光点变成照片而是像扫描一样把电荷包一个一个送出来。根据曝光方式像素支持两种快门模式卷帘快门和全局快门。CCD天然是全局曝光所有像素同时开始感光、同时结束而传统CMOS为了降低成本大多采用卷帘快门像素逐行曝光所以拍快速移动物体时会出现“果冻效应”。现在工业级CMOS已经能做全局快门但像素设计更复杂填充因子会受影响。一般彩色传感器会在像素表面覆盖Bayer滤色片以RGGB或其它排列方式让每个像素只采集一种颜色。原始输出是马赛克图像后续必须经过插值去马赛克Demosaic才能变成RGB图像。这一步属于信号处理的范畴后面会细讲。1.3 模拟域到数字域的第一道关口光电二极管产生的电荷包先转换成电压再通过源跟随器放大最后由ADC量化成数字码。这个过程看似简单但像素输出的是一个非常微弱的模拟信号极其容易受到噪声干扰。所以信号处理并不是从RAW图变成JPG才开始而是从像素内部就已经开始了。想要一张干净明亮的图像第一步就是在模拟域把噪声抑制住再考虑数字域的各种算法。2. CCD与CMOS两种架构的硬核对比2.1 CCD是怎么把电荷“搬”出来的CCD的全称是电荷耦合器件。它最大的特点是像素内没有有源放大器只有光电二极管和电荷转移通道。曝光结束后每个像素积累的电荷包在时钟驱动下像接力赛一样逐行、逐列转移到角落的输出放大器。这个设计牺牲了灵活性和速度却换来了极好的一致性。因为所有像素共享同一个输出放大器像素之间的增益差异很小固定模式噪声FPN非常低。再加上CCD的硅表面被厚氧化层覆盖暗电流也低特别适合长曝光、低照度的科学观测场景。代价是CCD制造工艺跟标准CMOS逻辑工艺完全脱节没办法在一片芯片上集成ADC、DSP和接口电路。所以CCD相机通常是多芯片方案功耗高体积大读出速度也被电荷转移速度死死卡住。你可以把CCD理解成一位“慢工出细活”的老工匠精度极高但效率受限。2.2 CMOS为什么能“每个像素都带放大器”CMOS图像传感器则完全不同。它在每个像素内部集成了源跟随器和行选晶体管像素可以直接把电压信号读出来不需要全局电荷转移。这个结构使得CMOS可以随机访问任意像素读出速度远高于CCD。更重要的是CMOS制造工艺跟DRAM、逻辑芯片、模拟芯片的工艺高度兼容。这意味着传感器制造商能够把像素阵列、模拟前端、ADC、数字逻辑、时钟生成器甚至图像信号处理器ISP全部集成到同一块芯片上。手机摄像头模组之所以能那么小靠的就是这种SoC级集成。早期CMOS最大的问题是像素内放大器带来的固定模式噪声每个像素的放大增益不一致导致画面有颗粒感。后来靠相关双采样CDS和更先进的工艺这个问题已经基本解决。从画质和成本的综合角度看今天主流消费级、工业级应用选CMOS几乎毫无悬念。2.3 画质与速度的天平怎么选直接列一张表对比方便你做选型时的快速参考对比维度CCDCMOS像素一致性极高共享输出放大器较好但有像素间增益差暗电流低常规稍高但技术差距缩小读出速度慢电荷转移有瓶颈快行列并行读取功耗高需要多路时钟驱动低单电源供电系统性集成差难集成模拟/数字电路好SoC级集成成本高低全局快门天然全局需要专门设计但已成熟典型应用天文、显微、高端工业检测手机、安防、车载、工业高速成像一句话如果你的目标是几百毫秒的静态长曝光、追求极致低噪声CCD依然是合理选择如果你是拍高速运动目标、需要紧凑系统、预算有限CMOS就是更合适的路线。2.4 此CMOS非彼CMOS别搜错资料做技术调研时很多朋友经常搜到一堆无关内容。“cmos battery is bad”、“cmos checksum error”这类错误提示说的是主板上保存BIOS设置的那颗小电池和CMOS RAM跟图像传感器一毛钱关系都没有。还有“闪存cmos中page buffer”、“cmos schmit sstl区别”这些讨论的是存储器或逻辑电路里的CMOS工艺、施密特触发器、SSTL电平标准。图像传感器领域的“CMOS”指的是用互补金属氧化物半导体工艺制造的有源像素传感器APS。如果搜错了方向很容易浪费时间。我的习惯是搜索时加上“image sensor”或“sensor”关键词比如“CMOS image sensor”就能避开主板电池和闪存页缓冲那些内容。3. 图像传感器的信号处理链路从原始输出到可用图像3.1 相关双采样CDS与噪声抑制CMOS像素输出信号之前复位操作会引入一个不确定的复位电压。如果不做处理每个像素的最终输出电压会被这个噪声污染。相关双采样的思路是像素复位后先采样一次复位电平完成电荷转移后再采样一次信号电平然后把两次采样的差值作为有效输出。因为两次采样发生在同一个像素的同一个复位周期内复位噪声和一部分低频噪声就被消除了。这个技巧在CCD里也有类似应用。CDS的时序很重要采样保持电容充电时间、开关导通电阻、还有信号通路带宽都会影响效果。我在调试时遇到过CDS采样点太早导致信号建立不完全的情况画面会出现横向黑线。后来把采样窗口往后移了不到1微秒问题就消失了。这种细节只有在看波形时才能发现。3.2 暗电流与黑电平校正传感器即使完全遮光也会因为有热量激发电子产生一个基础输出这叫暗电流。暗电流大小跟温度强相关温度每升高6到8摄氏度暗电流大约翻一倍。所以长曝光的天文相机才要用液氮制冷就是要把暗电流压到最低。为了校正暗电流传感器芯片上通常会留几行或几列被金属层遮挡的像素叫做光学黑Optical Black像素。这些像素的输出值作为黑电平参考信号处理链路会把所有有光像素的数值减去黑电平值确保全黑画面输出为0。这也解释了为什么长时间曝光拍出来的照片会有越来越多的小亮点那不是坏点而是暗电流在长曝光下累积到一定水平。如果你在做图像传感器驱动记得黑电平较正要放在增益之前否则黑电平的误差会被增益一起放大。3.3 坏点校正与增益控制传感器制造时难免出现个别像素暗电流异常或输出异常表现为固定亮点或暗点。坏点校正通常包括两步第一步靠出厂标定生成坏点坐标表第二步在输出时用邻域像素插值替换坏点。这个表可以存在传感器的OTP一次性可编程存储器里也可以由主机端维护。增益控制也很关键。模拟增益在ADC之前放大信号数字增益在ADC之后放大数据。从信噪比角度看模拟增益优先因为它能把信号放大到足以覆盖ADC量化噪声的水平数字增益则会把之前累积的噪声一起放大。所以在自动曝光算法里应该先提高模拟增益不够了再补数字增益。还有一个经验当模拟增益设置很高时画面阴影部分可能出现色偏因为三个通道的噪声增长不一致。此时需要做彩色降噪或者分通道增益补偿。3.4 ADC与接口传输传感器的ADC精度决定了量化动态范围。消费级CMOS一般内置10bit或12bit ADC工业/科学级能到14bit甚至16bit。但位深并不是越高越好高精度ADC往往意味着更慢的转换速度具体要看应用需求。数据从传感器出来后需要通过接口传到处理器。手机摄像头走MIPI CSI-2工业相机常用LVDS或SLVS-EC高速科学相机则可能直接用PCIe接口。热词里那个“pci数据捕获和信号处理”指的就是用PCIe高速采集卡把图像传感器的RAW数据直接搬进主机内存然后交给CPU或GPU处理。这种方案的核心挑战是PCIe的DMA带宽和数据缓冲管理稍有不慎就会丢帧或产生撕裂。PCB布线时还要注意差分信号对的等长匹配和阻抗控制。我见过一块板子因为MIPI走线绕了太多弯导致眼图张开度不够高频下出现随机花屏。最后把走线等长误差控制在5mil以内才解决。3.5 From RAW to RGBISP中的关键算法传感器输出的Bayer RAW数据还只是“半成品”。图像信号处理器ISP会执行一串算法把这半成品变成人眼舒服的图像去马赛克插值、白平衡调整、颜色校正矩阵、Gamma映射、降噪、锐化。这些算法听起来像图像处理但它们在系统层面跟传感器是强耦合的。比如白平衡要根据光源色温调整R/G/B通道增益而光源色温需要从RAW数据中估计。如果传感器黑电平没校准好整个白平衡估计都会偏。所以做ISP调试的人必须同时懂传感器驱动和信号链路。对于软件开发者来说如果不需要做实时视频流可以直接在主机端用OpenCV、RAW解码库处理RAW数据如果做手机或嵌入式设备那ISP基本都是传感器厂商或SoC厂商提供的黑盒只能通过3A自动曝光、自动白平衡、自动对焦接口去调参。4. 应用场景与选型别只看像素数4.1 工业与科研成像是CCD还是CMOS工业检测里CCD过去是绝对主力。因为检测场景很多是静止的对速度不敏感更看重低噪声和稳定一致性。但现在工业CMOS传感器已经把全局快门和噪声做到很好还能输出更高帧率所以这几年新项目里用CMOS的比例越来越高。真正还在坚持CCD的领域基本是天文、荧光显微、以及需要长时间积分的高端科研。这些场景有一个共同特点光子极其稀少必须靠极低暗电流和高量子效率来捕捉微弱信号。科学级CCD往往做成背照式把感光面移到硅片背面避免正面电路遮挡光线量子效率能到90%以上。如果你在给学生或者客户做方案选型时除了像素数一定要关注像素尺寸、满阱容量、动态范围、读出噪声、暗电流、量子效率这几个参数。只有综合评分才能判断是选CCD还是CMOS。4.2 消费电子与汽车CMOS的天下手机摄像头就是CMOS图像传感器的舞台。体积小、功耗低、可以集成ISP和HDR处理而且价格便宜。现在一颗高端手机的CIS芯片面积只有指甲盖大小像素能到两亿靠的就是多合一像素合并技术比如四合一、九合一在亮暗场景之间自适应切换。车载摄像头要求更特殊。汽车环境光照变化剧烈隧道进出口会有几十倍的亮度跳变所以需要高动态范围HDR。现在CMOS传感器可以在同一个像素内做多次曝光然后把长曝光和短曝光的信号组合成宽动态图像。另外LED交通指示灯有频闪传统卷帘快门拍出来会出现条纹所以车规级传感器还要支持LED闪烁抑制LFM。安防监控这几年转向AI识别对传感器分辨率要求不断提高但成本和功耗依然敏感CMOS依然是唯一主流方案。4.3 特殊传感器ToF、事件相机、SPAD热词里有人问“itof是用cmos还是spad工艺”这问题很有代表性。iToF间接飞行时间测距传感器大多数商业化产品都用CMOS工艺把调制光源的反射光信号跟参考信号做相关运算从而计算相位差。它不需要单光子灵敏度CMOS工艺足够。而dToF直接飞行时间需要探测单个光子必须用SPAD单光子雪崩二极管。SPAD本身也可以集成在CMOS工艺里所以市面上有些dToF传感器也是“CMOSSPAD”的混合方案但不能说它用的是传统图像传感器的CMOS像素结构。事件相机是另一个有趣的CMOS应用。它不像传统传感器按帧输出而是每个像素检测到亮度变化才输出一个事件天然具备低延迟和高动态范围。这类传感器特别适合高速机器人、无人机避障场景。4.4 信号处理的下游系统雷达信号处理与分布式阵列图像传感器信号处理本质上是二维空间信号采样和处理而雷达信号处理、分布式阵列信号处理也共享很多数学工具比如傅里叶变换、波束形成、相关检测。热词里常把“雷达信号处理”、“分布式阵列信号处理”和图像信号处理归档到同一类这在算法层面对得上但物理链路差异很大。如果你在做自动驾驶感知会遇到相机和毫米波雷达的融合。这时不是你死我活的关系而是要做传感器同步和空间对齐。我的建议是在硬件上提供一个同步触发信号让相机曝光时刻和雷达扫描时刻对齐不然融合算法会看到时间错位的目标。5. 常见问题与排查技巧实录5.1 图像整体偏亮或偏暗先查曝光还是增益先看寄存器配置确认曝光时间、模拟增益、数字增益的设置值没有被意外写成0或最大值。然后再检查镜头光圈、外部光源强度和黑电平校准。我遇到过一个情况画面整体偏暗但自动曝光一直不收敛最后发现是因为黑电平寄存器配错了RAW数据的暗电流没有被扣除导致统计出的亮度均值偏高曝光时间被压得过短。把黑电平校准重新跑一遍就正常了。5.2 画面有横条纹或“果冻效应”怎么解决如果在LED灯下拍摄卷帘快门CMOS经常看到明暗交替横条纹。这是因为LED以50Hz或60Hz的工频闪烁而卷帘快门逐行曝光导致条纹。解决办法有三条把曝光时间设置成LED闪烁周期的整数倍、开启传感器的闪烁抑制功能、或者换全局快门传感器。横条纹也可能是电源噪声。传感器模拟电源纹波会在像素输出上叠加周期性干扰这时候用示波器看电源纹波通常需要把开关电源换成LDO或者增加滤波电容。5.3 RAW图上有竖线或亮点是坏点还是暗电流固定位置的亮点或者竖线先看它是否随曝光时间变化。如果曝光时间变长亮点也跟着变亮大概率是暗电流过大或热像素如果无论曝光多长都保持同一数值那就可能是坏点或者列放大器故障。用一张全黑图跑一遍坏点检测脚本能快速生成坏点坐标表。如果坏点数量非常多或者位置不是随机而是整列那就不是简单的坏点校正能解决的得怀疑传感器本身有没有受损。5.4 高速接口信号不稳定怎么排查三个方向阻抗匹配、信号完整性、驱动配置。MIPI、LVDS这类高速串行接口要求PCB差分阻抗控制在100欧姆或90欧姆左右等长误差最好在100mil以内。驱动电流和接收端均衡要匹配太小容易信号塌陷太大容易过冲。排查时用示波器看眼图。如果眼图中间“眼睛”张不开优先排查走线过孔、连接器端子、还有端接电阻是否焊错。5.5 PCIe数据捕获丢帧问题出在哪里高速工业相机通过PCIe直接把数据写入主机内存丢帧多半不是相机的问题而是主机端的DMA缓冲没有及时搬走数据。Linux下可以用多块缓冲区、预分配大页内存配合轮询或中断线程处理。另外别忘了检查PCIe链路是不是运行在预期的速率和通道数上。有时候因为插槽兼容性问题链路会降速到2.0 x1带宽只剩一小截数据自然就溢出了。5.6 搜“CMOS”却跑出主板电池错误这个问题几乎每个新手都会遇到。你搜“cmos battery is bad”、“cmos checksum error”得到的结果全是台式机主板上的CMOS电池没电了。那个CMOS是存储器工艺和存储内容跟图像传感器没关系。如果查图像传感器资料建议统一搜“CMOS image sensor”或者直接看厂商应用笔记会顺畅很多。6. 最后的小结与个人建议在图像传感器这条路上看懂规格书和会搭一套真实采集环境比背参数重要得多。我的建议是找一款容易上手的开发板或现成模组比如树莓派Camera Module、某宝上几十块的全局快门工业模组先把它驱动起来抓一段RAW数据。然后用Python或者C写一个最小信号处理链黑电平校正、坏点替换、去马赛克、白平衡、Gamma。跑通这一遍你对CCD和CMOS的理解会远超看一百篇科普。选型时也别迷信“CCD一定比CMOS好”这句话。现在高端CMOS的噪声和动态范围已经逼近科学级而CCD在高速场合又确实跟不上。先想清楚自己的系统拍什么、在什么光照下工作、功耗体积能承受多少再去看具体款式的datasheet和实测样片。最后分享一个小习惯拿到任何传感器我都会先拍一张全黑图和一张均匀光照图用来快速评估暗电流、坏点和固定模式噪声。这两张图能告诉你传感器的底子干不干净比任何宣传文案都有说服力。