当前位置:   article > 正文

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

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('平衡后');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

代码效果:

在这里插入图片描述

全反射算法

全反射理论:一幅图像中亮度最大的点就是白点, 即假设在 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('平衡后');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

代码效果:
在这里插入图片描述
写在后面:
上述图像为某潜水员在水下拍摄,为得到正确的白平衡,他拍摄了一张灰色卡片作为对比:
在这里插入图片描述
由灰色卡片修正图像白平衡结果如下:

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/519733
推荐阅读
相关标签
  

闽ICP备14008679号