🎨 基于灰度像素检测的自动白平衡(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 方法。
- 其核心在于:通过找出图像中应为灰色却被偏色污染的区域,反推出当前光源的偏移方向,从而计算出增益进行矫正。
- 在嵌入式设备或无校准标定条件下,非常实用。