有关MaxRGB,GrayWorld算法的回顾,可以参考白平衡算法之Gray World、White Patch、SoG。
MaxRGB,GrayWorld等算法都是基于原始图像的特征提出的。之后,Weijer等人通过观察对立颜色空间的图像颜色导数分布,发现图像的颜色导数在对立颜色空间呈一定规则。这里说到的对立颜色空间是根据颜色对抗学说建立的一个颜色空间,对立颜色空间的获得是从RGB空间做一个变换得到,具体有关对立颜色空间和颜色对抗学说的内容可移步维基百科。
根据图像颜色在这个空间上的一些特性,Weijer提出了一种新的Gray Edge假说:场景中所有物理表面的平均反射的差分是无色差的。同时,为了兼容几大基本算法,闵可夫斯基范式也被引入,得到了一个更为通用的颜色恒常性计算的算法框架,其最终的数学形式为:
( ∫ ∣ ∂ n f σ ( X ) ∂ X n ∣ p d X ) 1 / p = k e n , p , σ (1) (\int |\frac{\partial^nf^\sigma(X)}{\partial X^n}|^p dX)^{1/p}=ke^{n,p,\sigma}\tag1 (∫∣∂Xn∂nfσ(X)∣pdX)1/p=ken,p,σ(1)
其中 f n = f ⊗ G σ f^n=f\otimes G^\sigma fn=f⊗Gσ,表示图像 f f f与高斯滤波器 G σ G^\sigma Gσ的卷积; ∂ n / ∂ X n \partial^n/\partial X^n ∂n/∂Xn表示 n n n阶导数过程。选择不同的 n , p , σ n,p,\sigma n,p,σ参数,分别包含了几大基础算法,如下表所示。
算法 | 参数 | 公式 |
---|---|---|
Gray World | e 0 , 1 , 0 e^{0,1,0} e0,1,0 | ( ∫ f ( X ) d X ) = k e (\int f(X)dX)=ke (∫f(X)dX)=ke |
MaxRGB | e 0 , ∞ , 0 e^{0,\infty,0} e0,∞,0 | ( ∫ ∥ f ( X ) ∥ ∞ d X ) 1 ∞ = k e (\int \|f(X)\|^\infty dX)^\frac{1}{\infty}=ke (∫∥f(X)∥∞dX)∞1=ke |
Shades of Gray | e 0 , p , 0 e^{0,p,0} e0,p,0 | ( ∫ ∥ f ( X ) ∥ p d X ) 1 p = k e (\int \|f(X)\|^p dX)^\frac{1}{p}=ke (∫∥f(X)∥pdX)p1=ke |
Gauss Gray World | e 0 , p , σ e^{0,p,\sigma} e0,p,σ | ( ∫ ∥ f σ ( X ) ∥ p d X ) 1 p = k e (\int \|f^\sigma(X)\|^pdX)^\frac{1}{p}=ke (∫∥fσ(X)∥pdX)p1=ke |
1st Order Gray Edge | e 1 , p , σ e^{1,p,\sigma} e1,p,σ | ( ∫ ∥ f X σ ( X ) ∥ p d X ) 1 p = k e (\int \|f^\sigma_X(X)\|^pdX)^\frac{1}{p}=ke (∫∥fXσ(X)∥pdX)p1=ke |
max Edge | e 1 , ∞ , σ e^{1,\infty,\sigma} e1,∞,σ | ( ∫ ∥ f X σ ( X ) ∥ ∞ d X ) 1 ∞ = k e (\int \|f^\sigma_X(X)\|^\infty dX)^\frac{1}{\infty}=ke (∫∥fXσ(X)∥∞dX)∞1=ke |
2nd Order Gray Edge | e 2 , p , σ e^{2,p,\sigma} e2,p,σ | ( ∫ ∥ f X X σ ( X ) ∥ p d X ) 1 p = k e (\int\|f^\sigma_{XX}(X)\|^pdX)^\frac{1}{p}=ke (∫∥fXXσ(X)∥pdX)p1=ke |
当然,即使Gray World假设来源于对立颜色空间,但是所有处理依旧是在RGB颜色空间进行的。Gray Edge的重要意义在于把原来在0阶图像上进行的颜色恒常性计算推广到了高阶上。
以下是自己写的一个简易版的代码,固定了只求1阶导数。
function out = GrayEdge(im,p,sigma)
% Image should be normalized to 0-1
% n 图像阶数 固定1,这里图像导数的来源有待考证
% p Minkowski范数 默认6
% alpha 高斯滤波尺度 默认2
%
out = im;
if ~exist('p','var')
p=6;
end
if ~exist('alpha','var')
sigma=2;
end
k = fspecial('gaussian',floor(sigma*3+0.5),sigma);%创建高斯模板
im_G = imfilter(im,k,'replicate');%高斯滤波
im_edge = gradient(im_G);%求一阶图像
im_edge = abs(im_edge).^p;%闵可夫斯基p范式
r = im_edge(:,:,1);
g = im_edge(:,:,2);
b = im_edge(:,:,3);
Avg = mean(im_edge(:)).^(1/p);%计算出来的光照颜色
R_avg = mean2(r).^(1/p);%各通道
G_avg = mean2(g).^(1/p);
B_avg = mean2(b).^(1/p);
k = [R_avg G_avg B_avg]./Avg;%增益k
for i=1:3
out(:,:,i) = im(:,:,i)/k(i);
out(:,:,i) = min(out(:,:,i),1);
end
end
针对以上几种方法,在Color Constancy网站上给出了一般化框架代码,写的稍微有点复杂,就也没看很仔细,点击源代码下载。
[1]王金华, 李兵, 须德. 图像理解:颜色认知计算[M]. 清华大学出版社, 2013.
[2] Color Constancy