欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 人文社科 > 生活经验 >内容正文

生活经验

Matlab实现图像白平衡(灰度世界法、全反射算法)

发布时间:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Matlab实现图像白平衡(灰度世界法、全反射算法) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

参考: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:mfor j=1:ns=sum(img(i,j,:));histRGB(s)=histRGB(s)+1;end
endnum=0;
for i=1:765num=num+histRGB(766-i);if num>m*n*0.1thresh=765-i;breakend
endamount=0;
Rave=0;Gave=0;Bave=0;
for i=1:mfor j=1:ns=sum(img(i,j,:));if s>threshRave=(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;endend
endfor i=1:mfor j=1:nR(i,j)=255*R(i,j)/Rave;if R(i,j)>255R(i,j)=255;endG(i,j)=255*G(i,j)/Gave;if G(i,j)>255G(i,j)=255;endB(i,j)=255*B(i,j)/Bave;if B(i,j)>255B(i,j)=255;endend
endsubplot(122),imshow(uint8(cat(3,R,G,B))),title('平衡后');

代码效果:

写在后面:
上述图像为某潜水员在水下拍摄,为得到正确的白平衡,他拍摄了一张灰色卡片作为对比:

由灰色卡片修正图像白平衡结果如下:

总结

以上是生活随笔为你收集整理的Matlab实现图像白平衡(灰度世界法、全反射算法)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。