ISP Pipeline(5): Auto White Balance Gain Control (AWB) 自动白平衡

发布于:2025-06-27 ⋅ 阅读:(17) ⋅ 点赞:(0)
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 基本流程

  1. 统计图像中各通道平均值(或灰度区域);

  2. 估计场景色温或光源偏色

  3. 计算 RGB 增益因子,使图像偏色区域趋于灰白;

  4. 应用增益到图像每个通道

 

常见算法原理

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 通道为基准。


网站公告

今日签到

点亮在社区的每一天
去签到