4、卷帘快门伪影(上):果冻效应(Jello Effect)—— 运动物体扭曲、倾斜、缩放变形的数学建模与视觉表现

好,咱们进入卷帘快门伪影的第一部分。说实话,果冻效应是卷帘快门最出名、也最让人头疼的问题。你随便拿手机拍个快速挥动的手臂,画面里手臂就弯了——这就是果冻效应。我当年第一次在高速产线上看到检测图像里的零件被拉成斜的,还以为是镜头坏了,折腾了半天才发现是快门在捣鬼。

4.1 果冻效应的本质:逐行曝光的时间差

先想清楚一件事:全局快门是所有像素同时曝光,同时结束。卷帘快门呢?它是逐行扫描曝光的。第一行开始曝光后,隔了Δt,第二行才开始,第三行再隔Δt……直到最后一行。

这个Δt,就是行间延迟(Row Delay)。

假设传感器有1080行,帧率为30fps,一帧总时间约33.3ms。那么每行之间的延迟大约是:

Row Delay ≈ 33.3ms / 1080 ≈ 30.8μs

你看,每行差了30微秒。如果物体在水平方向快速运动,这30微秒就足以让相邻行捕捉到的物体位置发生偏移。结果就是——本该是直线的边缘,变成了斜线;本该是正方形的物体,变成了平行四边形。

核心公式:

果冻效应导致的像素偏移量 Δx = v × (Row Delay × ΔRow)

其中 v 是物体在图像平面上的运动速度(像素/秒),ΔRow 是行号差。

说白了,行差越大、运动越快,扭曲就越严重。

4.2 三种典型果冻效应变形模式

我在项目里总结过,果冻效应其实就三种基本变形。你掌握了这三种,大部分场景都能快速判断。

变形类型 运动方向 视觉表现 典型场景
倾斜(Skew) 水平运动 垂直线变成斜线,矩形变成平行四边形 传送带上快速通过的零件
缩放(Stretch/Compress) 垂直运动 物体被拉长或压扁 电梯上下运动时拍摄的人脸
扭曲(Wobble) 振动/旋转 物体边缘呈波浪形,像果冻一样抖动 手持拍摄跑步场景

4.3 倾斜变形(Skew)的数学建模

先看最常见的倾斜。物体沿水平方向运动,速度为Vx(像素/秒)。传感器行延迟为Td(秒/行)。

对于第n行,相对于第0行的曝光起始时间差为:

t_n = n × Td

在这段时间内,物体水平位移了:

Δx_n = Vx × t_n = Vx × n × Td

所以,原本垂直的边,在图像上会变成一条斜线。斜率就是:

斜率 = Δx_n / n = Vx × Td

嗯,这里要注意:斜率只取决于运动速度和行延迟,跟物体本身大小无关。也就是说,同样速度下,大物体和小物体的倾斜角度是一样的。

我的经验:在产线检测中,如果传送带速度是500mm/s,镜头分辨率是0.1mm/pixel,行延迟30μs,那么每行偏移就是 500 × 0.1 × 30e-6 = 0.0015像素。看起来很小?但1000行下来,顶部和底部就差了1.5个像素。对于高精度测量,这已经不可接受了。

4.4 缩放变形(Stretch/Compress)的数学建模

物体沿垂直方向运动时,情况更微妙。假设物体以速度Vy向下运动。

卷帘快门是从上往下逐行曝光的。物体也在往下走。结果就是:物体上某一点,被不同行捕捉到的时间不同,但物体本身也在移动——这会导致物体的垂直尺寸被拉长或压缩。

具体来说:

  • 物体向下运动,快门从上往下扫:物体被拉长。因为顶部行先曝光,底部行后曝光,底部行曝光时物体已经往下移动了,所以底部被记录的位置比实际更靠下。
  • 物体向上运动,快门从上往下扫:物体被压缩。顶部行曝光时物体还在下面,底部行曝光时物体已经上来了,结果底部被记录的位置比实际更靠上。

数学上,垂直方向的表观尺寸变化率为:

表观高度 / 实际高度 = 1 + (Vy × Td × (N-1)) / H

其中N是总行数,H是物体实际高度(像素)。

Vy为正(向下)时,比值大于1,拉长;Vy为负(向上)时,比值小于1,压缩。

我曾经踩过的坑:有次做无人机航拍测量,用卷帘快门相机拍地面标定板。无人机下降过程中拍摄,标定板在图像里被拉长了将近3%。我一开始以为是镜头畸变,折腾了半天的标定算法。后来才意识到——是果冻效应的垂直缩放。从那以后,我只要做运动平台上的测量,第一件事就是确认快门类型。

4.5 扭曲变形(Wobble)的成因

扭曲变形其实是倾斜和缩放的组合。当物体不是单纯的水平或垂直运动,而是有旋转或振动时,不同行的偏移方向和大小都在变化。

比如一个风扇叶片在旋转。叶片上不同位置的速度方向和大小都不同。卷帘快门逐行曝光时,每一行捕捉到的叶片位置都不一样——结果就是叶片边缘出现波浪形扭曲。

我习惯用一个简单模型来理解:

对于旋转角速度为ω的物体,第n行的角度偏移为:
Δθ_n = ω × n × Td

这个角度偏移会导致物体上每个点的位置都发生非线性变化。视觉上就是——像果冻一样抖动。

4.6 果冻效应的视觉表现总结

我把常见场景下的果冻效应表现整理成了一张表,方便你快速对照:

拍摄场景 运动类型 果冻效应表现 严重程度
快速摇动手机 水平旋转 垂直线倾斜,建筑像要倒 高
拍摄行驶中的汽车 水平运动 车轮变椭圆,车身倾斜 中高
无人机下降拍摄 垂直运动 地面物体被拉长 中
手持拍摄跑步的人 上下振动 人像上下拉伸,边缘抖动 中
拍摄旋转风扇 旋转 扇叶扭曲成波浪形 极高
慢速平移拍摄风景 低速水平 几乎不可见 低

4.7 果冻效应知识体系图

下面这张图把果冻效应的核心逻辑串起来了。从根本原因到三种变形模式,再到数学建模和视觉表现,你可以用它快速回顾。

果冻效应知识体系图 果冻效应(Jello Effect)知识体系 逐行曝光时间差(Row Delay) 倾斜(Skew) 缩放(Stretch/Compress) 扭曲(Wobble) 水平运动 垂直运动 旋转/振动 Δx = Vx × n × Td 斜率 = Vx × Td H' / H = 1 + (Vy×Td×(N-1))/H 向下运动拉长,向上运动压缩 Δθ_n = ω × n × Td 非线性位置偏移 垂直线变斜线 物体拉长或压扁 边缘波浪形抖动 核心:运动速度 × 行延迟 × 行数差 = 偏移量

4.8 实际项目中的判断方法

你拿到一个卷帘快门相机,怎么快速判断果冻效应会不会影响你的项目?我个人习惯用三步法:

  1. 算行延迟:查传感器手册,找到行扫描时间。或者直接用帧率除以行数估算。
  2. 估运动速度:物体在图像平面上的最大速度是多少?单位是像素/秒。
  3. 算最大偏移:用公式 Δx = Vx × Td × N,看顶部和底部的偏移量是否超过你的公差。

快速估算口诀:

行延迟乘行数,再乘速度得偏移。

偏移超过一个像素,果冻效应就要重视。

举个例子。你做一个PCB板检测,传送带速度200mm/s,镜头分辨率0.05mm/pixel,传感器有1200行,行延迟25μs。

Vx = 200 / 0.05 = 4000 像素/秒
Td = 25μs = 0.000025 秒
N = 1200 行
最大偏移 = 4000 × 0.000025 × 1200 = 120 像素

120个像素!PCB板上的焊盘位置都偏到姥姥家去了。这种情况下,要么换全局快门,要么用机械快门加闪光灯冻结运动。没有别的办法。

好了,果冻效应的数学本质和视觉表现就讲到这里。你理解了这些,后面讲卷帘快门其他伪影的时候,思路会顺很多。