白平衡之灰度世界法与镜面法

白平衡之灰度世界算法与镜面算法

一、引言

        色彩是人眼的对可视光的一种感知。对于不透明的物体而言,人眼所形成的色彩感知取决于光照光谱分布、物体表面光的反射性和人眼(或者其它光信号接收器)的光敏特性。在光信号接收器的光敏特性保持不变,物体也保持不变的情况下,人眼对该物体的色彩感知就取决于光照的光谱分布。由于人眼视觉的色彩恒常性,当环境光发生变化的时候,我们人类的视觉系统具有某种调节能力,可以让我们的大脑还原物体表面的不变特征,但是对于像照相机这样的光信号接收器,它只能如实地记录所接收到的光信号,因此在不同光源下所得到的图像在我们人类看起来会有色彩的偏差,下图所展示就是由于光源的不同造成同一物体色差不同的例子。

 

        为了能够让照相机等成像设备可以具有类似于人眼的视觉调节能力,在不同的光照情况下,使所获取的图像颜色保持一致,对所获得图像所做的处理就叫做白平衡。在专业的摄像领域,相机可以通过调节自身光敏器件对可见光中不同颜色单色光的敏感性来实现对图像的白平衡,以达到摄影师所想要的效果。对于已经获取的图像,如果因为光照原因出现色彩的偏差的话,我们有时候也寄希望于通过现有图像来得到图像获取时的光照信息,基于这些信息来对图像进行调整以获得在某种标准光源下的图像,于是就产生了很多白平衡的算法,其中灰度世界算法和镜面法是较为常用白平衡算法。

二、基本原理——Von Kries色适应理论

        Von Kries提出,可用一个对角矩阵变换来描述两种光照条件下同一物体表面颜色之间的关系[1]。该理论认为,对于同一个观察者而言,假设在光源A下面,一个物体的RGB值为RGB1=[R1,G1,B1],如果在光源B下面同一个物体的RGB值为RGB2=[R2,G2,B2],那么RGB1与RGB2之间存在这如下转换关系。

RGB2’=[kr,0,0;0,kg,0;0,0,kb]RGB1',其中kr、kg和kb分别为R、G、B三个通道的校正系数。我们接下来将要介绍的灰度世界算法和镜面法的理论都是建立在这一原理的基础上的,需要注意的是,这个理论在某些条件下是不适用的。

三、灰度世界算法

      3.1算法理论

       该理论假设:对于一副有着丰富色彩的图片,图像上R、G、B三个通道的平均值应该等于一个被称为“灰色”的值K[2]。理论中最重要的一点就是“灰色”的定义和选择问题。有多种方法对理论中的“灰色”进行定义,在此不详细讨论这一点。至于“灰色”的选择,一种方法是将其定义为各通道最大值的一半,还可以将待处理图片三个通道均值的均值作为“灰色”值K。当确定了灰色值K之后,将待处理图片转换到经典光源下的各个校正系数分别为:kr=K/Rmean,kg=K/Gmean,kb=K/Bmean,其中Rmean,Gmean和Bmean分别为图像R、G、B通道的均值。

     3.2 算法的matlab实现

%白平衡灰度世界算法
clc;
clear;
subplot(1,3,1);
I=imread('WB4.jpg');%可以将图片路径换为自己的待校正的图片路径
imshow(I);
title('原始图像');
I=im2double(I);%将8位的RGB图像转为double类型的图像,防止在后面运算各个通道的数值时出现数据损失
%计算图片各个通道的平均值
Rmean=mean(mean(I(:,:,1)));
Gmean=mean(mean(I(:,:,2)));
Bmean=mean(mean(I(:,:,3)));
%计算标准灰度
k=mean([Rmean,Gmean,Bmean]);
%计算各个通道的增益
k_r=k/Rmean;
k_g=k/Gmean;
k_b=k/Bmean;
%生成新的图像
inew_r=k_r*I(:,:,1);
inew_g=k_g*I(:,:,2);
inew_b=k_b*I(:,:,3);
%由于新生成的RGB三通道中有可能出超出255的灰度值,需要将新生成的图像映射到[0,255]这一区间内
%方法1:将各通道中灰度值大于255的像素点的灰度直接设置为255
[M,N]=size(inew_r);
inew_r1=inew_r;
inew_g1=inew_g;
inew_b1=inew_b;
for i=1:M
    for j=1:N
        if(inew_r1(i,j)>1) inew_r1(i,j)=1;end
        if(inew_g1(i,j)>1) inew_g1(i,j)=1;end
        if(inew_b1(i,j)>1) inew_b1(i,j)=1;end
    end
end
inew=cat(3,inew_r1,inew_g1,inew_b1);
inew=im2uint8(inew);
subplot(1,3,2);
imshow(inew);
title('取最大值');
%方法2:将新生成的各个通道的像素进行归一化处理
factor_r=max(max(inew_r));
factor_g=max(max(inew_g));
factor_b=max(max(inew_b));
inew_r2=inew_r;
inew_g2=inew_g;
inew_b2=inew_b;
if(factor_r>1) inew_r2=inew_r/factor_r;end
if(factor_g>1) inew_g2=inew_g/factor_g;end
if(factor_b>1) inew_b2=inew_b/factor_b;end
inew=cat(3,inew_r2,inew_g2,inew_b2);
subplot(1,3,3);
imshow(im2uint8(inew));
title('归一化');

        程序运行效果演示如下图所示。

四、镜面法(完美反射法)

       4.1 算法原理

       算法假设:图像中的“镜面”可以完全发射光源照射在物体上面的光线。因此,如果图像中存在一个“镜面”的话,那么在特定光源下,可以将所获得的“镜面”的色彩信息认为是当前光源的信息。在进行校准的时候,我们假设图片上存在一个可以完全反射光源的“镜面”,那么在经典光源下图片中就应该存在一个三刺激值为[255,255,255]纯白色像素点(注意:有多种白色点的定义),此时的校准系数可以定义为kr=255/Rmax,kg=255/Gmax,kb=255/Bmax,其中Rmax,Gmax和Bmax分别为图像R、G、B通道的最大值。

        4.2 算法的matlab实现

clc;
clear;
subplot(1,2,1);
I=imread('WB7.jpg');%可以将图片路径换为自己的待校正的图片路径
imshow(I);
title('原始图像');
I=im2double(I);%将8位的RGB图像转为double类型的图像,防止在后面运算各个通道的数值时出现数据损失
%求各个通道的最大值
max_r=max(max(I(:,:,1)));
max_g=max(max(I(:,:,2)));
max_b=max(max(I(:,:,3)));
%求各个通道相对于所选定白光的偏移量,我以RGB三刺激值为[255,255,255],在double类型的情况下就是[1,1,1]的白作为所选定的白光
q_r=1/max_r;
q_g=1/max_g;
q_b=1/max_b;
%根据偏移量计算新的RGB矩阵
new_r=I(:,:,1)*q_r;
new_g=I(:,:,2)*q_g;
new_b=I(:,:,3)*q_b;
%拼合三个通道
inew=cat(3,im2uint8(new_r),im2uint8(new_g),im2uint8(new_b));
inew=im2uint8(inew);
subplot(1,2,2);
imshow(inew);
title('镜面法白平衡');

       算法运行效果如下:

总结

        灰度世界算法与镜面法由于简单、计算量小等优点成为常用的白平衡算法,但是它们也各自有各自的缺点。由于灰度世界算法是基于灰度世界的假设,当图片中没有足够丰富的色彩来近似理想情况时,灰度世界算法的白平衡效果就差强人意。同样的,如果图片中不存在一个较为理想的反射镜面,镜面法的白平衡效果也不够好。因此在应用中,会根据使用环境的不同,对算法进行改进,笔者水平有限只介绍了最基本的内容。由于笔者对这两种算法的理论假设和推理还不能够完全理解,本篇博客中难免出现错误,还请各位大牛指正。

引用

[1]朱贵冬, 沈理, 王今觉. 基于von-Kries色适应的分区颜色校正方法[J]. 计算机工程与科学, 2007, 29(2):50-52.

[2]严世珺. 数字图像白平衡处理算法研究与改进[D]. 上海交通大学, 2008.

版权声明:本篇博客为作者原创博客,转载请注明出处。

 

posted @ 2017-07-14 10:22  NewRookie  阅读(9820)  评论(1编辑  收藏  举报