白平衡

白平衡并不是数码摄影特有的东西,胶片也有白平衡,只不过胶片的白平衡是预设的,如钨丝灯型胶卷在钨丝灯光源的照射下拍出的照片就可以有正确的白平衡。换句话说,在胶片时代,摄影师根据光源的不同而选择不同的胶片就是在“调节”白平衡了。但数码技术允许我们后期几乎不受限制地的白平衡,无疑它要灵活得多,给摄影师提供了更多的创作手段。 白平衡的本质是让白色的物体在任何颜色的光源下都显示为白色。这一点对人眼来说很容易办到,因为人眼有自适应的能力,只要光源的色彩不超出一定的限度,就可以自动还原白色。但相机就不同了,无论是图像传感器还是胶卷都会记录光源的颜色,白色的物体就会带上光源的颜色,白平衡所要做的就是把这个偏色去掉。 自动白平衡是一个很复杂的问题,目前还没有一个万能的方法可以解决所有场景的白平衡问题。有些统计数据表明大部分场景的颜色平均值是中性的,即没有颜色【见注一】。一种自动白平衡算法就是依据这个统计数据设计的,它计算出图像颜色的均值,再算出均值和同等亮度的中性灰的差别,这个差别就是偏色值,对每个像素的颜色值用这个偏色值校正就得到正确的自动白平衡了。网上有一个开源的RAW处理软件——dcraw——就是用这种方法自动校正白平衡的(要知道dcraw有多牛,你只要知道早期很多商业软件、包括Adobe Camera Raw都是基于它的源代码的就够了)。 自动白平衡的问题是有时会给出同拍摄者希望相反的结果,比如拍摄一个金色阳光的早晨的场景,自动白平衡可能会算出光线偏红黄而减少照片中的红黄,结果我们美丽的朝阳变成了苍白的阴天。同样,如果一个场景中某种颜色占了很大的比重,如大面积的緑树,相机的自动白平衡算法也有可能被糊弄从而产生不可预知的结果。 问题的根本是我们有时候想保留光源的色彩(如日落、日出),有时候则想去掉光源的色彩,再牛的软件也不知道拍摄者的意图是什么,因此所有的数码单反都允许用户预设白平衡光源,如晴天、多云、日光灯等,拍摄者只要根据不同的光源预设不同的白平衡值就可以得到很好的色彩还原了。对于户外的风光摄影,很多人都喜欢偏暖的色调。胶片时代的摄影师通常用一些暖色的滤镜(如红、黄滤镜等)来解决这个问题,在数码时代有些摄影师则建议把白平衡一直设置在多云上,实际上我的很多风光片都是这么设置的。 预设白平衡可以较好地还原色彩,可以满足我们的大多数要求。我们有时候希望更准确的色彩还原,不同厂商的预设白平衡也可能并不相同,,这时候就需要手动调整白平衡了。手动调整白平衡的原理很简单,我们只要告诉相机或图像处理软件图片中的某个物体是中性的就可以了,软件会根据实际拍摄的物体的颜色值自动地计算出光源的颜色,进而调整整个画面的色彩。一种常见的手动调整白平衡方法是在拍摄的场景中放置一块白卡或灰卡,后期告诉软件它是中性的。 有人可能会问,我们应该用白卡还是灰卡?理论上两者都可以,只要白卡是真正的中性色,灰卡是真正的中性灰。实际使用时,很多市面上的灰卡(如柯达灰卡)并不是中性灰的,这是因为这些灰卡是给测光用的,只要保证它们反射18%的入射光就行了,而不用考虑它们是否是真正的中性灰。目前市面上有售专门为数码白平衡设计的白卡,它们是真正的中性的,如果需要的话,是个不错的选择。我推荐使用白卡手动调整白平衡的另外一个理由是白色的曝光值高(假设拍摄者能正确地曝光),曝光值高的像素有更好的信号和噪声的比例,因而得到的感光数据能更好地用来测试白平衡。 说到这里,是不是我们解决了所有的白平衡问题? Not so fast!最后我要提一下的是白板法仅适用于光照均匀的情形。设想一下,一位拍摄者站在阴影底下拍摄一座阳光照射的大山,这时白板法显然不行,因为拍摄者和拍摄物所处的光源不一样。在这种情况下,没有什么好的机械的手动白平衡调整方法,只有靠记忆后期调整光源的色温了。 【注一】在色彩科学里,中性色是指没有其它颜色,而只有灰色、白色或黑色的颜色。在计算机里面,红(R)、绿(G)、蓝(B)三个值相等就是中性色,白色的(R,G,B)是(255,255,255),是一种中性色;黑色是(0,0,0),也是一种中性色。 不幸的是,我们常常看到中性灰的提法,似乎白和黑不是中性色,这是不对的。

再附上两种处理原代码:
先是VC的
 BYTE RGB[3]   =   {0},   YCbCr[3]   =   {0};
DOUBLE dbHSV[3]   =   {0},   dbStdRGB[3]   =   {0},   dbStdYCbCr[3]   =   {0};
PWBRESULTTYPE   pResult   =   &(pResultInfo->WBResult);
DWORD dwBlockSize   =   pResultInfo->Setting.dwBlockSize;
DWORD dwPicture   =   pResultInfo->DocInfo.BmpInfo.bmiHeader.biWidth;
DWORD dwDataSize   =   GETPICTUREWIDTH(dwPicture);
DWORD dwHeight   =   pResultInfo->DocInfo.BmpInfo.bmiHeader.biHeight;
CRect       rect;
rect.top   =   pResultInfo->Setting.ptArray.x;
rect.left   =   pResultInfo->Setting.ptArray.x;
rect.bottom   =   rect.top   +   dwBlockSize;
rect.right   =   rect.left   +   dwBlockSize;
//   calcult   mean   RGB   and   standard   RGB
CalculateRGB(pResultInfo->DocInfo.BmpInfo,   pResultInfo->DocInfo.lpFileData,   rect,   RGB);
pResult->Blue   =   RGB[2];
pResult->Green   =   RGB[1];
pResult->Red   =   RGB[0];
//   calculate   YCbCr   and   standard   luminance
CalculateYCbCr(pResultInfo->DocInfo.BmpInfo,   pResultInfo->DocInfo.lpFileData,   rect,   YCbCr);
pResult->Luminance   =   YCbCr[0];
pResult->dbRG   =   (RGB[0]*1.0)/RGB[1];
pResult->dbGG   =   1;
pResult->dbBG   =   (RGB[2]*1.0)/RGB[1];
再是VB的。
Public   Function   AutoColorPoise(mBitmap   As   cDIB,   AutoInfo   As   Label)   As   Boolean
Dim   i   As   Long,   j   As   Long
Dim   JumpLines   As   Long,   JumpBits   As   Long,   StepLines   As   Long,   StepBits   As   Long
Dim   MeanColor(0   To   2)   As   Single,   SumColor(0   To   2)   As   Long,   Bits   As   Long,   GreyColor   As   Long
Dim   RedTable(0   To   255)   As   Long,   GreenTable(0   To   255)   As   Long,   BlueTable(0   To   255)   As   Long
Dim   RedValue   As   Long,   GreenValue   As   Long,   BlueValue   As   Long
Dim   dWidth   As   Long,   dHeight   As   Long,   Scanline   As   Long,   SizeImage   As   Long
Dim   dPtr   As   Long
dWidth   =   mBitmap.mWidth   -   1:   dHeight   =   mBitmap.mHeight   -   1
SizeImage   =   mBitmap.SizeImage
Scanline   =   mBitmap.Scanline
dPtr   =   mBitmap.ImagePtr
JumpLines   =   Int(dHeight   /   1500)   *   Scanline
StepLines   =   Int(dHeight   /   1500)   +   1
JumpBits   =   Int(dWidth   /   1500)   *   4   +   4
StepBits   =   Int(dWidth   /   1500)   +   1
p4Byte0Ptr(0)   =   dPtr
For   i   =   0   To   dHeight   Step   StepLines
For   j   =   0   To   dWidth   Step   StepBits
SumColor(0)   =   SumColor(0)   +   p4Byte0(0)
SumColor(1)   =   SumColor(1)   +   p4Byte0(1)
SumColor(2)   =   SumColor(2)   +   p4Byte0(2)
Bits   =   Bits   +   1
p4Byte0Ptr(0)   =   p4Byte0Ptr(0)   +   JumpBits
Next   j
p4Byte0Ptr(0)   =   p4Byte0Ptr(0)   +   JumpLines
Next   i
MeanColor(0)   =   SumColor(0)   /   Bits
MeanColor(1)   =   SumColor(1)   /   Bits
MeanColor(2)   =   SumColor(2)   /   Bits
GreyColor   =   (MeanColor(0)   *   11   +   MeanColor(1)   *   59   +   MeanColor(2)   *   30)   /   100
BlueValue   =   GreyColor   -   MeanColor(0)
GreenValue   =   GreyColor   -   MeanColor(1)
RedValue   =   GreyColor   -   MeanColor(2)
AutoInfo.Caption   =   "红色:"   &   CStr(RedValue)   &   "   |   绿色:"   &   CStr(GreenValue)   &   "   |   蓝色:"   &   CStr(BlueValue)
For   i   =   0   To   255
RedTable(i)   =   i   +   RedValue
If   RedTable(i)   >   &HFF   Then   RedTable(i)   =   &HFF
If   RedTable(i)   <   &H0   Then   RedTable(i)   =   &H0
GreenTable(i)   =   i   +   GreenValue
If   GreenTable(i)   >   &HFF   Then   GreenTable(i)   =   &HFF
If   GreenTable(i)   <   &H0   Then   GreenTable(i)   =   &H0
BlueTable(i)   =   i   +   BlueValue
If   BlueTable(i)   >   &HFF   Then   BlueTable(i)   =   &HFF
If   BlueTable(i)   <   &H0   Then   BlueTable(i)   =   &H0
Next   i
p4Byte0Ptr(0)   =   dPtr
FrmMain.AutoPBar.Max   =   dHeight
For   i   =   0   To   dHeight
For   j   =   0   To   dWidth
p4Byte0(0)   =   BlueTable(p4Byte0(0))
p4Byte0(1)   =   GreenTable(p4Byte0(1))
p4Byte0(2)   =   RedTable(p4Byte0(2))
p4Byte0Ptr(0)   =   p4Byte0Ptr(0)   +   4
Next   j
FrmMain.AutoPBar.Value   =   i
Next   i
FrmMain.AutoPBar.Max   =   100:   FrmMain.AutoPBar.Value   =   100
AutoColorPoise   =   True
End   Function

关于自动白平衡的算法问题相关推荐

  1. 自动白平衡(AWB)算法---1,色温曲线

    白平衡算法---色温曲线 本文大体讲解了白平衡的算法流程,适用于想了解和学习白平衡原理的筒子们. 一般情况下要实现AWB算法需要专业的图像和算法基础,本文力图通过多图的方式,深入浅出,降低初学者理解上 ...

  2. 自动白平衡(AWB)算法---2,色温计算

    本文主要讲解了白平衡算法中估算当前场景色温的流程. 色温计算的原理并不复杂,但是要做好,还是要细心做好每一步工作,这需要大量的测试,并对算法不断完善. 首先简单说一下流程: 1, 取一帧图像数据,并分 ...

  3. 自动白平衡之完美反射算法原理及C++实现

    自动白平衡之完美反射算法原理及C++实现 原文:https://blog.csdn.net/just_sort/article/details/85982871 算法原理 https://www.cn ...

  4. 基于动态阈值、灰色世界、镜面法的自动白平衡

    白平衡是图像处理的一个极重要概念.所谓白平衡(White Balance),就是对白色物体的还原.当我们用肉眼观看这大千世界时,在不同的光线下,对相同的颜色的感觉基本是相同的,比如在早晨旭日初升时,我 ...

  5. 自动曝光修复算法附完整C代码

    众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus) 自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure) 自动曝光的是 ...

  6. 【图像增强】常见的图像增强算法

    各大平台搜集后整理 项目地址:Image-Enhancement 一.直方图均衡化 ① 算法原理 直方图均衡化,一般可用于灰度图像的对比增强(如:人脸阴影部位增强): ② 算法优缺点 如果直接对彩色图 ...

  7. 【高通SDM660平台 Android 10.0】(17) --- ISP算法相关-待学习文章

    <精 高通camera结构(摄像头基础介绍)> <Android : Camera2/HAL3 框架分析> 待学习: <基于IC设计的实用ISP介绍> <IS ...

  8. 轨物范世:华为手机的影像哲学

    回顾历史会发现,每一个时代都会出现一个引领者,通过关键技术突破及其产品化,推动行业进入一场不可逆的深远变局. 比如电话时代,AT&T就通过领先的技术和成功的商业模式,扫平了竞争对手,成为电话业 ...

  9. 图像增强/颜色管理/3A

    参考文章: HDR之双边滤波和引导滤波, 图像增强模块简介, 论文解读 https://blog.csdn.net/yywxl/article/details/108976002 色相/饱和度 图像处 ...

最新文章

  1. Linux中/proc目录下文件详解
  2. 吊打一切:YOLOv4的tricks汇总
  3. python使用字典格式化字符串-Python中将(字典,列表等)变量格式化输出
  4. Android 测试教程
  5. 【python数据挖掘课程】十八.线性回归及多项式回归分析四个案例分享
  6. BZOJ1010玩具装箱 - 斜率优化dp
  7. 菜鸟创业记--第四天
  8. 基于shiro实现session持久化和分布式共享
  9. flutter 动画展开菜单_蒲公英 · JELLY技术周刊 Vol.34: 芜湖~ Flutter
  10. python执行变量次_当脚本再次执行时需要一个变量来保留它的值(Python)
  11. 用计算机绘制v-t图像,2.用计算机绘制v-t图象. [预习导引]
  12. HttpClient 发送请求和参数
  13. 六大开源监测工具 你用过哪个?
  14. linux环境 下载Neo4j
  15. 融资融券开户超干货学习!
  16. 行测数量关系公式总结
  17. 导数的四则运算法则_导数、微分、积分之间的区别与联系
  18. 表格边框不显示怎么办
  19. Hadoop中怎么解决Starting secondary namenodes [0.0.0.0]
  20. 数仓 即席查询 之 Persto

热门文章

  1. 数字化时代10:从我国经济建设目标看社会产品形态的变化
  2. 资深开发者来告诉你 Android 工程师的技术壁垒在哪里
  3. python office365_python office365创建会议甚至
  4. 变革的力量--人脸识别智能门禁设备成为智慧社区建设标杆产品
  5. 数据挖掘---营销推广预测响应
  6. CCSP 2018,杭州电子科技大学,2018/10/25
  7. Java实现快速文件查重功能
  8. 设计模式(八)装饰模式
  9. dragtoresize什么意思_drag to是什么意思
  10. 前端vue/h5下载Springboot后端静态资源(txt/word/excel)