参考:https://www.cnblogs.com/molakejin/p/5766132.html
白平衡
白平衡的英文为White Balance,其基本概念是“不管在任何光源下,都能将白色物体还原为白色”,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿。
所谓的白平衡是通过对白色被摄物的颜色还原(产生纯白的色彩效果),进而达到其他物体色彩准确还原的一种数字图像色彩处理的计算方法。(源自百度百科)
灰度世界算法
灰度世界理论:认为任何一幅图像, 当有足够的色彩变化时, 其R, G, B分量均值会趋于平衡(即 RGB三个数值相等, 也就是说应当是黑白灰类型的颜色)。这个理论在全局白平衡中得到⼴泛应用, 特点是能够利用更多的图像信息来做判断, 但在面对⾊色彩较为单一的图像时就显得有些乏力了。
灰度世界算法:根据灰度世界理论,将原始图的RGB均值分别调整到R= G = B即可。不完美的地方就是这个算法对颜色不丰富的图像敏感程度一般,处理起来效果也就不会很理想,局限性很大。
Matlab代码实现:
clc;clear;close all;
img=imread('test.png');
subplot(121),imshow(img),title('原图');
R = img(:,:,1);G = img(:,:,2);B = img(:,:,3);
Rave = mean2(R);
Gave = mean2(G);
Bave = mean2(B);
K = (Rave + Gave + Bave) / 3;
R_new=(K/Rave)*R;G_new=(K/Gave)*G;B_new=(K/Bave)*B;
subplot(122),imshow(cat(3,R_new,G_new,B_new)),title('平衡后');
代码效果:
全反射算法
全反射理论:一幅图像中亮度最大的点就是白点, 即假设在 YCbCr 空间中Y值最⼤的点为白色, 以此来校正整幅图像。特点是只考虑色彩最亮的那部分, 跟上面的灰度世界理论正好相反, 在处理色彩偏单调的图像时效果好些, 但面对颜色丰富的图片时,因为最亮的点不一定是⽩色的, 可能会出现偏色的情况。
全反射算法:该算法认为最亮的那个点就是白色,如果不是,就针对偏离白色的数值进行逆向修正。缺点是没有高亮点或者图像色彩复杂,它的修正效果就会比较乏力。
Matlab代码实现(未加解释),参考https://www.cnblogs.com/Imageshop/archive/2013/04/20/3032062.html
clc;clear;close all;
img=imread('test.png');
subplot(121),imshow(img),title('原图');
R=double(img(:,:,1));G=double(img(:,:,2));B=double(img(:,:,3));
histRGB=zeros(765);
[m,n,h]=size(img);
for i=1:m
for j=1:n
s=sum(img(i,j,:));
histRGB(s)=histRGB(s)+1;
end
end
num=0;
for i=1:765
num=num+histRGB(766-i);
if num>m*n*0.1
thresh=765-i;
break
end
end
amount=0;
Rave=0;Gave=0;Bave=0;
for i=1:m
for j=1:n
s=sum(img(i,j,:));
if s>thresh
Rave=(Rave*amount+R(i,j))/(amount+1);
Gave=(Gave*amount+G(i,j))/(amount+1);
Bave=(Bave*amount+B(i,j))/(amount+1);
amount=amount+1;
end
end
end
for i=1:m
for j=1:n
R(i,j)=255*R(i,j)/Rave;
if R(i,j)>255
R(i,j)=255;
end
G(i,j)=255*G(i,j)/Gave;
if G(i,j)>255
G(i,j)=255;
end
B(i,j)=255*B(i,j)/Bave;
if B(i,j)>255
B(i,j)=255;
end
end
end
subplot(122),imshow(uint8(cat(3,R,G,B))),title('平衡后');
代码效果:
写在后面:
上述图像为某潜水员在水下拍摄,为得到正确的白平衡,他拍摄了一张灰色卡片作为对比:
由灰色卡片修正图像白平衡结果如下: