一种效果很好的自动白平衡技术(WhiteBalance)

白平衡是图像处理的一个极重要概念。所谓白平衡(英文名称为White Balance),就是对白色物体的还原。当我们用肉眼观看这大千世界时,在不同的光线下,对相同的颜色的感觉基本是相同的,比如在早晨旭日初升时,我们看一个白色的物体,感到它是白的;而我们在夜晚昏暗的灯光下,看到的白色物体,感到它仍然是白的。这是由于人类从出生以后的成长过程中,人的大脑已经对不同光线下的物体的彩色还原有了适应性。但是,作为拍摄设备,如数码相机,可没有人眼的适应性,在不同的光线下,由于CCD输出的不平衡性,造成数码相机彩色还原失真。一般情况下,我们习惯性地认为太阳光是白色的,已知直射日光的色温是5200K左右,白炽灯的色温是3000K左右。用传统相机的日光片拍摄时,白炽灯光由于色温太低,所以偏黄偏红。所以通常现场光线的色温低于相机设定的色温时,往往偏黄偏红,现场光线的色温高于相机设定时,就会偏蓝。

为了解决不同色温下,引起的白色漂移现象。由于白色对色温变化的响应最大,通常用白色来作为调整的基色。通常的白平衡技术有:自动白平衡、钨光白平衡、荧光白平衡、室内白平衡、手动调节。本文仅介绍其中的一种自动白平衡。

白平衡算法通常分为两步:白色点的检测,白色点的调整。本方法采用一个动态的阀值来检测白色点。详细算法过程为:

1.  把图像w*h从RGB空间转换到YCrCb空间。

2.  选择参考白色点:

a. 把图像分成3*4个块(块数可选)。

b. 对每个块,分别计算Cr,Cb的平均值Mr,Mb。

c. 对每个块,根据Mr,Mb,分别计算Cr,Cb的方差Dr,Db。

d. 判定每个块的近白区域(near-white region)。

判别表达式为:Cb(i, j) − (Mb + Db × sign(Mb )) < 1.5× Db && Cr(i, j) − (1.5×Mr + Dr × sign(Mr )) < 1.5× Dr

设一个“参考白色点”的亮度矩阵RL,大小为w*h。

若符合判别式,则作为“参考白色点”,并把该点(i,j)的亮度(Y分量)值赋给RL(i,j);

若不符合,则该点的RL(i,j)值为0。

3.  选取参考“参考白色点”中最大的10%的亮度(Y分量)值,并选取其中的最小值Lu_min.

4.  调整RL,若RL(i,j)<Lu_min,  RL(i,j)=0; 否则,RL(i,j)=1;

5.  分别把R,G,B与RL相乘,得到R2,G2,B2。  分别计算R2,G2,B2的平均值,Rav,Gav,Bav;

6.  得到调整增益:  Ymax=double(max(max(Y)))/15;
                                    Rgain=Ymax/Rav;
                                    Ggain=Ymax/Gav;
                                    Bgain=Ymax/Bav;

7.  调整原图像:Ro= R*Rgain; Go= G*Ggain; Bo= B*Bgain;

代码如下:

  1. function autoWhiteBalanceTest
  2. clear all;
  3. close all;
  4. clc;
  5.  
  6. im=imread('13.jpg');
  7. im2=im;
  8. im1=rgb2ycbcr(im);%将图片的RGB值转换成YCbCr值%
  9. Lu=im1(:,:,);
  10. Cb=im1(:,:,);
  11. Cr=im1(:,:,);
  12. [x y z]=size(im);
  13. tst=zeros(x,y);
  14.  
  15. %计算CbCr的均值MbMr%
  16. Mb=mean(mean(Cb));
  17. Mr=mean(mean(Cr));
  18.  
  19. %计算CbCr的均方差%
  20. Db=sum(sum(Cb-Mb))/(x*y);
  21. Dr=sum(sum(Cr-Mr))/(x*y);
  22.  
  23. %根据阀值的要求提取出near-white区域的像素点%
  24. cnt=;
  25. for i=:x
  26. for j=:y
  27. b1=Cb(i,j)-(Mb+Db*sign(Mb));
  28. b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr));
  29. if (b1<abs(1.5*Db) & b2<abs(1.5*Dr))
  30. Ciny(cnt)=Lu(i,j);
  31. tst(i,j)=Lu(i,j);
  32. cnt=cnt+;
  33. end
  34. end
  35. end
  36. cnt=cnt-;
  37. iy=sort(Ciny,'descend');%将提取出的像素点从亮度值大的点到小的点依次排列%
  38. nn=round(cnt/);
  39. Ciny2(:nn)=iy(:nn);%提取出near-white区域中10%的亮度值较大的像素点做参考白点%
  40.  
  41. %提取出参考白点的RGB三信道的值%
  42. mn=min(Ciny2);
  43. for i=:x
  44. for j=:y
  45. if tst(i,j)<mn
  46. tst(i,j)=;
  47. else
  48. tst(i,j)=;
  49. end
  50. end
  51. end
  52.  
  53. R=im(:,:,);
  54. G=im(:,:,);
  55. B=im(:,:,);
  56. R=double(R).*tst;
  57. G=double(G).*tst;
  58. B=double(B).*tst;
  59.  
  60. %计算参考白点的RGB的均值%
  61. Rav=mean(mean(R));
  62. Gav=mean(mean(G));
  63. Bav=mean(mean(B));
  64. Ymax=double(max(max(Lu)))/;%计算出图片的亮度的最大值%
  65.  
  66. %计算出RGB三信道的增益%
  67. Rgain=Ymax/Rav;
  68. Ggain=Ymax/Gav;
  69. Bgain=Ymax/Bav;
  70.  
  71. %通过增益调整图片的RGB三信道%
  72. im(:,:,)=im(:,:,)*Rgain;
  73. im(:,:,)=im(:,:,)*Ggain;
  74. im(:,:,)=im(:,:,)*Bgain;
  75.  
  76. %显示图片%
  77. figure,imshow(im2),title('原图');
  78. figure,imshow(im),title('白平衡后的效果图');

参考地址:http://www.cnblogs.com/haar/articles/1392227.html

     http://www.cnblogs.com/tiandsp/archive/2012/05/01/2477897.html

matlab 自动阈值白平衡算法 程序可编译实现的更多相关文章

  1. 亲测有效!一种完美动态阈值白平衡算法 Java实现。

    几年没发文了,重新拿起技术! 最近做图像处理,要自动处理颜色平衡问题,很多什么直方图优化之类的,都不完美.所以在博客园找到了这个前辈的文章. http://www.cnblogs.com/Images ...

  2. matlab灰度变彩色+白平衡算法实现

    % matlab彩色图像分离通道并合并成处理后的彩色图像(彩色变灰度再变彩色) % 白平衡算法(灰度世界法)消除RGB受光照影响 clear all; close all; %读入原始图像 srcIm ...

  3. MFC:“Debug Assertion Failed!” ——自动生成的单文档程序项目编译运行就有错误

    今天照着孙鑫老师的VC++教程学习文件的操作,VS2010,单文档应用程序,项目文件命名为File,也就有了自动生成的CFileDoc.CFileView等类,一进去就编译运行(就是最初自动生成的项目 ...

  4. 用gcc进行程序的编译

    在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passw ...

  5. 关于一个程序的编译过程 zkjg面试

    http://blog.csdn.net/gengyichao/article/details/6544266 一 以下是C程序一般的编译过程: 从图中看到: 将编写的一个c程序(源代码 )转换成可以 ...

  6. C/C++程序从编译到链接的过程

    编译器是一个神奇的东西,它能够将我们所编写的高级语言源代码翻译成机器可识别的语言(二进制代码),并让程序按照我们的意图按步执行.那么,从编写源文件代码到可执行文件,到底分为几步呢?这个过程可以总结为以 ...

  7. OpenCV白平衡算法之灰度世界法(消除RGB受光照影响)

    在用OpenCV对图像进行处理时,利用颜色定位是常常会接触到的方法,但RGB受光照影响比较严重,转换到HSV XYZ等空间也解决不了时, 可以用白平衡算法进行修正,使其发黄.发蓝.发红的照片更加趋于自 ...

  8. 灰度图像的自动阈值分割(Otsu 法)(转载)

    灰度图像的自动阈值分割(Otsu 法) 机器视觉领域许多算法都要求先对图像进行二值化.这种二值化操作阈值的选取非常重要.阈值选取的不合适,可能得到的结果就毫无用处.今天就来讲讲一种自动计算阈值的方法. ...

  9. 附录三 嵌入式C程序的编译与调试

    课程回顾 C语言库的特性和发展 C语言库的常用库函数 标准库函数的特色应用 git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysi ...

随机推荐

  1. laravel框架总结(一) -- 请求和响应

    一.laravel请求 1.获取请求 1>获取请求的 URI path 方法会返回请求的 URI.所以,如果接收到的请求目标是 http://domain.com/foo/bar,那么 path ...

  2. qt中信号与槽机制

    一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...

  3. android 入门 002 (拨打电话,发送短信)

    一.拨打电话 1.首先做好界面,代码如下: layout =>activity_main.xml 中 <LinearLayout xmlns:android="http://sc ...

  4. 腾讯微博模拟登陆+数据抓取(java实现)

    不多说,贴出相关代码. 参数实体: package token.def; import java.io.Serializable; import java.util.Properties; publi ...

  5. dubbo子模块

    dubbo源码版本:2.5.4 经统计,dubbo一共有36个子模块,子模块如下: ---------------------------------------------------------- ...

  6. Hashtable与ConcurrentHashMap区别

    Hashtable与ConcurrentHashMap区别 ConcurrentHashMap融合了hashtable和hashmap二者的优势. hashtable是做了同步的,是线性安全的,(2) ...

  7. C#单击按钮显示图片,带开始停止

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  8. 熟悉 Objective-C

    ## 1. OC 的起源 OC 的方法(本质上讲是消息)在运行时决定.使用函数调用的语言,由编译器决定.如果涉及多态,则用到虚函数表. ## 2. 少在头文件中引用其他文件 1. 两个头文件互相引用会 ...

  9. ASP.NET四则运算--策略模式

    在ASP.NET中实现四则运算,同样使用了类的封装,以及策略模式.只不过是把封装的类.前台代码以及后台的代码分离开来,但同样是要达到功能的实现. Calculator.cs using System; ...

  10. ABAP WRITE、WRITE TO、FORMAT语句

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...