白平衡算法之Gray World、White Patch、SoG

开坑记录一下白平衡相关算法,从两个最基本的白平衡算法开始。

白平衡算法之Gray World和White Patch

  颜色作为物体最基本的属性,在大部分场合对人类视觉而言是一个能够轻而易举捕获的信息。但在数字成像过程中,颜色是一种及其不稳定的图像特征。数字成像时获取的颜色主要依赖三个因素:物体表面光谱反射率、场景中的光照条件和成像器件的对光的灵敏度曲线。人类视觉系统存在一种颜色恒常性功能,能够在不同的光照下自动消除光照的影响,从而获得较稳定和准确的物体颜色。但是成像设备不具备这种特质,因此白平衡算法对成像颜色好坏起到了至关重要的作用。

  白平衡算法的核心内容就是估计光照。但是从一幅已有图像去估计光照本身就是一个病态问题,因此,现有的白平衡算法基本都是基于一定的假设和先验条件。其中,Gray World和White Patch是两个基于各自假设,简单、实用的白平衡算法。


White Patch(MaxRGB)

  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作为最大点,也可以用绿色通道最大值作为最亮点求各个通道的增益系数。

算法流程
  • 计算三通道各自最大值 R m a x R_{max} Rmax G m a x G_{max} Gmax B m a x B_{max} Bmax
  • 计算增益, k = [ R m a x , G m a x , B m a x ] . / M a x k=[R_{max},G_{max},B_{max}]./Max k=[Rmax,Gmax,Bmax]./Max,也可以直接以1或者 G m a x G_{max} Gmax作为光照。
  • 对原图三个通道乘上增益, R / k , G / k , B / k R/k,G/k,B/k R/k,G/k,B/k
Matlab代码
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、White Patch、SoG_第1张图片


Gray World

  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 dXf(X)dX=ke(2)

算法流程
  • 计算三通道各自平均值 R a v g R_{avg} Ravg G a v g G_{avg} Gavg B a v g B_{avg} Bavg,整个图像的平均值 A L L a v g ALL_{avg} ALLavg作为光源 e e e
  • 计算增益, k = [ R a v g , G a v g , B a v g ] / A L L a v g k=[R_{avg},G_{avg},B_{avg}]/ALL_{avg} k=[Ravg,Gavg,Bavg]/ALLavg,同样的,光源 e e e也可以按需求取0.5, G a v g G_{avg} Gavg等。
  • 对原图三个通道除以增益, R / k , G / k , B / k R/k,G/k,B/k R/k,G/k,B/k
Matlab代码
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、White Patch、SoG_第2张图片


SoG(Shades of Gray)

  为了将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算法纳入了同一个计算框架下:

  • p = 1 p=1 p=1时,该式就退化为GrayWorld算法,直接求图像平均。
  • p = ∞ p=\infty p=时,该式等价于求 f ( X ) f(X) f(X)最大值,等同于MaxRGB法。
  • 1 < p < ∞ 11<p<时,就是普通的SoG算法,Finalayson等指出,在 p = 6 p=6 p=6时,算法取得较好的适用性和效果。
Matlab代码
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
结果

白平衡算法之Gray World、White Patch、SoG_第3张图片

更加一般化的框架:Gray Edge

参考文献

[1]王金华, 李兵, 须德. 图像理解:颜色认知计算[M]. 清华大学出版社, 2013.

你可能感兴趣的:(颜色科学,#,白平衡)