4、卷帘快门伪影:果冻效应、部分曝光、闪烁与频闪

卷帘快门这东西,说白了就是逐行曝光、逐行读出。这个机制本身并不复杂,但带来的伪影却能让你的图像“翻车”。我这些年调试过的 sensor,十有八九的客户投诉都跟这些伪影有关。

咱们一个一个来拆解。

4.1 果冻效应(Jello Effect)

果冻效应,也叫“倾斜效应”。你拿手机拍快速横移的物体,比如飞驰的赛车,拍出来车身是歪的,像果冻一样扭动。这就是卷帘快门的典型特征。

为什么会这样?

因为卷帘快门不是同时曝光所有行。第一行曝光结束开始读出时,最后一行可能才刚刚开始曝光。如果物体在水平方向快速移动,它在每一行曝光时所在的位置都不同。结果就是:本该是垂直的物体,被逐行“错位”拼接,看起来就歪了。

核心公式:

果冻效应倾斜角度 ≈ (物体水平速度 × 帧读出时间) / 物体高度

帧读出时间 = 单行读出时间 × 总行数

我在项目中遇到过最夸张的一次,是客户用我们的 sensor 拍高速运动的乒乓球。球在画面里直接变成了一个倾斜的椭圆。后来我们不得不把 sensor 切换到全局复位模式,才勉强解决。

避坑指南:

我曾经在调试一款 4K sensor 时,发现果冻效应比预期严重很多。查了半天,原来是驱动里把垂直消隐区(VBLANK)设得太大了。帧读出时间被拉长,果冻效应自然更明显。所以,缩短帧读出时间是抑制果冻效应的第一手段。

4.2 部分曝光(Partial Exposure)

部分曝光,也叫“快门阴影”。你拍一张照片,发现上半部分正常,下半部分全黑,或者亮度不均匀。这就是部分曝光。

根本原因:曝光结束信号(比如闪光灯同步信号)来得太早,或者曝光时间设置不当,导致 sensor 只有部分行完成了曝光,其余行被提前复位了。

我举个例子:你设置曝光时间为 10ms,但 sensor 的帧读出时间需要 15ms。那么,当最后一行开始曝光时,第一行可能已经读出完毕并开始下一帧了。如果此时你触发闪光灯,闪光灯只照亮了正在曝光的行,其他行要么没开始,要么已经结束。结果就是画面一半亮一半暗。

场景 表现 常见原因
闪光灯同步 画面一半亮一半暗 闪光灯触发时刻与 sensor 曝光窗口不匹配
LED 补光 画面出现明暗条纹 LED 频率与 sensor 行扫描频率不一致
机械快门配合 画面顶部或底部缺失 机械快门动作时间与电子卷帘快门未对齐

注意:部分曝光在全局快门 sensor 上几乎不会出现。如果你对闪光灯同步有硬性要求,比如工业检测或医疗内窥镜,建议直接上全局快门 sensor。卷帘快门做闪光同步,调试起来非常痛苦。

4.3 闪烁(Flicker)与频闪

闪烁,就是画面亮度周期性变化,肉眼看起来一闪一闪的。频闪更隐蔽,你肉眼可能看不出来,但拍出来的视频在播放时会有明暗条纹滚动。

根源:人造光源(比如 LED 灯、荧光灯)不是持续发光的,而是以一定频率(通常是 50Hz 或 60Hz)在闪烁。当 sensor 的曝光时间或帧率与光源频率不匹配时,就会捕捉到这种闪烁。

你想想看,50Hz 的交流电,灯光每秒亮灭 100 次(因为正负半周各亮一次)。如果你的 sensor 曝光时间不是 10ms 的整数倍,那么每一帧捕捉到的光能量就不一样,亮度就会波动。

4.3.1 闪烁的数学本质

闪烁的强度可以用一个简单的模型来描述:

光源亮度 = A * sin(2π * f * t) + DC

其中 f 是光源频率(100Hz 或 120Hz),DC 是直流分量。sensor 的曝光过程相当于对这段正弦波做积分。如果积分时间(曝光时间)不是光源周期的整数倍,积分结果就会随曝光起始时刻变化。

防闪烁的黄金法则:

  • 曝光时间 = 光源周期的整数倍(50Hz 光源周期 10ms,60Hz 光源周期 8.33ms)
  • 或者帧率 = 光源频率的整数分之一

4.3.2 频闪(滚动条纹)

频闪是闪烁的“空间版”。当光源频率与 sensor 的行扫描频率不匹配时,每一行曝光时捕捉到的光强不同,结果在图像上形成明暗相间的水平条纹。这些条纹还会随着帧率变化而上下滚动。

我记得有一次,客户在室内用我们的摄像头做视频会议,画面里总有一条一条的暗纹在滚动。我一看就知道是频闪。查了一下,客户用的是 50Hz 的 LED 灯,而 sensor 的帧率是 30fps。30fps 的帧周期是 33.33ms,不是 10ms 的整数倍。后来我把帧率改成 25fps(帧周期 40ms,正好是 10ms 的 4 倍),问题就解决了。

实战技巧:

我曾经在调试一款安防摄像头时,发现频闪只在特定亮度下出现。后来发现是自动曝光算法把曝光时间调到了 8ms,正好避开了 50Hz 的整数倍。我加了一个防闪烁滤波器,强制曝光时间锁定在 10ms、20ms、30ms 等档位,频闪就消失了。

4.4 三种伪影的关系与对比

这三种伪影虽然表现不同,但根源都是卷帘快门的“逐行”特性。我画了一张图,帮你理清它们的关系。

卷帘快门伪影关系图 卷帘快门逐行曝光 果冻效应 部分曝光 闪烁 / 频闪 物体快速水平移动 + 帧读出时间过长 → 图像倾斜扭曲 曝光结束信号过早 或曝光时间设置不当 → 画面明暗不均 光源频率与 sensor 帧率/行频不匹配 → 亮度波动/滚动条纹 缩短帧读出时间 或使用全局快门 对齐闪光灯同步信号 或使用全局快门 曝光时间锁定为 光源周期的整数倍

4.5 实战中的权衡

在实际项目中,这三种伪影往往同时存在,而且解决方案可能互相冲突。比如:

  • 缩短帧读出时间可以减轻果冻效应,但可能会让闪烁更明显(因为曝光时间选择更少了)。
  • 锁定曝光时间为光源周期整数倍可以消除闪烁,但可能会限制帧率,导致果冻效应加重。
  • 使用全局快门可以同时解决果冻效应和部分曝光,但全局快门 sensor 的噪声和动态范围通常不如卷帘快门。

我的建议:不要试图用一个方案解决所有问题。先明确你的应用场景最不能容忍哪种伪影。比如:

  • 运动拍摄 → 优先解决果冻效应
  • 室内视频会议 → 优先解决闪烁/频闪
  • 闪光灯拍照 → 优先解决部分曝光

然后针对性地做优化。剩下的伪影,只要不影响用户体验,可以适当容忍。

嗯,卷帘快门的伪影就讲到这里。这些坑我基本都踩过,希望你能少走弯路。