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 filteroutputs: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 balancer = awb_img[::2, ::2] # use array splicing to extract r, gr, gb, and b pixels from the full bayer imagegr = 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 channelsg_ave = (np.mean(gr) + np.mean(gb)) / 2b_ave = np.mean(b)r_gain = g_ave / r_ave # compute gains for r, g, and b channelsg_gain = g_ave / g_aveb_gain = g_ave / b_aveawb_img[::2, ::2] = r * r_gain # apply gains to r, g, and b channelsawb_img[::2, 1::2] = gr * g_gainawb_img[1::2, ::2] = gb * g_gainawb_img[1::2, 1::2] = b * b_gainreturn awb_img.astype(np.uint16)
用 G 通道作為參考通道(基準白),用 G 通道的平均值去除以 R 和 B 通道的平均值,是為了計算出讓 R、B 看起來和 G 一樣“灰” 需要乘上的校正系數(增益)。
為什么選 G 通道當基準?
-
G 通道在 Bayer 中占比最大(Gr + Gb 一共占 50%);
-
G 通道通常噪聲更低、更穩定;
-
?人眼對綠色更敏感,圖像質量也更依賴于綠色;
-
?所以大多數 ISP 里都選 G 通道為基準。