5.4.2 视频帧处理:色彩、滤波与几何变换(Color, Filtering & Geometric Transform)

视频帧处理与 5.3 的分析同样互为镜像:5.3 的流水线逐帧读取、逐帧分析,而处理流水线逐帧读取、逐帧改写、逐帧写出。骨架不变,换的只是中间的 "帧函数"。这个帧函数里装的内容,几乎全部来自我们在第二章与第三章学过的知识。

色彩处理:回到 HSV

调整画面观感最常用的操作是改 饱和度(Saturation)亮度(Value)。这两个量我们在 2.5.7 已经学过——它们是 颜色三要素 的直接分量。工程上的做法因此顺理成章:先把帧从 BGR 转到 HSV 空间,对 S、V 通道施加增益并截断到合法范围,再转回 BGR:

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV).astype(np.float32)
hsv[..., 1] = np.clip(hsv[..., 1] * 1.4, 0, 255)   # 饱和度 x1.4
out = cv2.cvtColor(hsv.astype(np.uint8), cv2.COLOR_HSV2BGR)

为什么不在 RGB 空间里做?因为 RGB 三个通道耦合了亮度与色彩——直接对 R/G/B 同乘增益,改的是明度而非饱和度,画面会 "变亮" 而不是 "变艳"。把处理放在与 人类感知对齐的色彩空间 里做,是第二章色彩科学最直接的工程回报。

空域滤波:模糊与锐化是一对

3.2 节 的六种经典空域滤波,在帧处理中是最常用的画面加工手段。其中 高斯模糊(Gaussian Blur,3.2.1 用作柔化降噪;而它的 "反面"——USM 锐化(Unsharp Masking)——则是增强细节的利器:

gsharp=(1+α)gαgblurg_{sharp} = (1 + \alpha) \cdot g - \alpha \cdot g_{blur}

原图减去它的低通(模糊)版本,得到高频细节,再加权加回原图。这与 3.2.3 拉普拉斯滤波提取高频的思想一脉相承——拉普拉斯核本质上就是 "中心减邻域" 的差分,USM 不过是把差分结果用作增强而非检测。practice_6 中 cv2.addWeighted(out, 1 + α, blur, -α, 0) 一行即完成了这个组合。

几何变换(Geometric Transform)

缩放、旋转、平移、透视校正统称几何变换:它们不改变像素的颜色,只改变像素的 位置。数学上是坐标映射 $p' = M \cdot p$,工程上由 cv2.resizecv2.warpAffine / cv2.warpPerspective 实现。需要注意的两个工程细节:插值方式(最近邻快但锯齿、双线性平滑、双三次更精细)与 反向映射(对每个目标像素反查源坐标,避免空洞)。本书不对几何变换展开实战,但批量加水印、画中画、全景拼接等应用都从这里起步。

逐帧处理的实时性预算

把帧函数放进循环之前,还有一笔工程账要算:实时处理的预算。30fps 的视频意味着每帧只有 33.3ms 的处理窗口。practice_6 的实测数据(见 5.4.3)显示,"饱和度 + 高斯模糊 + USM" 的组合在 640×360 分辨率上耗时 1.65ms/帧——预算的 5%。但若分辨率升到 4K(约 23 倍像素量),同一条链就可能逼近甚至突破预算。这就是为什么消费级实时滤镜最终都走向 GPU/专用硬件加速——而理解 CPU 上单帧的成本构成,是优化与选型的前提。

可见,视频帧处理是第二章色彩科学与第三章空域滤波的 "批量执行":色彩在 HSV 里调,细节在模糊与锐化间增减,位置在几何映射中变换,而这一切都要塞进每帧 33 毫秒的预算里。

下一节,我们把音频与视频两条处理链组装成完整的批量处理工程,并用对比图验证每一步的效果。

Copyright © Since 2021 李述博 (Arikan.Li) , All Rights Reserved all right reserved,powered by GitbookLast Updated: 2026-08-25 08:20:30

results matching ""

    No results matching ""