G_gain = 1.0 # 常作为参考通道
R_gain = G_avg / R_avg
B_gain = G_avg / B_avg
Auto White Balance Gain Control(AWB)自动调整图像中红色、绿色、蓝色通道的增益,使图像中灰白区域的颜色看起来为“中性白”或“灰白”,从而矫正因光源色温导致的色偏。
为什么需要 AWB?
不同光源(如阳光、白炽灯、荧光灯)具有不同色温,直接影响图像颜色;
例如,白炽灯下画面偏黄,荧光灯下偏绿;
AWB 自动估算当前场景的光照类型,并给每个颜色通道加上合适的增益,使图像白平衡自然。
AWB 基本流程
统计图像中各通道平均值(或灰度区域);
估计场景色温或光源偏色;
计算 RGB 增益因子,使图像偏色区域趋于灰白;
应用增益到图像每个通道:
常见算法原理
1. Grey World 假设(经典基础)
假设图像中所有颜色平均后应为灰色(R ≈ G ≈ B)
计算通道均值:
R_avg = np.mean(R)
G_avg = np.mean(G)
B_avg = np.mean(B)
计算增益:
G_gain = 1.0 # 常作为参考通道
R_gain = G_avg / R_avg
B_gain = G_avg / B_avg
代码实现:
def AWB(aaf_img):
"""
inputs:
aaf_img = bayer domain image after anti-aliasing noise filter
outputs:
awb_img = bayer domain image after auto white balance
"""
awb_img = np.copy(aaf_img) # create a copy of the bayer image to apply auto white balance
r = awb_img[::2, ::2] # use array splicing to extract r, gr, gb, and b pixels from the full bayer image
gr = awb_img[::2, 1::2]
gb = awb_img[1::2, ::2]
b = awb_img[1::2, 1::2]
r_ave = np.mean(r) # compute averages of r, g, and b channels
g_ave = (np.mean(gr) + np.mean(gb)) / 2
b_ave = np.mean(b)
r_gain = g_ave / r_ave # compute gains for r, g, and b channels
g_gain = g_ave / g_ave
b_gain = g_ave / b_ave
awb_img[::2, ::2] = r * r_gain # apply gains to r, g, and b channels
awb_img[::2, 1::2] = gr * g_gain
awb_img[1::2, ::2] = gb * g_gain
awb_img[1::2, 1::2] = b * b_gain
return awb_img.astype(np.uint16)
用 G 通道作为参考通道(基准白),用 G 通道的平均值去除以 R 和 B 通道的平均值,是为了计算出让 R、B 看起来和 G 一样“灰” 需要乘上的校正系数(增益)。
为什么选 G 通道当基准?
G 通道在 Bayer 中占比最大(Gr + Gb 一共占 50%);
G 通道通常噪声更低、更稳定;
人眼对绿色更敏感,图像质量也更依赖于绿色;
所以大多数 ISP 里都选 G 通道为基准。