2. 多曝光融合基础:多帧对齐技术、权重图设计、鬼影消除策略
多曝光融合,说白了就是把几张不同亮度的照片合成一张。你拍过HDR吧?相机咔咔咔连拍三张,暗的、正常的、亮的。但问题来了——手会抖,场景会动。直接叠上去,画面就糊了,还会出现半透明的鬼影。
我刚开始做HDR时,觉得融合不就是加权平均嘛。后来被项目里的运动物体狠狠教育了一回。嗯,今天我们就来拆解这三个核心问题:怎么对齐、怎么给权重、怎么干掉鬼影。
2.1 多帧对齐技术
对齐是融合的第一步。两张图没对齐,后面再好的权重设计都是白搭。我个人习惯把对齐方法分成两类:全局对齐和局部对齐。
2.1.1 全局对齐:仿射变换与单应性矩阵
如果只是相机平移或旋转,用仿射变换就够了。三参数(平移x、平移y、旋转角)就能搞定。我一般用OpenCV的estimateAffinePartial2D,速度快,适合实时预览。
// 全局对齐示例(C++ / OpenCV)
cv::Mat ref, cur;
cv::Mat warp_matrix = cv::Mat::eye(2, 3, CV_32F);
cv::estimateAffinePartial2D(cur, ref, warp_matrix);
cv::warpAffine(cur, aligned, warp_matrix, ref.size());
如果场景有透视变化(比如你从不同角度拍的),就得用单应性矩阵了。8个自由度,能处理更复杂的变形。但要注意——单应性矩阵对噪声敏感,特征点匹配错了,结果比不齐还糟糕。
2.1.2 局部对齐:光流法与块匹配
全局对齐搞不定运动物体。比如一个人从画面左边走到右边,你不能用同一个变换把整张图都扭了。这时候需要局部对齐。
我推荐稠密光流(Farneback算法或深度学习光流)。每个像素都有自己的运动向量,精度高,但计算量大。另一种是块匹配,把图像分成8×8或16×16的块,每个块独立找偏移。速度快,适合移动端。
| 对齐方法 | 适用场景 | 计算量 | 精度 |
|---|---|---|---|
| 仿射变换 | 手持轻微抖动 | 低 | 中 |
| 单应性矩阵 | 视角变化 | 中 | 高(特征点好时) |
| 稠密光流 | 运动物体、复杂场景 | 高 | 高 |
| 块匹配 | 实时预览、移动端 | 低 | 中 |
2.2 权重图设计
对齐完了,该给每张图分配权重了。权重图决定了最终融合结果里,哪张图的贡献更大。你想想看,如果三张图权重一样,那跟直接平均有啥区别?
我一般用三个维度来设计权重:曝光质量、对比度、饱和度。
2.2.1 曝光质量权重
曝光太暗或太亮的区域,细节都丢了,应该给低权重。理想曝光区间是像素值在[0.1, 0.9]之间(归一化后)。我用高斯函数来建模:
// 曝光质量权重计算
float exposure_weight(float pixel, float mu, float sigma) {
return exp(-0.5 * pow((pixel - mu) / sigma, 2));
}
// 通常 mu=0.5, sigma=0.2
2.2.2 对比度权重
对比度高的区域,纹理丰富,人眼更敏感。我习惯用拉普拉斯滤波器的响应值作为对比度指标。响应越大,权重越高。
2.2.3 饱和度权重
饱和度高的颜色更鲜艳,看起来更舒服。但要注意,饱和度权重不能太高,否则容易产生色彩失真。我通常把饱和度权重的上限控制在0.3以内。
最终权重是三个维度的乘积:
W_total = W_exposure * W_contrast * W_saturation
然后归一化,确保所有帧的权重和为1。
2.3 鬼影消除策略
鬼影是HDR融合里最头疼的问题。你拍了一张长曝光和一张短曝光,中间有人走过。融合后,这个人会出现在两个位置——一个实影,一个半透明的虚影,看着像鬼一样。
我处理鬼影的思路分三步:检测、标记、替换。
2.3.1 鬼影检测
最直接的方法是用帧差法。对齐后的两帧相减,差值大的区域就是运动区域。但阈值怎么设?设小了把噪声当鬼影,设大了漏检。
我后来改用中值阈值偏差法(MTB)。先计算每帧的中值亮度,然后生成二值图像。运动区域的二值图会不一致,通过异或操作就能检测出来。这个方法对光照变化不敏感,鲁棒性很好。
2.3.2 鬼影标记与掩膜生成
检测到运动区域后,生成一个二值掩膜。运动区域标记为0(不使用该帧),静止区域标记为1(正常融合)。
但直接硬切换会有边界锯齿。我习惯对掩膜做高斯模糊,让过渡区域平滑渐变。模糊半径一般取5~10个像素。
2.3.3 多帧投票与一致性检查
三帧以上的情况,我推荐用一致性检查。对每个像素位置,计算所有帧的亮度中值。如果某帧的亮度偏离中值超过阈值(比如3个标准差),就标记为鬼影区域。
这个方法的好处是:不需要显式检测运动物体,只要统计分布就能自动排除异常帧。我在项目中用过,效果很稳定。
2.4 本章知识体系
下面这张图总结了多曝光融合的完整流程。你可以看到,对齐、权重、鬼影消除是三个并行的预处理步骤,最终在融合阶段汇合。
2.5 实践建议
最后,我总结几条实战经验,供你参考:
- 先对齐,再融合。别偷懒跳过对齐步骤。我见过不少项目,鬼影问题其实是对齐不准导致的,不是真正的运动鬼影。
- 权重图要平滑。硬边界的权重图会产生融合伪影。记得对权重图做高斯模糊,半径至少5像素。
- 鬼影检测的阈值要自适应。固定阈值在暗光场景下会失效。我习惯用中值偏差(MAD)来动态计算阈值。
- 多帧投票比单帧检测更可靠。如果有4帧以上,用中值或众数投票,能自动排除大部分异常。
多曝光融合是HDR的基石。对齐、权重、鬼影消除,这三个环节环环相扣。任何一个环节出问题,最终结果都会大打折扣。嗯,掌握了这些,你就可以开始搭建自己的HDR融合管线了。