数字图像处理12-白平衡算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
fx=imread('test1.jpg'); f=im2double(fx); [m,n]=size(f); n=n/3; f1=zeros(m,n,3); mr=0; mg=0; mb=0; ar=0; ag=0; ab=0; for i=1:m for j=1:n if(mr<f(i,j,1)) mr=f(i,j,1); end if(mg<f(i,j,2)) mg=f(i,j,2);
可以看到这里也是如上用到了平均值与最大值,但是和之前不同的是,这里有了一次分量和二 次分量,而且也有了 uv 两个参数。其基本的原理就是先确定一个二次的白平衡公式:
Hale Waihona Puke Baidu
随后通过两个确定的目标模型求出 uv 值,就可以进行白平衡的运算了。第一个模型是平均值 的模型,也就是把 r 值向 rgb 的平均值的方向平衡。这里给了两个参数 R(ave)和 K (ave),分别是 r 分量的平均值和 rgb 三个分量的平均值的平均值。通过这个式子就可以得 到第一个方程,这里就是按照 gw 算法的思想写出的式子。同理下一个式子就是按照 pr 算法的 思想写出的式子。这两个式子联立就可以得到 uv 的值,进而就可以得到白平衡的运算结果。 程序也是实现了这一功能,进而得到了白平衡的运算结果。首先读取图片,获得图片的长宽 值。随后初始化一些值,比如输出图片的矩阵,记录最大值,平均值的变量等。随后利用一个 循环,遍历图像矩阵中每一个像素值,分别求出 rgb 三个通道平均值与最大值。随后求出三个 通道平均值的平均值与最大值的平均值记为 ak 与 mk,参与后续的运算。
这次作业的要求是阅读中文文献,实现其中提到的一种算法。然后和英文文献中的算法相 比较,看两种算法进行的白平衡处理有什么不同的效果。那么想要完成这一任务,首先就 要理解什么是白平衡。 白平衡说通俗一点,就是把图像从带颜色的光照中恢复原本的色彩。很多时候,由于环境 光不是纯白色,本来呈现白色的物体,比如说墙、白纸等,就会呈现出偏黄或者偏蓝的颜 色。白平衡的功能就是把图像中显示的颜色从这种颜色拉回白色。就和曝光补偿一样,很 多摄像机是带手动或自动色温功能的,这个算法就是自动白平衡算法。这里我将根据中文 文献中的算法来解释并分析我编写的 MATLAB 程序,之后再对比英文文献中算法的效果, 并分析区别产生的原因。我自己编写的代码如下:
其中 ave 代表均值。 可以看到,经过这种变化之后,rgb 的均值会变为一致。那么比如说原本图像偏蓝,b 分量 的值高,那么经过这种算法 b 分量值会降低,相对的 rg 分量值会提高。最终图像就会接近 原本的颜色。但是这个算法有很大的局限性。比如一张照片拍摄的是海面,那必然蓝色的 分量会大大多于其余两种。那么经过这种算法过后,本身应该是蓝色的色调被变化为了其 他颜色,显然是没有达到预期效果的。 然后我们来说一说 pr 也就是全反射理论算法。这个算法的思想是把图形中最亮的一点当做 是白色点,然后以此颜色作为白色的模板对其他颜色的像素进行变化。基本的算法如下:
之后这一串复杂的式子就是解方程的过程。通过移项与加减消元的算法可以通过一个通道的平 均值与最大值求出一个通道的 u 值,进而通过带入消元的方法求出对应的 v 值。随后把这两个 值带入白平衡公式,就得到了最后白平衡的结果。 然后我们来对比两个算法得到的白平衡结果:
最上面的图是原图,而下面两张图则是分别用两种方法白平衡的结果。左边那张图是用上述程 序实现的白平衡,右边那张图则是用英文文献中的算法实现的。从大体的颜色趋势上来看,左 边的图红色分量偏多,而右边的图蓝色分量偏多。而本身室内真正的颜色应该是没有偏向的, 应该是介于二者之间,可能更偏向右图一点。而导致这一效果的原因应该是两种白平衡算法上 的区别。 前面介绍过第一种算法,右边这张图采用的算法具有更强的适应性与更小的误差。首先其采样
end if(mb<f(i,j,3)) mb=f(i,j,3); end ar=ar+f(i,j,1); ag=ag+f(i,j,2); ab=ab+f(i,j,3); end end mk=(mr+mg+mb)/3.0; ak=(ar/m/n+ag/m/n+ab/m/n)/3; ur=(mk*ar-ak*mr)/(mr*mr*ar-ar*ar*mr); vr=(ak-ur*ar*ar)/ar; ug=(mk*ag-ak*mg)/(mg*mg*ag-ag*ag*mg); vg=(ak-ug*ag*ag)/ag; ub=(mk*ab-ak*mb)/(mb*mb*ab-ab*ab*mb); vb=(ak-ub*ab*ab)/ab; for i=1:m for j=1:n f1(i,j,1)=ur*f(i,j,1)*f(i,j,1)+vr*f(i,j,1); f1(i,j,2)=ug*f(i,j,2)*f(i,j,2)+vg*f(i,j,2); f1(i,j,3)=ug*f(i,j,3)*f(i,j,3)+vb*f(i,j,3); end end imshow(f1);
其中 max 代表最大值,w 代表设定的 white 值。 这种算法实际上是一种类似反求光源的算法。Rgb 值最高的一点如果确实是对应白色的
话,那么其在原本图像中呈现的颜色,就能很好的反应光源的颜色。然后把这个点通过增 益调整为白色,其实就相当于把环境光由非纯白色调整为纯白色,这样就达到了白平衡的 效果。 但是同前面一种算法一样,这种算法也有一定的局限性,需要优化。首先就是一个点的颜 色很可能具有偶然性,比如全图中最亮的像素本身就是黄色的,那么白平衡的结果就是把 所有黄色都变淡了。因此使用这种算法时多是取最亮的几个点的平均值作为最大值,或者 与其他算法配合起来使用。 然后就要提到 GW 和 PR 正交组合算法,这个算法的具体运算过程如下:
的点并不是一个点或者某一个分量的最大值,而是强度高于一个界限的所有点,默认采用的参 数是图像中前 4%亮的点的参数。其次其用来计算增益的模型是一个三次函数模型,比我们使用 的模型参数更多,也就有更好的矫正效果。 当然即使如此,这种算法也不是最有效的白平衡算法。根据不同的场景,各种白平衡算法也各 有优势和劣势。
这里采用了中文文献中提到的第三个算法。也就是 GW 和 PR 正交组合算法。这个算法融合了之 前提到的两个算法,因此首先要理解之前两个算法,才能帮助我们理解这里用到的算法。首先 我们来说 gw 也就是灰度世界算法。
这里有一个著名的假设-灰度世界理论假设: 任一幅图像,当它有足够的色彩变化,则它的 RGB 分量的均值会趋于相等。也就是说当图像的色彩足够丰富时,rgb 三个值的平均数会趋 于相等。在这个假设的前提下,就有了这样一种白平衡算法:
可以看到这里也是如上用到了平均值与最大值,但是和之前不同的是,这里有了一次分量和二 次分量,而且也有了 uv 两个参数。其基本的原理就是先确定一个二次的白平衡公式:
Hale Waihona Puke Baidu
随后通过两个确定的目标模型求出 uv 值,就可以进行白平衡的运算了。第一个模型是平均值 的模型,也就是把 r 值向 rgb 的平均值的方向平衡。这里给了两个参数 R(ave)和 K (ave),分别是 r 分量的平均值和 rgb 三个分量的平均值的平均值。通过这个式子就可以得 到第一个方程,这里就是按照 gw 算法的思想写出的式子。同理下一个式子就是按照 pr 算法的 思想写出的式子。这两个式子联立就可以得到 uv 的值,进而就可以得到白平衡的运算结果。 程序也是实现了这一功能,进而得到了白平衡的运算结果。首先读取图片,获得图片的长宽 值。随后初始化一些值,比如输出图片的矩阵,记录最大值,平均值的变量等。随后利用一个 循环,遍历图像矩阵中每一个像素值,分别求出 rgb 三个通道平均值与最大值。随后求出三个 通道平均值的平均值与最大值的平均值记为 ak 与 mk,参与后续的运算。
这次作业的要求是阅读中文文献,实现其中提到的一种算法。然后和英文文献中的算法相 比较,看两种算法进行的白平衡处理有什么不同的效果。那么想要完成这一任务,首先就 要理解什么是白平衡。 白平衡说通俗一点,就是把图像从带颜色的光照中恢复原本的色彩。很多时候,由于环境 光不是纯白色,本来呈现白色的物体,比如说墙、白纸等,就会呈现出偏黄或者偏蓝的颜 色。白平衡的功能就是把图像中显示的颜色从这种颜色拉回白色。就和曝光补偿一样,很 多摄像机是带手动或自动色温功能的,这个算法就是自动白平衡算法。这里我将根据中文 文献中的算法来解释并分析我编写的 MATLAB 程序,之后再对比英文文献中算法的效果, 并分析区别产生的原因。我自己编写的代码如下:
其中 ave 代表均值。 可以看到,经过这种变化之后,rgb 的均值会变为一致。那么比如说原本图像偏蓝,b 分量 的值高,那么经过这种算法 b 分量值会降低,相对的 rg 分量值会提高。最终图像就会接近 原本的颜色。但是这个算法有很大的局限性。比如一张照片拍摄的是海面,那必然蓝色的 分量会大大多于其余两种。那么经过这种算法过后,本身应该是蓝色的色调被变化为了其 他颜色,显然是没有达到预期效果的。 然后我们来说一说 pr 也就是全反射理论算法。这个算法的思想是把图形中最亮的一点当做 是白色点,然后以此颜色作为白色的模板对其他颜色的像素进行变化。基本的算法如下:
之后这一串复杂的式子就是解方程的过程。通过移项与加减消元的算法可以通过一个通道的平 均值与最大值求出一个通道的 u 值,进而通过带入消元的方法求出对应的 v 值。随后把这两个 值带入白平衡公式,就得到了最后白平衡的结果。 然后我们来对比两个算法得到的白平衡结果:
最上面的图是原图,而下面两张图则是分别用两种方法白平衡的结果。左边那张图是用上述程 序实现的白平衡,右边那张图则是用英文文献中的算法实现的。从大体的颜色趋势上来看,左 边的图红色分量偏多,而右边的图蓝色分量偏多。而本身室内真正的颜色应该是没有偏向的, 应该是介于二者之间,可能更偏向右图一点。而导致这一效果的原因应该是两种白平衡算法上 的区别。 前面介绍过第一种算法,右边这张图采用的算法具有更强的适应性与更小的误差。首先其采样
end if(mb<f(i,j,3)) mb=f(i,j,3); end ar=ar+f(i,j,1); ag=ag+f(i,j,2); ab=ab+f(i,j,3); end end mk=(mr+mg+mb)/3.0; ak=(ar/m/n+ag/m/n+ab/m/n)/3; ur=(mk*ar-ak*mr)/(mr*mr*ar-ar*ar*mr); vr=(ak-ur*ar*ar)/ar; ug=(mk*ag-ak*mg)/(mg*mg*ag-ag*ag*mg); vg=(ak-ug*ag*ag)/ag; ub=(mk*ab-ak*mb)/(mb*mb*ab-ab*ab*mb); vb=(ak-ub*ab*ab)/ab; for i=1:m for j=1:n f1(i,j,1)=ur*f(i,j,1)*f(i,j,1)+vr*f(i,j,1); f1(i,j,2)=ug*f(i,j,2)*f(i,j,2)+vg*f(i,j,2); f1(i,j,3)=ug*f(i,j,3)*f(i,j,3)+vb*f(i,j,3); end end imshow(f1);
其中 max 代表最大值,w 代表设定的 white 值。 这种算法实际上是一种类似反求光源的算法。Rgb 值最高的一点如果确实是对应白色的
话,那么其在原本图像中呈现的颜色,就能很好的反应光源的颜色。然后把这个点通过增 益调整为白色,其实就相当于把环境光由非纯白色调整为纯白色,这样就达到了白平衡的 效果。 但是同前面一种算法一样,这种算法也有一定的局限性,需要优化。首先就是一个点的颜 色很可能具有偶然性,比如全图中最亮的像素本身就是黄色的,那么白平衡的结果就是把 所有黄色都变淡了。因此使用这种算法时多是取最亮的几个点的平均值作为最大值,或者 与其他算法配合起来使用。 然后就要提到 GW 和 PR 正交组合算法,这个算法的具体运算过程如下:
的点并不是一个点或者某一个分量的最大值,而是强度高于一个界限的所有点,默认采用的参 数是图像中前 4%亮的点的参数。其次其用来计算增益的模型是一个三次函数模型,比我们使用 的模型参数更多,也就有更好的矫正效果。 当然即使如此,这种算法也不是最有效的白平衡算法。根据不同的场景,各种白平衡算法也各 有优势和劣势。
这里采用了中文文献中提到的第三个算法。也就是 GW 和 PR 正交组合算法。这个算法融合了之 前提到的两个算法,因此首先要理解之前两个算法,才能帮助我们理解这里用到的算法。首先 我们来说 gw 也就是灰度世界算法。
这里有一个著名的假设-灰度世界理论假设: 任一幅图像,当它有足够的色彩变化,则它的 RGB 分量的均值会趋于相等。也就是说当图像的色彩足够丰富时,rgb 三个值的平均数会趋 于相等。在这个假设的前提下,就有了这样一种白平衡算法: