手机影像ISP流程:AWB(1)

2023-10-27

AWB简介

      AWB是Automatic white balance的英文缩写,即自动白平衡。
      要了解AWB我们首先需要了解一下色温,色温是表示光线中包含颜色成分的一个计量单位,偏理论的部分比较枯燥,也不是本文的主要内容,这里就不展开介绍了,感兴趣的同学可以自行百度。通俗一点的来说,它可以用来反应一个光源的色调,当一个光源发出的光色温较低时(比如白炽灯),色调偏暖,颜色上就是偏红、偏黄。当一个光源发出的光色温较高时(比如节能灯),色调偏冷,颜色上就是偏白、偏蓝。
      人眼拥有强大的色彩纠错能力,不管色温怎么变,人眼几乎都能分辨出物体原本的颜色,即自动白平衡。比如说,同一张白纸,不论是放在商场的暖黄灯光下,还是放在室外晴天的阴影下,人眼都知道它是一张白纸。而CMOS传感器没有这种能力,为了真实地反应人眼看到的颜色,就需要进行白平衡校正,即AWB。

AWB算法

灰度世界算法

      如果一张图像的颜色是丰富多彩的,那这幅场景的平均反射就能够抵消色差。这便是灰度世界(gray-world)的假设。灰色世界法历史悠久、效果行之有效,并且至今仍然流行。
      灰度世界算法是一个比较简单并且广泛应用的算法。该算法是基于gray-world 假设提出的。根据灰度世界的假设,一张色彩丰富的图像的(R,G,B) 三个颜色分量的平均值趋于同一个值。灰度世界法通过对图像的三个分量分别求和然后取均值,根据均值调整三个通道的增益,使(R,G,B) 三个颜色分量的平均值相等,即实现 R_avg = G_avg = B_avg。

灰度世界法的代码

      灰度世界的代码十分简洁有效,具体代码如下:

def AWB_GRAY(data):
    R_mean = np.mean(data[::2, ::2])
    B_mean = np.mean(data[1::2, 1::2])
    G_mean = np.mean((data[1::2, ::2] + data[::2, 1::2]) / 2)
    data[::2, ::2] = data[::2, ::2] * G_mean / R_mean
    data[1::2, 1::2] = data[1::2, 1::2] * G_mean / B_mean
    data = np.clip(data, 0, 2 ** 10 - 1)
    return data

      具体的思路就是先分别算出一张图片的R/G/B分量的均值,然后把R、B分量补偿到和G分量均值相等即可。另外,在这里还可以添加一个判断R/G/B分量大小的操作,然后把最大和最小的分量往中间分量补偿,从而更小的影响到整体图像的亮度。但是因为一张raw图,G分量的占比最大,人眼最敏感,所以一般都是把R/B分量往G分量去补偿。

灰度世界法的优点

      灰度世界算法是一个十分经典、且十分简洁有效的算法,可以cover住绝大多数的自然场景。如下图,在实验室灯箱低色温场景下,拍摄标准24色卡图片,在不做AWB的情况下,整体画面偏黄。
AWB_disable
      当添加了灰度世界算法,做了AWB后,图像如下:
AWB_enable
      可以看出,经过灰度世界算法后,整体画面明显从之前的暖黄变成偏白,恢复了物体本来的颜色。

灰度世界法的缺点

      灰度世界法对色彩丰富的场景可以做到十分有效地校正,但是对一些特殊场景,比如说大面积的纯色场景,蓝天、海洋等,此时场景颜色不够丰富,灰度世界法就会发生误判,甚至过度矫正的情况,导致画面偏蓝,颜色惨淡。如下图是灰度世界法处理后的:
在这里插入图片描述
      可以看出,针对蓝天这种大面积纯色场景,灰度世界法还原的并不好。针对这些灰度世界法不适用的特殊场景,后文会讨论到,暂时先略过。

镜面反射法

      镜面反射法又叫做完美反射法,它是基于这样的一种假设:一幅图当中,最亮的点相当于物体有光泽或镜面的点,因为它反射阳光并不吸收阳光,所以这个点最能体现当前光源最真实的颜色。所以镜像发射法就是基于这个最亮的点做参考白点,然后基于这个参考白点去做AWB。

镜面反射法的代码

      镜面反射法的基本思路是找到一幅图像里面最亮的那个点,然后把这个点做白,从而达到整体画面白平衡正常的目的。具体代码如下:

def AWB_white(data):
    R_max = np.max(data[::2, ::2])
    B_max = np.max(data[1::2, 1::2])
    G_max = np.max((data[1::2, ::2] + data[::2, 1::2]) / 2)
    max1 = max(R_max,B_max,G_max)
    data[::2, ::2] = data[::2, ::2] * max1 /  R_max
    data[1::2, 1::2] = data[1::2, 1::2] * max1 / B_max
    data[1::2, ::2] = data[1::2, ::2] * max1 / G_max
    data[::2, 1::2] = data[::2, 1::2] * max1/ G_max
    data = np.clip(data, 0, 2 ** 10 - 1)
    return data

镜面反射法的优点

      镜面反射法的优点是,当图像的颜色比较单一时,镜面反射法是十分有效的。如下图:
在这里插入图片描述
      可以看出,在这种大面积纯色的场景,灰度世界法并不适用。而镜像反射法就能较好地还原场景本来的色彩。

镜面反射法的缺点

      镜面反射法虽然可以较好地还原单一颜色场景的白平衡,但是也有它很大的局限性。首先,当画面色彩较丰富时,镜像反射法的还原效果不如灰度世界法。如下图:
在这里插入图片描述

      其次,因为镜像反射法是以图像中的最亮的点做参考白点,所以当图像里出现过曝的点时(尤其是其中一个通道饱和,其他两个通道还未饱和的时候),此时最亮的点因为芯片满阱容量的限制,最大值被限制住了,所以此时最亮的点并不能很好地反映当前光源下的真实颜色,此时再基于镜面反射法去做白平衡,效果是十分不理想的。如下图:
在这里插入图片描述
      如上图,经过镜面反射法后的图像,整体都偏绿。原因是:R/B通道未饱和,是真实的亮度值;但是G通道已经饱和了,达到了最大值。此时的G通道理论上应该更大才对。补偿的时候,基于这个小的G通道的值计算就会补更多的G(实际上是补更少的R/B,等效于补更多的G),导致画面整体偏绿。

      所以,镜像反射法适用于场景颜色较单一、画面整体亮度不高的场景。

总结

      综上所述,灰度世界法和镜面反射法都有其优点和缺点,实际应用中也是多种算法融合、取舍的过程。主要的流程是先判断目前的环境,再根据目前的环境选择某一种算法或者几种算法结果以不同的比例(即置信度)混合,不同的算法也会去做进一步的限制和改良,从而使结果更加准确。至于具体的做法,下一篇里我们再详细介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手机影像ISP流程:AWB(1) 的相关文章

  • 如何在不在 iPython 笔记本中使用离线模式下的plotly进行绘图?

    我需要使用plotly绘制我的数据 但是这段代码没有给我任何结果 我显示我的数据 但没有任何数字 import plotly graph objs as go from plotly offline import download plot
  • 当鼠标悬停时使用 matplotlib 注释绘图的线条[重复]

    这个问题在这里已经有答案了 我想在鼠标悬停时在绘图上注释不同的线 这里用点进行相同的操作当鼠标悬停在 matplotlib 中的某个点上时可以显示标签吗 https stackoverflow com questions 7908636 p
  • Python2 math.fsum 不准确?

    我正在使用 python2 数学模块来计算 fsum 的总和 据我所知 0 1通常不能存储二进制 据我了解 math fsum 应该以某种方式解决这个问题 import math math fsum 0 0 0 1 0 1 math fsu
  • 如何显示 pymongo.errors.OperationFailure 详细信息?

    写入 MongoDB 时 我在 python 中遇到 pymongo OperationsFailure 除了回溯之外 还有没有办法打印出详细信息或代码属性 另请参阅 http api mongodb org python current
  • Tastypie:GET 的身份验证和 POST 的匿名

    我使用 Django Tastypie 来管理我的用户集合 是否可以允许匿名用户在 API 中发布 在某个端点创建新用户时 并限制经过身份验证的用户仅获取自己的用户 而不是所有用户 感谢您的帮助 我发现最简单的事情就是对我正在使用的身份验证
  • 在Python中绘制像素的最佳方法[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想知道 用 x 和 y 值在 python 中绘制像素的最简单方法是什么 可能最简单的方法是使用PIL http effbot org i
  • 如何有效地找到两个轮廓集之间的所有交点

    我想知道找到两组轮廓线之间所有交点 舍入误差 的最佳方法 哪种方法最好 这是示例 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 500 X Y np
  • 视频的 EXIF 之类的东西

    有没有从视频文件中获取信息的标准方法 对于图像 我们有 EXIF 数据 可用于获取有关图像文件的日期 时间 大小等信息 我想知道视频是否也有这样的东西 用例是 我有很多用数码相机拍摄的视频 我想将它们重命名为更有意义的名称 例如 YYYY
  • 从 FTP 服务器上的 ZIP 存档读取文件,无需下载到本地系统

    我在 FTP 服务器上的目标文件是 ZIP 文件 CSV 位于更远的两个文件夹中 我如何才能使用 BytesIO 让 pandas 读取 csv 而无需下载它 这是我到目前为止所拥有的 ftp FTP FTP SERVER ftp logi
  • 缓存 pandas 数据框的最佳方法?

    昨天 我经历了惨痛的教训 将 pandas 数据帧保存到 csv 以供以后使用是一个坏主意 我有一个包含 130k 条推文的数据框 其中数据框的一行是list的推文 当我将数据保存到 CSV 然后重新加载数据帧时 数据帧的行现在是字符串类型
  • 我可以使用对象(类的实例)作为 Python 中的字典键吗?

    我想使用类实例作为字典键 例如 classinstance class dictionary classinstance hello world Python似乎无法将类作为字典键处理 还是我错了 另外 我可以使用像 classinstan
  • python中matlab find函数的替换

    我正在尝试寻找合适的python函数来替代matlabfind在我的脚本和一些谷歌搜索中我看到np where 大多数时候都能解决目的 但在双重条件的情况下 我有不同的输出 有人可以告诉我这种方法有什么问题以及如何继续吗 示例代码和差异如下
  • 如何在Python中按天对时间序列数据求和? resample.sum() 没有效果

    我是Python新手 如何根据日期求和数据并绘制结果 我有一个 Series 对象 其数据如下 2017 11 03 07 30 00 NaN 2017 11 03 09 18 00 NaN 2017 11 03 10 00 00 NaN
  • 重置Keras模型的所有权重

    我希望能够重置整个 Keras 模型的权重 这样我就不必再次编译它 编译模型目前是我的代码的主要瓶颈 这是我的意思的一个例子 import tensorflow as tf model tf keras Sequential tf kera
  • 在 ubuntu 12.04 上安装 ReviewBoard

    我正在尝试使用 easy install 在 ubuntu 12 04 上安装 ReviewBoard http www reviewboard org docs manual 1 7 admin installation linux ht
  • Python 中 Javascript 的 reduce()、map() 和 filter() 的等价物是什么?

    Python 的等价物是什么 Javascript function wordParts currentPart lastPart return currentPart lastPart word Che mis try console l
  • 使用 Python for PyQt WebEngine 授予对 Cam & Mic 的访问权限

    我正在构建一个从 Python 调用的简单 Web 应用程序 我正在使用下面的代码 加载此页面时 以编程方式授予对摄像头和麦克风的访问权限的最简单方法是什么 我只在网上找到了 C 示例 无法找到在 Python 代码中执行此操作的方法 fr
  • 从线程队列中获取所有项目

    我有一个线程将结果写入队列 在另一个线程 GUI 中 我定期 在 IDLE 事件中 检查队列中是否有结果 如下所示 def queue get all q items while 1 try items append q get nowai
  • 如何在 python setup.py 中 chmod 文件?

    我使用 setup py 创建了一个 python 包安装 我希望它复制文件夹 为临时创建的 did 中的数据文件 问题是我必须使用 sudo 权限调用 setup py 因为它写入 usr local 因此 当我的数据文件复制到 did
  • Python:正则表达式 findall

    我使用 python 正则表达式从给定字符串中提取某些值 这是我的字符串 mystring txt sometext somemore text here some other text course course1 Id Name mar

随机推荐

  • 最小二乘支持向量机”在学习偏微分方程 (PDE) 解方面的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 1 概述 本代码说明了 最小二乘支持向量机 在学习偏微分方程 PDE 解方面的应用 提供了一个示例 并将获得的结果与精确的
  • 云计算基础——基础设施安全

    基础设施安全概述 基础设施安全是云安全运行的基础 保证了计算机和网络的安全连接 基础实施安全包括计算 网络 存储等云计算资源的安全 物理设施 用户的配置和基础实施组件的实现是云计算中所有内容的基本组成部分 在云计算中 基础实施有两个层面 第
  • Python Pandas pandas.read_xml函数方法的使用

    Pandas是基于NumPy 的一种工具 该工具是为了解决数据分析任务而创建的 Pandas 纳入了大量库和一些标准的数据模型 提供了高效地操作大型数据集所需的工具 Pandas提供了大量能使我们快速便捷地处理数据的函数和方法 你很快就会发
  • FPGA—VGA 显示器显示彩条(附代码)

    目录 1 理论 2 实操 2 1 顶层设计 2 1 1 模块框图 2 1 2 代码编写 2 1 3 仿真验证 2 2 时钟生成模块 2 3 VGA时序控制模块 2 3 1 模块框图 2 3 2 波形图绘制 2 3 3 代码编写 2 3 4
  • 基于相关滤波器的追踪(Correlation Filter-based Tracking)原理

    基于相关滤波器的追踪 Correlation Filter based Tracking 原理 基于相关滤波器的追踪算法 典型的算法有KCF DSST STC SAMF等 这些算法的大致框架都是差不多的 介绍 在视频的第一帧给定目标的初始位
  • C++中int和char[]之间的转换

    1 整数转化字符串 sprintf 在头文件 include
  • 自建私人图床方案:使用Cpolar+树洞外链轻松部署超轻量级图床,实现高效图片存储

    文章目录 1 前言 2 树洞外链网站搭建 2 1 树洞外链下载和安装 2 2 树洞外链网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar临时数据隧道 3 2 Cpolar稳定隧道 云端设置 3 3 Cpola
  • 用python 修改websocketpp头文件格式的时候发现python写csv文件时候有多余的双引号

    def transformer row str level int previous row if level 1 row row replace lt elif level 2 row row replace lt elif level
  • linux中脚本监测nginx状态并重启

    首先要确定nginx的安装位置 如果自定义安装则需要自己去找到nginx运行程序所在的位置 下面的编写和执行都是nginx通过源代码编译安装 运行程序所在的位置为 usr local nginx sbin nginx 确定nginx的使用端
  • mmsegmentation 之修改输入通道

    open mmlab有许多非常实用的框架 其中目标检测的话mmdetection确实很实用 但语义分割的话当属mmsegmentation 这篇博客介绍mmsegmentation如何将输入图像通道数修改为单通道 1 默认你自己已经用mms
  • Stable Diffusion核心算法DDPM解析

    DDPM Denoising Diffusion Probabilistic Model 去噪扩散概率模型 本文参考 一个视频看懂扩散模型DDPM原理推导 AI绘画底层模型 哔哩哔哩 bilibili 1 大概原理 从右往左为正向加噪过程
  • 完美数的算法设计(C语言)

    完全数 Perfect number 又称完美数或完备数 是一些特殊的自然数 它所有的真因子 即除了自身以外的约数 的和 即因子函数 恰好等于它本身 如果一个数恰好等于它的因子之和 则称该数为 完全数 寻找完美的数 题目描述 所谓完美的数是
  • 机器学习——卷积神经网络基础

    卷积神经网络 Convolutional Neural Network CNN 卷积神经网络是人工神经网络的一种 是一种前馈神经网络 最早提出时的灵感来源于人类的神经元 通俗来讲 其主要的操作就是 接受输入层的输入信息 通过卷积层 激活层
  • Pinia刷新会丢失数据 应该怎么解决

    Pinia pinia官网 pinia plugin persistedstate pinia plugin persistedstate官网 Pinia 是一个 Vue js 状态管理库 它允许你创建一个全局的 store 和多个模块化的
  • 不同页面参数值传递localStorage

    不同页面参数值传递localStorage 介绍 localStorage 和 sessionStorage 属性允许在浏览器中存储 key value 对的数据 localStorage 用于长久保存整个网站的数据 保存的数据没有过期时间
  • C语言-qsort函数详解

    一 qsort函数是什么 qsort 函数 快速排序的函数 引用stdlib h头文件 参数说明 void qsort void base 要排序的目标数组 size t num 待排序的元素个数 size t width 一个元素的大小
  • Java最小栈

    Java中的栈是一种后进先出 Last In First Out LIFO 的数据结构 它具有如下几个基本操作 将一个元素压入栈中 称为 入栈 push 将栈顶元素弹出 称为 出栈 pop 查看栈顶元素 称为 查看栈顶元素 peek 判断栈
  • Jenkins详细教程

    最近接触了jenkins这个东西 所以花点时间了解了下 它可以在代码上传仓库 如github gitee gitlab 后 在jenkins 一个网站界面 中通过获取代码仓库中最新代码 进行自动化部署 而省去手动打包 上传服务器 部署这一系
  • 多线程实现TCP的服务器,客户端随时收发信息

    1 作业需求 完成TCP的服务器 客户端 上交 服务器 客户端需要做到随时收发 多进程多线程实现 2 实现过程 1 服务器代码 include
  • 手机影像ISP流程:AWB(1)

    目录 AWB简介 AWB算法 灰度世界算法 灰度世界法的代码 灰度世界法的优点 灰度世界法的缺点 镜面反射法 镜面反射法的代码 镜面反射法的优点 镜面反射法的缺点 总结 AWB简介 AWB是Automatic white balance的英