当前位置: 首页 > java >正文

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

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

http://www.xdnf.cn/news/14652.html

相关文章:

  • 教程 | 一键批量下载 Dify「Markdown 转 Docx」生成的 Word 文件(附源码)
  • 【AI News | 20250626】每日AI进展
  • 兰洋科技上合组织论坛发表专题分享,全球液冷布局引领绿色算力未来
  • QNX 编译框架梳理(草稿 10%)
  • (LeetCode 面试经典 150 题 ) 55. 跳跃游戏 (贪心)
  • 279. 完全平方数
  • 开发语言漫谈-R语言
  • 【全志V821_FoxPi】3-2 Linux 5.4 SPI + XPT2046触摸(ADS7846) + tslib
  • 如何进行 iOS App 混淆加固?IPA 加壳与资源保护实战流程
  • Rust——什么是高滑点交易,以及在DashMap` 中怎么快速筛选它
  • RS485 vs CAN总线:工业通信双雄的深度对决
  • 云原生灰度方案对比:服务网格灰度(Istio ) 与 K8s Ingress 灰度(Nginx Ingress )
  • Redis—持久化
  • 【Redis】Redis的下载安装和配置
  • 221. 最大正方形
  • SpringCloud系列(37)--搭建SpringCloud Gateway
  • MySQL为什么默认引擎是InnoDB?
  • 深度学习入门--(二)感知机
  • 微信小程序中scss、ts、wxml
  • DEAPDataset的EEG脑电图数据(Emotion_Prediction)使用介绍【第一期】
  • 【请关注】实操mongodb集群部署
  • APISIX
  • 鸿蒙Next仓颉开发语言中的数据类型总结分享
  • Spring 容器核心扩展实战:Spring Boot中三大扩展问题解析
  • sql格式化自动识别SQL语法结构
  • 大塘至浦北高速:解锁分布式光伏“交能融合”密码,引领绿色交通革命
  • 掌握CIS基准合规性:通过自动化简化网络安全
  • 磐维数据库PanWeiDB V2.0-S3.1.1_B01集中式一主二备安装
  • 细谈QT信号与槽机制
  • 覆盖迁移工具选型、增量同步策略与数据一致性校验