1. 低光照成像基础:人眼视觉特性、低光照图像退化模型、信噪比与动态范围

各位同学,咱们开始第一讲。做移动端ISP,尤其是低光照增强,你得先搞清楚一个问题:到底什么是“暗”?

这个“暗”不是单纯的光线少,它背后牵扯到人眼怎么看、传感器怎么坏、信号怎么被噪声淹没。我做了这么多年ISP,发现很多工程师一上来就调算法参数,结果效果忽好忽坏——说白了,就是没吃透这三块基础。

1.1 人眼视觉特性:你的目标不是“真实”,而是“舒服”

先聊人眼。你想想看,我们做图像增强,最终是给人看的。所以你得知道人眼在暗光下是怎么工作的。

1.1.1 暗适应与明适应

从亮处走进电影院,一开始什么都看不见,过几分钟慢慢能看清座位——这叫暗适应。反过来,从暗处走到阳光下,瞬间刺眼得睁不开——这叫明适应。

人眼的感光细胞分两种:

  • 视锥细胞:负责明视觉,对颜色敏感,但需要足够的光。
  • 视杆细胞:负责暗视觉,对亮度极其敏感,但几乎不感知颜色。

所以在极暗环境下,人眼看到的其实是“黑白”画面。我见过不少算法在极暗场景下硬拉饱和度,结果颜色偏得离谱——嗯,这其实违背了人眼的生理特性。

实战提示: 低光照增强的目标不是还原“真实颜色”,而是让画面看起来“自然舒服”。在极暗场景(< 1 lux),保留亮度细节比还原颜色更重要。

1.1.2 韦伯-费希纳定律

人眼对亮度的感知不是线性的。公式很简单:

ΔL / L = k

意思是:你能感知到的最小亮度变化(ΔL),和当前背景亮度(L)的比值是常数。换句话说,暗处差一点亮度你就能察觉,亮处差很多你才觉得有变化。

这给ISP设计带来什么启示?

  • 暗区需要更精细的量化步长——所以很多ISP用非线性量化或局部色调映射。
  • 亮区可以粗一点,节省带宽和计算量。

我个人习惯在调试低光照算法时,先画一条人眼亮度感知曲线贴在工位上——时刻提醒自己:别用线性思维去处理非线性问题。

1.2 低光照图像退化模型:信号是怎么“坏”掉的

好,现在从人眼切换到传感器。一张低光照照片,到底经历了什么?

我把它拆成三个环节:

  1. 光子采集:光线通过镜头,打到传感器像素上。
  2. 光电转换:光子被转换成电子,再被读出成电压信号。
  3. 量化输出:模拟信号转数字,变成我们看到的像素值。

每个环节都会引入退化。我画了一张图,帮你理清这个链条:

低光照图像退化模型 场景光照不足 光子通量低 镜头衰减 透光率 < 100% 传感器噪声 读出噪声/暗电流 ISP处理 量化/增益 退化叠加效应: • 低光子数 → 散粒噪声显著(泊松分布) • 模拟增益放大信号的同时也放大噪声 • 量化误差在低信号区占比更大 退化模型数学表达: I_out = G · (I_signal + N_shot + N_read + N_dark) + N_quant 其中 G 为增益,N_shot 为散粒噪声,N_read 为读出噪声,N_dark 为暗电流噪声,N_quant 为量化噪声

从这张图你能看到,低光照下信号本来就弱,经过镜头衰减、传感器噪声、ISP增益放大,信噪比急剧下降。我曾经调试一款手机,在0.5 lux下预览画面全是雪花——后来发现是传感器读出噪声比信号还大,增益一拉,噪声全出来了。

1.3 信噪比与动态范围:两个绕不开的硬指标

做低光照增强,你每天都会跟这两个参数打交道。我建议你把它们刻在脑子里。

1.3.1 信噪比(SNR)

公式很简单:

SNR = 20 * log10(Signal / Noise)   [单位: dB]

信号是你要的,噪声是你不要的。低光照下信号小,噪声不变,SNR自然低。

我整理了一个典型场景的SNR对比:

场景 照度 (lux) 典型SNR (dB) 主观感受
晴天户外 10,000 - 100,000 40 - 50 清晰通透
室内日光灯 100 - 500 30 - 40 可接受
黄昏/路灯 10 - 50 20 - 30 有可见噪点
月光/暗室 0.1 - 1 10 - 20 噪点明显
极暗 < 0.1 < 10 几乎不可用
避坑指南: 我曾经在某个项目里,为了提升SNR盲目增加模拟增益,结果SNR没提多少,反而把暗电流噪声放大了。后来发现,增益不是万能的——它放大信号的同时,也放大了所有噪声分量。正确的做法是先降低读出噪声(硬件优化),再考虑增益策略。

1.3.2 动态范围(DR)

动态范围是传感器能同时记录的最亮和最暗区域的比值:

DR = 20 * log10(满阱容量 / 读出噪声)   [单位: dB]

低光照场景下,动态范围面临两个挑战:

  • 暗部被噪声淹没:信号低于读出噪声,细节丢失。
  • 亮部可能过曝:如果为了暗部拉长曝光时间,亮部就饱和了。

我举个例子:你拍夜景,路灯是亮的,树影是暗的。单帧想同时保留两者?很难。这就是为什么现在手机都做多帧融合——短帧保高光,长帧提暗部,最后合成。

1.4 SNR与DR的权衡:一个实战案例

咱们来看一个真实场景。假设你有一个传感器,满阱容量 30,000 e⁻,读出噪声 5 e⁻。

计算一下:

DR = 20 * log10(30000 / 5) ≈ 75.6 dB

这个数字看起来不错。但在低光照下(比如信号只有 100 e⁻):

SNR = 20 * log10(100 / 5) ≈ 26 dB

只有26 dB,画面噪点已经很明显了。

这时候你怎么办?

  • 方案A:增加增益,SNR提升到30 dB,但DR下降到70 dB。
  • 方案B:多帧合成,SNR提升到32 dB,DR保持75 dB,但需要运动补偿。

我个人倾向于方案B。虽然算法复杂一点,但效果上限更高。我在一个旗舰机项目里就是这么做的——最终暗光SNR提升了6 dB,用户反馈“夜拍终于能看了”。

核心结论: 低光照增强的本质,是在有限的硬件条件下,通过算法手段提升SNR(降噪、融合)和扩展DR(HDR、局部映射)。这两者往往需要权衡,没有银弹。

1.5 本章小结

咱们这一章把基础打牢了:

  • 人眼视觉:暗适应、韦伯定律——告诉你增强的方向。
  • 退化模型:从光子到像素,每一步都在丢信息。
  • SNR与DR:两个硬指标,是衡量算法效果的根本。