开坑记录一下白平衡相关算法,从两个最基本的白平衡算法开始。
颜色作为物体最基本的属性,在大部分场合对人类视觉而言是一个能够轻而易举捕获的信息。但在数字成像过程中,颜色是一种及其不稳定的图像特征。数字成像时获取的颜色主要依赖三个因素:物体表面光谱反射率、场景中的光照条件和成像器件的对光的灵敏度曲线。人类视觉系统存在一种颜色恒常性功能,能够在不同的光照下自动消除光照的影响,从而获得较稳定和准确的物体颜色。但是成像设备不具备这种特质,因此白平衡算法对成像颜色好坏起到了至关重要的作用。
白平衡算法的核心内容就是估计光照。但是从一幅已有图像去估计光照本身就是一个病态问题,因此,现有的白平衡算法基本都是基于一定的假设和先验条件。其中,Gray World和White Patch是两个基于各自假设,简单、实用的白平衡算法。
White Patch假设:图像中,RGB颜色通道的最大响应是由场景中的白色表面引起的。理论上白色表面可以反射场景光照的颜色,因此,RGB通道中最大的值将被作为图像的光照颜色。所以,该算法又被称为MaxRGB算法。其数学形式为:
max x f ( X ) = k e (1) \max\limits_{x}f(X)=ke\tag1 xmaxf(X)=ke(1)
其中 X X X表示像素点坐标, k k k为用于校准光照的常量, e e e为光照。该最大值是各通道分别计算,而不是必须是一个像素点的三通道最大。这就导致了该算法在很多场合中其实并不适用,因为该算法假设需要在场景中存在一个白色(标准光源下)像素点或者三通道反射率相同的点(灰点)。当场景中没有这样的点的时候,该算法的表现就会比较糟糕。而以后的许多算法也是在找白点上做了各种改进,该算法最大的优点就是简单高效。
具体的实现也比较简单,实际用的时候,白点的定义也可以有很多。归一化后可以以1作为最大点,也可以用绿色通道最大值作为最亮点求各个通道的增益系数。
function out=MaxRGB(im)
% Image should be normalized to 0-1 归一化
R_max = max(max(im(:,:,1)));
G_max = max(max(im(:,:,2)));
B_max = max(max(im(:,:,3)));
Max = max(im(:));
k = [R_max G_max B_max]./Max;
for i=1:3
out(:,:,i) = im(:,:,i)/k(i);
end
end
Gray World假设:场景中所有物理表面的平均反射是无色差的(灰色的)。这也是灰色世界名字的由来,简而言之,Gray World就是将整幅图像的平均颜色作为图像的光照颜色。Gray World的假设条件相比MaxRGB相对宽松,对一般图像适应能力强,同时也很简单,因此得到广泛使用。其缺点是,当图像中颜色比较单一的时候,该法就会失效。对其的改进也是主要基于如何适用于颜色较单一场景的情况,例如对图像分块处理。
数学形式如下:
∫ f ( X ) d X ∫ d X = k e (2) \frac{\int f(X)dX}{\int dX}=ke\tag2 ∫dX∫f(X)dX=ke(2)
function out=GrayWorld(im, flag)
% Image should be normalized to 0-1 归一化
R_avg = mean2(im(:,:,1));
G_avg = mean2(im(:,:,2));
B_avg = mean2(im(:,:,3));
if ~exist('flag','var')||flag==0
Avg = 0.5;
elseif flag==1
Avg = mean2(im);
else
Avg = G_avg;
end
k = [R_avg G_avg B_avg]./Avg;
for i=1:3
out(:,:,i) = im(:,:,i)/k(i);
out(:,:,i) = min(out(:,:,i),1);%处理一下有可能超出1的值,直接设1
end
end
为了将Gray World更加一般化,Finalayson等人在上式中引入了闵可夫斯基范式(Minkowskinorm),提出了一种SoG算法。SoG算法利用闵式距离代替简单求平均的方法,其数学形式如下:
( ∫ ( f ( X ) ) p d X ∫ d X ) 1 / p = k e (3) (\frac{\int (f(X))^pdX}{\int dX})^{1/p}=ke\tag3 (∫dX∫(f(X))pdX)1/p=ke(3)
该算法将MaxRGB和GrayWorld算法纳入了同一个计算框架下:
1<p<∞
时,就是普通的SoG算法,Finalayson等指出,在 p = 6 p=6 p=6时,算法取得较好的适用性和效果。function out=SoG(im, p)
% Image should be normalized to 0-1
if ~exist('p','var')
p=6;
end
imP = im.^p;
R_avg = mean2(imP(:,:,1)).^(1/p);
G_avg = mean2(imP(:,:,2)).^(1/p);
B_avg = mean2(imP(:,:,3)).^(1/p);
Avg = mean2(imP).^(1/p);
k = [R_avg G_avg B_avg]./Avg;
for i=1:3
out(:,:,i) = im(:,:,i)/k(i);
out(:,:,i) = min(out(:,:,i),1);
end
end
[1]王金华, 李兵, 须德. 图像理解:颜色认知计算[M]. 清华大学出版社, 2013.