3、曝光控制策略:自动曝光算法、多帧融合曝光、高动态范围(HDR)成像
曝光控制,说白了就是决定「让多少光进来」的问题。在低光照环境下,这个决策直接决定了你拍到的是一团漆黑,还是满屏噪点,又或者是一张勉强能看的图。我做了这么多年图像处理,踩过最深的坑就是——以为曝光只是调个亮度那么简单。
今天咱们就聊聊三种主流的曝光控制策略。它们各有各的脾气,也各有各的用武之地。
3.1 自动曝光算法:让相机自己「看情况」
自动曝光(AE)是相机最基础的功能。它的目标很简单:让画面亮度落在一个「合理」的范围内。但这个「合理」怎么定义?嗯,这里就有讲究了。
最常见的做法是基于直方图的AE算法。相机先拍一帧预览图,然后统计像素的亮度分布。如果直方图整体偏左(太暗),就增加曝光时间或增益;如果偏右(太亮),就减少。
我在项目中遇到过一个问题:在极暗场景下,直方图几乎全挤在最左边,算法会拼命拉高增益,结果画面噪点爆炸。后来我加了一个信噪比约束——当增益超过某个阈值时,优先增加曝光时间,而不是继续拉增益。
下面是一个简化的自动曝光算法流程,我用伪代码写一下:
// 自动曝光算法(简化版)
float targetBrightness = 0.4; // 目标平均亮度(归一化)
float currentBrightness = getAverageBrightness(frame);
if (currentBrightness < targetBrightness * 0.8) {
// 太暗了
if (gain < maxGain) {
gain += stepGain;
} else {
exposureTime += stepTime;
}
} else if (currentBrightness > targetBrightness * 1.2) {
// 太亮了
if (exposureTime > minTime) {
exposureTime -= stepTime;
} else {
gain -= stepGain;
}
}
你可能会问:为什么不用更复杂的算法?其实在嵌入式设备上,计算资源有限,这种简单的PID控制反而最稳定。我曾经试过用神经网络做AE,结果在低端芯片上跑一帧要几十毫秒,根本没法用。
3.2 多帧融合曝光:用时间换质量
单帧的曝光能力是有限的。曝光时间太长,手抖就糊了;增益太高,噪点就炸了。那怎么办?多拍几帧,然后融合起来。
多帧融合曝光的基本思路是:连续拍摄多张短曝光图像,然后通过对齐、去噪、融合,得到一张信噪比更高的图像。说白了,就是用多张「烂图」拼出一张「好图」。
我个人的习惯是,在低光照环境下,先拍3-5帧短曝光(比如1/30秒),然后做以下处理:
- 图像对齐:用光流或特征点匹配,消除手抖造成的偏移
- 时域去噪:对对齐后的像素做均值或中值滤波,大幅降低随机噪声
- 融合增强:用加权平均或金字塔融合,保留细节
这里有个关键点:对齐的精度直接决定融合效果。如果对齐不准,融合后会出现重影,比单帧还难看。我在做手机夜景模式时,就吃过这个亏——用户稍微动一下,拍出来的照片就有「鬼影」。
下面是一个简单的多帧融合流程示意图:
3.3 高动态范围(HDR)成像:让亮部和暗部都看得清
HDR这个词你可能听得耳朵都起茧了。但说实话,很多所谓的HDR只是简单地把暗部提亮、亮部压暗,结果画面看起来又假又平。
真正的HDR,核心是扩展动态范围。什么意思?就是让相机能同时记录下场景中最亮和最暗的部分。普通相机可能只能记录0-255的亮度范围,而HDR可以记录0-1024甚至更宽的范围。
实现HDR最经典的方法是多曝光融合:
- 拍一张欠曝的(保留亮部细节)
- 拍一张正常曝光的
- 拍一张过曝的(保留暗部细节)
- 把这三张融合成一张
但这里有个坑:三张图之间的曝光比怎么定?我个人的经验是,曝光比在2-4倍之间比较合适。比如正常曝光是1/30秒,欠曝就设1/60秒,过曝设1/15秒。如果曝光比太大,融合时会出现明显的亮度断层。
下面是一个HDR融合的权重计算示例:
// HDR融合权重计算(简化版)
float weight(float pixelValue, float exposureTime) {
// 基于像素值和曝光时间计算权重
float normalized = pixelValue / (exposureTime * 255.0);
// 中间亮度区域权重高,两端权重低
if (normalized > 0.1 && normalized < 0.9) {
return 1.0;
} else if (normalized < 0.05 || normalized > 0.95) {
return 0.1; // 接近饱和或太暗,权重降低
} else {
return 0.5;
}
}
你想想看,为什么手机HDR模式拍出来的照片有时候看起来很「假」?就是因为权重分配太粗暴,导致亮部和暗部的过渡区域出现了不自然的「光晕」。我早期做HDR时也犯过这个错,后来改用拉普拉斯金字塔融合,效果才好了很多。
3.4 三种策略怎么选?
说了这么多,到底什么时候用哪种?我整理了一个简单的对照表:
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 静态场景、极暗光 | 多帧融合曝光 | 用时间换信噪比,效果最好 |
| 动态场景、暗光 | 自动曝光 + 适当增益 | 多帧融合会糊,单帧更靠谱 |
| 高对比度场景(逆光、夜景) | HDR成像 | 扩展动态范围,亮暗兼顾 |
| 普通室内、光线均匀 | 自动曝光 | 简单够用,省电省算力 |
最后说一句:没有万能的曝光策略。我见过很多团队花大量精力调一个「万能」算法,结果在某个场景下翻车。我的建议是:根据你的目标场景,选1-2种策略做深度优化,比什么都想做好得多。