【ISP】AWB的基本原理介绍(基于灰度像素检测)

发布于:2025-04-16 ⋅ 阅读:(21) ⋅ 点赞:(0)

🎨 基于灰度像素检测的自动白平衡(AWB)算法原理与实现

在图像处理中,自动白平衡(AWB, Auto White Balance)是调整图像色温、还原真实色彩的关键算法之一。本文介绍一种经典实用的 AWB 方法 —— 基于灰度像素检测(Gray Pixel Detection) 的算法原理,并附带经典论文及推导公式,适合工程实现与理论学习。


📷 为什么需要自动白平衡?

不同光源(如日光、白炽灯、荧光灯)具有不同的色温,会导致图像整体偏黄、偏蓝或偏绿。AWB 的目标是估计当前光源颜色,然后对图像进行反色偏处理,使图像中原本的“白色或灰色区域”真正呈现为中性灰。


🧠 灰度像素法(Gray Pixel Method)原理

✨ 核心假设

在真实场景中存在大量原本应呈现为灰色的像素,这些像素满足 R ≈ G ≈ B,但由于光照偏色导致它们的 RGB 通道出现不等。通过检测这些“灰度像素”的偏差,可推测当前光源色彩。


🧪 算法步骤

1️⃣ 灰度像素检测

选出图中满足如下条件的像素作为灰度像素候选:

|R - G| < T1 and |R - B| < T2 and |G - B| < T3

其中 T1~T3 是经验阈值,常设为 10 或更小,用于捕捉 R/G/B 差异较小的像素。


2️⃣ 统计灰度像素均值

对这些“灰点”分别计算 R、G、B 通道的平均值:

mean_R = average(R)
mean_G = average(G)
mean_B = average(B)

这些值反映了灰度像素在当前光源下的实际观测颜色。


3️⃣ 设置目标灰值

假设我们希望灰度像素修正后呈现为标准灰色 [ref, ref, ref]。我们可以选定 ref = mean_G 或固定为某个值(如 128 或 255)。


4️⃣ 计算增益值(Gain)

为了将图像矫正为中性色,我们对每个通道计算增益:

gain_R = ref / mean_R
gain_G = ref / mean_G
gain_B = ref / mean_B

通常以绿色通道为基准(gain_G = 1.0),计算相对增益。


5️⃣ 应用增益,矫正图像

对图像中的每个像素 (R, G, B) 应用增益:

R' = R * gain_R
G' = G * gain_G
B' = B * gain_B

最后 clip 到 [0, 255] 范围。


✅ 示例计算

假设从灰度点中得到:

mean_R = 180, mean_G = 160, mean_B = 140

目标灰值设为 ref = 160,则:

gain_R = 160 / 180 ≈ 0.89  
gain_G = 160 / 160 = 1.00  
gain_B = 160 / 140 ≈ 1.14

图像整体使用这组增益进行颜色校正,即可矫正偏色。


📚 相关论文与文献支持

论文标题 作者 贡献
Gray Pixel: An Effective Statistical Method for Illumination Estimation Kao et al. (CVPR 2016) 提出直接在图像中寻找灰度像素,用于估计光源色彩
On Finding Gray Pixels Qian et al. (CVPR 2019) 引入灰度指数(GI),提升灰像素检测精度
Revisiting Gray Pixel Qian et al. (VISAPP 2019) 结合均值漂移聚类(MSGP)提升鲁棒性

这类方法在真实场景中比 Gray World、White Patch 更稳定,特别是在复杂光照或物体颜色丰富的场景中。


⚙️ 代码实现(Python + OpenCV 简化版)

import cv2
import numpy as np

def gray_pixel_awb(img):
    img = img.astype(np.float32)
    R, G, B = img[:,:,2], img[:,:,1], img[:,:,0]

    mask = (np.abs(R - G) < 10) & (np.abs(R - B) < 10) & (np.abs(G - B) < 10)
    
    mean_R = np.mean(R[mask])
    mean_G = np.mean(G[mask])
    mean_B = np.mean(B[mask])

    ref = mean_G
    gain_R = ref / mean_R
    gain_G = 1.0
    gain_B = ref / mean_B

    R = np.clip(R * gain_R, 0, 255)
    G = np.clip(G * gain_G, 0, 255)
    B = np.clip(B * gain_B, 0, 255)

    out = cv2.merge((B, G, R)).astype(np.uint8)
    return out

🧩 总结

  • 灰度像素法是一种统计学上鲁棒、无需训练的 AWB 方法。
  • 其核心在于:通过找出图像中应为灰色却被偏色污染的区域,反推出当前光源的偏移方向,从而计算出增益进行矫正。
  • 在嵌入式设备或无校准标定条件下,非常实用。

网站公告

今日签到

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