2. 图像亮度度量:从RAW域到YUV域,如何定义一张图像的“亮度”?
做AE算法这些年,我最大的体会是:曝光准不准,首先得知道什么叫“亮”。
你想想看,一张照片,有的地方亮、有的地方暗。我们怎么用一个数字,来描述整张图的亮度?
这个问题,从RAW域到YUV域,答案完全不一样。今天我就带你捋一遍。
2.1 平均亮度:最简单,但最不靠谱
最直观的想法,就是把所有像素的亮度值加起来,除以像素总数。
公式很简单:
L_mean = (1/N) * Σ I(i, j)
其中 I(i, j) 是像素 (i, j) 的亮度值,N 是总像素数。
但我在项目中吃过这个亏。
有一次做手机夜景模式,用平均亮度做AE参考。结果呢?画面里有一盏路灯,占了不到5%的面积,但亮度极高。平均亮度被拉得很高,算法以为场景很亮,自动降低了曝光。结果人脸全黑了。
2.2 中心权重亮度:更符合人眼习惯
人眼看东西,是有“重点”的。我们通常会把注意力放在画面中央。
所以,中心权重亮度就来了。它给画面中心区域更高的权重,边缘区域权重低一些。
常见的权重分布是高斯分布:
W(i, j) = exp( - ((i - i0)² + (j - j0)²) / (2σ²) )
L_weighted = ( Σ W(i, j) * I(i, j) ) / Σ W(i, j)
其中 (i0, j0) 是图像中心,σ 控制权重衰减速度。
我个人习惯用 σ = 0.3 * min(width, height)。这样中心区域大概占画面的30%左右,比较符合人眼视觉。
2.3 直方图亮度:最全面的视角
平均和中心权重,都只给了一个数字。但一张图的亮度分布,其实很复杂。
直方图,就是把所有像素的亮度值,按区间统计出来。横轴是亮度(0~255),纵轴是像素数量。
从直方图里,我们能读出很多信息:
- 左偏:画面偏暗,欠曝
- 右偏:画面偏亮,过曝
- 中间集中:对比度低,灰蒙蒙
- 两边都有峰:高反差场景
基于直方图,我们可以定义多种亮度度量:
| 度量方式 | 计算方法 | 适用场景 |
|---|---|---|
| 中位数亮度 | 直方图累积到50%时的亮度值 | 抗噪能力强,不受极端值影响 |
| 众数亮度 | 直方图峰值对应的亮度值 | 场景主色调明显时好用 |
| 百分比亮度 | 取直方图某个百分位(如90%)的亮度 | 避免高光溢出时参考 |
我一般怎么用?
做AE算法时,我通常取中位数亮度作为主参考,再结合90%分位亮度做防过曝保护。这样既稳定,又安全。
2.4 从RAW域到YUV域:亮度定义完全不同
这里有个关键点,很多人会忽略。
RAW域的亮度,是线性的。 传感器采集的光子数,和像素值成正比。但人眼对亮度的感知,是非线性的。
YUV域的亮度,是经过Gamma校正的。 它更接近人眼的感知特性。
所以,同一个场景,在RAW域和YUV域算出来的“平均亮度”,意义完全不同。
- RAW域做AE:用线性亮度,适合精确控制曝光时间
- YUV域做AE:用Gamma校正后的亮度,适合视觉质量评估
- 我建议:算法内部用RAW域,最终输出前转YUV域做校验
2.5 知识体系总览
下面这张图,是我自己总结的亮度度量知识体系。你看一遍,心里就有谱了。
2.6 实战建议:我到底该用哪个?
说了这么多,你可能有点晕。我直接给你一个决策流程:
- 先看场景:如果是均匀光照(如室内灯光),平均亮度就够了
- 再看主体:如果主体在中央(如人像),用中心权重
- 最后看复杂度:如果场景复杂(如逆光、夜景),必须用直方图
嗯,这里要注意:没有万能的亮度度量。我做过一个项目,白天用平均亮度,晚上自动切换到直方图中位数。效果比单一方法好很多。
好了,关于图像亮度度量,就聊到这儿。记住:选对度量方式,AE算法就成功了一半。
公众号:蓝海资料掘金营,微信deep3321