Matlab常用白平衡算法
matlab颜色数值

matlab颜色数值1. 引言Matlab是一种广泛应用于科学计算和工程领域的编程语言和环境。
在Matlab中,颜色的数值表示是一项重要的功能,它允许用户在绘图、图像处理和数据可视化等方面进行精确的控制。
本文将深入探讨Matlab中颜色数值的相关知识,包括RGB、HSV、CMYK等不同表示方式,以及如何使用这些数值来创建各种吸引人的图形效果。
2. RGB表示方式RGB是一种将颜色表示为红、绿、蓝三个分量混合而成的模型。
在Matlab中,RGB数值通常使用0到255之间的整数来表示。
例如,纯红色可以用(255,0,0)来表示。
通过调整这三个分量的数值可以创建出各种不同亮度和饱和度的颜色。
3. HSV表示方式HSV是一种将颜色表示为色调(Hue)、饱和度(Saturation)和亮度(Value)三个分量组合而成的模型。
在Matlab中,HSV数值通常使用0到1之间的小数来表示。
通过调整这三个分量可以实现更加直观且易于理解的颜色控制。
4. CMYK表示方式CMYK是一种将颜色表示为青、品红、黄、黑四个分量混合而成的模型。
在Matlab中,CMYK数值通常使用0到1之间的小数来表示。
CMYK模型常用于打印颜色的控制,通过调整这四个分量可以实现更准确的颜色匹配。
5. Matlab中颜色数值的应用在Matlab中,颜色数值广泛应用于图形绘制、图像处理和数据可视化等方面。
通过精确控制颜色数值,用户可以创建出各种吸引人且具有个性化特点的图形效果。
6. 图形绘制中的颜色控制在Matlab中,用户可以使用RGB、HSV或CMYK等表示方式来指定绘图对象(如线条、点和面)的颜色。
通过调整这些数值可以实现对线条粗细和透明度等方面进行精确控制。
7. 图像处理中的颜色控制在Matlab中,用户可以使用RGB或HSV等表示方式来对图像进行处理。
通过调整这些数值可以实现对亮度、对比度和饱和度等方面进行精确调整。
8. 数据可视化中的颜色控制在Matlab中,用户可以使用RGB或HSV等表示方式来创建各种数据可视化效果。
面阵ccd颜色识别与变换matlab代码

一、引言面阵CCD(Charge-Coupled Device)是一种常用的图形传感器,可用于获取图像信息。
在计算机视觉领域,图像的颜色识别与变换是一项重要的任务,而MATLAB作为一种强大的技术计算软件,提供了丰富的工具和函数,可以帮助我们实现对面阵CCD图像的颜色识别与变换。
本文将介绍如何利用MATLAB实现对面阵CCD图像的颜色识别与变换,并给出相应的代码和示例。
二、面阵CCD颜色识别1. 获取图像在进行面阵CCD颜色识别之前,首先需要获取一张面阵CCD图像。
可以通过MATLAB的图像处理工具箱中的函数来读取图像,例如imread函数。
2. 颜色空间转换面阵CCD图像通常以RGB颜色空间表示,而在进行颜色识别时,通常会将图像转换到其他颜色空间,比如HSV或Lab颜色空间。
可以利用MATLAB提供的rgb2hsv和rgb2lab函数来实现颜色空间的转换。
3. 颜色分割一旦图像转换到目标颜色空间,就可以进行颜色分割操作,将目标颜色区域提取出来。
MATLAB提供了一系列的图像分割函数,比如imfindcircles和regionprops,可以根据特定的颜色特征来分割图像。
三、面阵CCD颜色变换1. 色彩空间转换对于面阵CCD图像的颜色变换,我们可以利用MATLAB提供的颜色空间转换函数,比如rgb2gray和rgb2hsv,将图像转换到目标色彩空间。
2. 色彩增强一旦图像转换到目标色彩空间,就可以对图像进行色彩增强操作。
MATLAB中的imadjust函数可以帮助我们对图像的色彩进行调整,以实现颜色的变换和增强。
3. 色彩映射我们还可以利用MATLAB提供的颜色映射函数,比如ind2rgb和imfuse,将图像的颜色映射到其他色彩空间或者进行多通道的颜色融合。
四、MATLAB代码示例以下是一个简单的MATLAB代码示例,用于实现面阵CCD图像的颜色识别与变换:```matlab读取图像img = imread('ccdim.png');颜色空间转换img_hsv = rgb2hsv(img);颜色分割mask = img_hsv(:,:,1) > 0.5 img_hsv(:,:,2) > 0.3;显示结果subplot(1,2,1), imshow(img), title('原始图像');subplot(1,2,2), imshow(mask), title('颜色分割结果');```五、结论本文介绍了如何利用MATLAB实现对面阵CCD图像的颜色识别与变换,并给出了相应的代码和示例。
白平衡算法总结

Cb(i, j) − Mb ) N Cr(i, j) − Mr ) N
Dr =
i ,j (
为了提高算法的稳健性,将图片分为几个区域并且计算每个区域 的 Mb、Mr、Db、Dr,如果一个区域的 Db,Dr 太小,那么这个区域 就没有足够的色彩变化,就可以丢弃掉了。这样可以避免大面积的统 一色调对结果的影响。
8
%计算 Cb、Cr 的均值 Mb、Mr% Mb=sum(sum(Cb)); Mr=sum(sum(Cr)); Mb=Mb/(x*y); Mr=Mr/(x*y); %计算 Cb、Cr 的均方差% Db=sum(sum(Cb-Mb))/(x*y); Dr=sum(sum(Cr-Mr))/(x*y); %根据阀值的要求提取出 near-white 区域的像素点% cnt=1; for i=1:x for j=1:y b1=Cb(i,j)-(Mb+Db*sign(Mb)); b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr)); if (b1<abs(1.5*Db) & b2<abs(1.5*Dr)) Ciny(cnt)=Lu(i,j); tst(i,j)=Lu(i,j); cnt=cnt+1; end end end cnt=cnt-1;
9
iy=sort(Ciny,'descend');%将提取出的像素点从亮度值大的点到小 的点依次排列% nn=round(cnt/10); Ciny2(1:nn)=iy(1:nn);%提取出 near-white 区域中 10%的亮度值较 大的像素点做参考白点% %提取出参考白点的 RGB 三信道的值% mn=min(Ciny2); c=0; for i=1:x for j=1:y if tst(i,j)<mn tst(i,j)=0; else tst(i,j)=1; c=c+1; end end end R=im(:,:,1); G=im(:,:,2); B=im(:,:,3); R=double(R).*tst;
白平衡算法——gamma算子

传统CRT:
二、基于伽马变换的图像增强
原理步骤:
归一化
补偿
反归一化
二、伽马变换原理
归一化: y cr , r [0,1]
将像素值转换为 0 ~ 1 之间的实数。 算法如下 :r= ( i + 0. 5)/256 这里包含 1 个除 法和 1 个加法操作。对于像素 A 而言 , 其对应的归一化值为 0. 783203 。
LUT[i] = intTemp; }
二、程序的实现
//单通道 if (resultImage->nChannels == 1) {
for (int i = 0; i < resultImage->height; i++) {
for (int j = 0; j < resultImage->width; j++) {
假设像素值 i=200
1 1 0.4545
gamma 2.2 0.783203 0.894872
二、伽马变换原理
反归一化:
将经过预补偿的实数值反变换为 0 ~ 255 之间的整数值。具体算法为 : f*256 - 0.
5 此步骤包含一个乘法和一个减法运算。续前 例 , 将 A 的预补偿结果 0. 894872
float f = (i + 0.5f) / 255; f = (float)(pow(f, kFactor)); int intTemp = f*255.0f - 0.5f; if(intTemp<0) {
intTemp=0; } else if(intTemp>255) {
intTemp=255; }
MATLAB的7种滤波方法(重制版)

MATLAB的7种滤波方法(重制版)滤波是信号和图像处理中常用的一种方法,用于去除噪音,增强信号或图像的特征。
MATLAB提供了丰富的滤波函数和工具箱,包括7种常用的滤波方法,分别是均值滤波、中值滤波、高斯滤波、拉普拉斯滤波、Sobel滤波、Prewitt滤波和Canny边缘检测。
1.均值滤波:均值滤波是使用一个窗口对图像进行平滑处理的方法,窗口内的像素值取平均值作为输出像素值。
这种滤波方法可以有效地去除高频噪声,但会导致图像细节的模糊。
2.中值滤波:中值滤波是一种非线性滤波方法,它使用一个窗口对图像进行平滑处理,窗口内的像素值按照大小排序,然后取中值作为输出像素值。
这种滤波方法能够很好地去除椒盐噪声和脉冲噪声,但无法处理其他类型的噪声。
3.高斯滤波:高斯滤波是一种线性平滑滤波方法,它使用一个高斯函数对图像进行卷积处理,窗口内的像素值按照高斯分布加权求和作为输出像素值。
这种滤波方法能够平滑图像并保持图像的细节信息,但会导致图像的边缘模糊。
4.拉普拉斯滤波:拉普拉斯滤波是一种边缘增强滤波方法,它使用一个拉普拉斯算子对图像进行卷积处理,突出图像中的边缘信息。
这种滤波方法能够提高图像的锐度和对比度,但会增强图像中的噪声。
5. Sobel滤波:Sobel滤波是一种边缘检测滤波方法,它使用Sobel算子对图像进行卷积处理,突出图像中的边缘信息。
这种滤波方法能够检测出图像中的水平和垂直边缘,但对于斜向边缘检测效果较差。
6. Prewitt滤波:Prewitt滤波是一种边缘检测滤波方法,它使用Prewitt算子对图像进行卷积处理,突出图像中的边缘信息。
与Sobel滤波类似,Prewitt滤波也能够检测出图像中的水平和垂直边缘,但对于斜向边缘检测效果较差。
7. Canny边缘检测:Canny边缘检测是一种广泛应用的边缘检测算法,它使用多个步骤对图像进行处理,包括高斯滤波、计算梯度、非极大值抑制和双阈值处理。
这种滤波方法能够检测出图像中的所有边缘,并进行细化和连接,对于复杂的边缘检测有较好的效果。
自动白平衡(AWB)算法

自动白平衡(AWB)算法色温曲线本文大体讲解了白平衡的算法流程,适用于想了解和学习白平衡原理的筒子们.一般情况下要实现AWB算法需要专业的图像和算法基础,本文力图通过多图的方式,深入浅出,降低初学者理解上的门槛,让大家都理解到白平衡算法流程.看到这里还在继续往下瞄的同学,一定知道了色温的概念,并且知道sensor原始图像中的白色如果不经AWB处理,在高色温(如阴天)下偏蓝,低色温下偏黄,如宾馆里的床头灯(WHY!OTZ) (如下图).下面这个T恤的图片非常经典,怎么个经典后续再说,不过大体可以看出有偏黄和偏蓝的情况.虽然如此,却已经是AWB矫正以后的效果.所以,为了眼前的女神白富美在镜头里不变成阿凡达和黄脸婆,这时就需要白平衡来工作了.流程原理很简单:1,在各个色温下(2500~7500)拍几张白纸照片,假设拍6张(2500,3500…7500),可以称作色温照.2,把色温照进行矫正,具体是对R/G/B通道进行轿正,让偏色的白纸照变成白色,并记录各个通道的矫正参数.实际上只矫正R和B通道就可以,这样就得到了6组矫正参数(Rgain,Bgain).3,上面是做前期工作,爱思考的小明发现,只要知道当前场景是什么色温,再轿正一下就可以了.事实上也就是如此.所以,AWB算法的核心就是判断图像的色温,是在白天,晚上,室内,室外,是烈日还是夕阳,还是在阳光下的沙滩上.或者是在卧室里”暖味”的床头灯下.之前拍了6张色温照以及6组矫正参数.可是6够么,当然不够, 插值一下可以得到无数个值,我们把点连成线, 得到了一个神奇的曲线------色温曲线.大概是下面这个样子.上面提到了三个值(RG,BG,色温),这应该是个三维的.没关系,我们再来一条RG跟色温的曲线,这样只要知道色温,就知道RG,知道RG,就知道BG,知道RG,BG就能轿正了,yes!至此,我们的前期工作已经全部做完了, 并得到了AWB的色温曲线,下一步只要计算得到当前色温,顺藤摸瓜就能得到当前的矫正参数(Rgain,Bgain),那白平衡的工作就作完了.(放心,当然没这么简单)第一部分先到这里,下一部分将讲解AWB算法的核心------计算图像色温.涉及到的知识点大致有图像分块, 判断白区, 根据色温曲线划分不同光源, 对不同光源加权平均得到实际色温.色温计算首先简单说一下流程:1, 取一帧图像数据,并分成MxN块,假设是25x25,并统计每一块的基本信息(,白色像素的数量及R/G/B通道的分量的均值).2, 根据第1步中的统计值, 找出图像中所有的白色块,并根据色温曲线判断色温.3, 至此,我们得出来了图像中所有的可能色温,如果是单一光源的话,可以取色温最多的,当作当前色温.比如25x25=625 个块中,一共找出了100个有效白色块, 里面又有80个白色块代表了色温4500左右, 那当前色温基本就是4500.根据4500色温得出的Rgain,Bgain来调整当前图像,就不会差(很多!).下面我们再详细讲解一下,每一步中需要做的工作:第1步, 计算每一块的基本信息.关于白色像素统计,大家知道sensor原始图像是偏色的,怎么统计块中的白色点呢,那只有设置一个颜色范围,只要在范围中,就可以认为是白色像素,范围见下图:统计白色像素个数的用处是,1,如果块中的白色像素太少,可以抛弃掉. 2,如果白色像素太多,多到每一个像素点都是,那也要抛弃掉,因为很可能在该区域过曝了接着把统计到的白色像素点R/G/B取均值, 并得到该block 的R/G, B/G值至此,我们得到了每一块的白点数目及R/G,B/G的值. (请自动对应第1部分中色温曲线).第二步计算当前色温这个比较复杂, 大自然绚丽多彩,景色万千. 上一步中统计的”白色点”难免会有失误的地方,比较常见的如黄色皮肤容易被误判为低色温下的白点,淡蓝色的窗帘,容易被误判为高色温下的白点,一张图中既有白色,也有黄色,也有蓝色的时候,是不是感觉情况有点复杂,其它的大家可继续脑补.这时我们需要一定的策略来正确的判断出到哪个才是真的白.通常我们会把取到的白色块,计算一下到曲线的距离,再设置相应的权重.话不多说,上个图大家就都明白了.假设有上面这样一幅图,该图是在没有开AWB的前提下截取的,可以看到左边白色地方略有偏绿,当前色温是室内白炽灯,大概4000~5000k左右.(请忽略颜色不正的问题,我们在讨论白平衡)下面我们就根据之前的统计信息和测量好的色温曲线进行白平衡矫正.首先要找出白区,如下图:上面这个图中的数字标示出了检测到的白色区域,数字相同的表示一个白区,根据统计信息(白点数,rg/bg值)来区分的.可以看到有误判的地方,比如色卡左上第二块的肤色块.还有最右边从上面数第二块也是容易被判断成低色温白块的情况.针对这种误判的情况,对不同块根据统计信息进行权重设置,以求让误判的区域对最终结果影响小一些.上面这个图标注了权重,基本是根据统计信息中白点数来确定的.可以看到图中一片白色被标识了高权重.其它情况被标识了低权重. 权重高低一是看块中白色点数量,二是看rg/bg到色温曲线的距离.通过上面两个图,大家就可以明显的找到白色区,并根据曲线来矫正,即使不通过曲线矫正,把白色区的r/g,b/g值向1趋近,让r=g=b,也会得到非常好的白平衡效果.如下图所示:至此,白平衡的基本流程就讲完了,有图有真相,大家一定看着也方便.总结一下:第一次做白平衡,感觉理论很简单,不用什么基础也能看懂.实际算法调试时,可谓差之毫厘,失之千里.总是感觉不由自主就走上歪路.中间参考了大量资料,比如网上有许多基于色温/灰度世界/白点检测的白平衡算法,实际个人感觉应该把它们都结合起来,让算法强壮,健康才是我们想要的.还记得第一章中开始的那两张白色T恤的图么,算了,我再贴一下:这张图可以理解为在多光源下的白平衡调整.阴影色温比阳光下色温要高一些,如果阳光下是5000k,阴影可能是7000k.有光就有影,它们经常出现在一个镜头里,对着其中一个色温调,另一边就会偏色.为了整体效果好,要把翘翘板平衡起来,可以加一些策略在里面.。
数字图像处理12-白平衡算法

其中 max 代表最大值,w 代表设定的 white 值。 这种算法实际上是一种类似反求光源的算法。Rgb 值最高的一点如果确实是对应白色的
话,那么其在原本图像中呈现的颜色,就能很好的反应光源的颜色。然后把这个点通过增 益调整为白色,其实就相当于把环境光由非纯白色调整为纯白色,这样就达到了白平衡的 效果。 但是同前面一种算法一样,这种算法也有一定的局限性,需要优化。首先就是一个点的颜 色很可能具有偶然性,比如全图中最亮的像素本身就是黄色的,那么白平衡的结果就是把 所有黄色都变淡了。因此使用这种算法时多是取最亮的几个点的平均值作为最大值,或者 与其他算法配合起来使用。 然后就要提到 GW 和 PR 正交组合算法,这个算法的具体运算过程如下:
可以看到这里也是如上用到了平均值与最大值,但是和之前不同的是,这里有了一次分量和二 次分量,而且也有了 uv 两个参数。其基本的原理就是先确定一个二次的白平衡公式:
随后通过两个确定的目标模型求出 uv 值,就可以进行白平衡的运算了。第一个模型是平均值 的模型,也就是把 r 值向 rgb 的平均值的方向平衡。这里给了两个参数 R(ave)和 K (ave),分别是 r 分量的平均值和 rgb 三个分量的平均值的平均值。通过这个式子就可以得 到第一个方程,这里就是按照 gw 算法的思想写出的式子。同理下一个式子就是按照 pr 算法的 思想写出的式子。这两个式子联立就可以得到 uv 的值,进而就可以得到白平衡的运算结果。 程序也是实现了这一功能,进而得到了白平衡的运算结果。首先读取图片,获得图片的长宽 值。随后初始化一些值,比如输出图片的矩阵,记录最大值,平均值的变量等。随后利用一个 循环,遍历图像矩阵中每一个像素值,分别求出 rgb 三个通道平均值与最大值。随后求出三个 通道平均值的平均值与最大值的平均值记为 ak 与 mk,参与后续的运算。
均值白平衡原理

均值白平衡原理均值白平衡原理是数字图像处理中一种常用的白平衡算法。
它的基本原理是通过计算图像中的像素点的平均值,在不同的颜色通道上进行调整,使图像中的灰度平均值接近于理想的中值,从而实现消除图像中的色偏,恢复图像的真实色彩。
均值白平衡原理基于这样的假设:图像中的白色物体在不同的光照条件下在红绿蓝三个颜色通道上的亮度值应该是相等的。
但是由于光源的颜色温度及传感器响应的差异等因素的影响,图像中的白色物体在各个颜色通道上的亮度值并不相同,从而导致图像中的色偏。
为了消除这种色偏,均值白平衡算法首先需要计算图像中的像素点的平均值。
假设图像的大小为M×N,那么图像中的每个像素点可表示为一个R、G、B三个通道的向量(R,G,B)。
通过遍历图像的所有像素点,可以计算出图像中的每个通道上的像素值的平均值,分别记为R_avg、G_avg、B_avg。
接下来,通过将图像中的每个像素点的R、G、B三个通道的像素值分别除以对应通道的平均值,得到3个系数:Kr = R_avg / R,Kg = G_avg / G,Kb = B_avg / B。
然后将图像中的每个像素点的R、G、B三个通道的像素值乘以对应通道的系数,即R = R * Kr,G = G * Kg,B = B * Kb。
最后,将调整后的R、G、B三个通道的像素值分别映射到0到255的灰度范围内,即R = clip(R, 0, 255),G = clip(G, 0, 255),B =clip(B, 0, 255)。
通过以上步骤,均值白平衡算法实现了对图像中的白平衡进行校正。
它的基本思路是通过计算图像中的像素点的平均值,利用色彩分布的统计特性来实现灰度平衡,从而消除图像中的色偏,恢复图像的真实色彩。
同时,该算法的计算简单,实时性好,因此在实际应用中被广泛采用。
然而,均值白平衡算法也存在一些问题。
首先,该算法的基础假设是图像中存在白色物体,因此当图像中没有白色物体或者白色物体较少时,该算法的效果可能会较差。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
灰色世界法(grey world method)要计算未知光源的特性必须从图片中提取相关的统计特性。
当我们能够仅使用一个统计特性就获得未知光源特性时,算法就变得非常简单了。
在这种情况下,未知光源必须在整幅图片上都是统一的。
均值于是就成为了此类方法之下最好的统计指标。
而灰色世界法正是利用了均值作为估算未知光源的关键统计量。
从物理意义上说,灰色世界法假设自然界景物对于光线的平均反射的均值在总体上是个定值,这个定值近似地为“灰色”。
在给定图片的白平衡算法中,灰色世界假设图片中的反射面足够丰富,以至于可以作为自然界景物的一个缩影。
若这幅图片是在经典光源下拍摄的,其均值就应该等于灰色。
若这幅图是在非经典光源下拍摄的,那么均值就会大于或者小于灰色值。
而该均值对于灰色的偏离程度则反映了未知光源相对于已知光源的特性。
虽然这个方法比较简单,但是仍然可以从一些方面进行调整。
一个方面就是对于灰色的定义形式的选择。
包括对于光谱的定义、对于光谱成分的定义和在经典光源之下的RGB 的响应。
另一个更加重要的调整方面就是对于灰色的选择。
不管如何定义灰色,最佳的灰色之选必然是自然界实事上出现的灰色。
但是这个值是无法获得的(除非是合成数据),所以对于灰色的选择是不同的灰色世界算法的一个重要的区别点。
一个方法是假设这个灰色就是实事上的灰色。
也就是说反射光谱是均衡的。
给定光源之下的RGB 响应是纯白色对此光源的响应值的一部分。
比方说,可以使用50%作为反射率(虽然这个灰色值对于人眼视觉习惯而言可能过于明亮)。
另一种方法,就是根据大量的数据提炼出一个均值,并把它定义为灰色。
这种方法提炼的灰色值可能因为数据库使用的不同而有所不同。
最终提炼的灰色也能仅适用于原始的数据库,而对于数据库未包括的图片的适用度就会比较差一些。
确定下来的灰色表达形式可以用Grey i c来表示。
下标i 表示信道,上标c 为canonical 的首字母,表示经典光源。
在确定灰色的表达形式后只要用RGB 响应与经典光源下灰色的比值来归一化图片就可以了。
假设RGB 响应均值为Ave i u,下标i 表示信道,上标U 为Unknown 的首字母,表示未知光源。
那么归一化率的计算式为σi如下式所示:σi = Grey i cAve i u根据光源转换理论,从未知光源到经典光源下图片表达式的转换式如下式所定义:ρ⃑c=[σ1σ2σ3]∙ρ⃑u那么,灰色世界法的计算过程如下图所示:本实验选择的灰色值为(129,129,129),具体的matlab实现程序如下:%灰色世界法%clear all; %清屏%img=imread('b1.bmp'); %读取位图的rgb值并存在名为img的三维矩阵中%AveR=mean(mean(img(:,:,1))); %计算R通道的均值%AveG=mean(mean(img(:,:,2))); %计算G通道的均值%AveB=mean(mean(img(:,:,3))); %计算B通道的均值%Qr=129/AveR; %计算R通道的归一化率Qr%Qg=129/AveG; %计算G通道的归一化率Qg%Qb=129/AveB; %计算B通道的归一化率Qb%%光源变换%img0(:,:,1)=Qr*img(:,:,1);img0(:,:,2)=Qg*img(:,:,2);img0(:,:,3)=Qb*img(:,:,3);figure,imshow(img0),title('变换后图片'); %显示图片%偏蓝图片白平衡调整后的图片正常光照下的图片基于动态阀值的自动白平衡法(Automatic White Balance Method)这个算法是通过对图片的ycbcr色空间的分析来确定参考白点的,所以次算法可以说是自适应白平衡算法。
本算法选择参考白点的阀值是动态变化的,所以对于不同的图片,其阀值也不同。
通过对图片的cbcr坐标空间的分析,我们可以看到一个接近白色的区域(near-white region)是包含着参考白点的。
通过这个思路,我们可以通过对图片分区,然后找出参考白点,然后在通过von kvies model来调整图片时期实现白平衡。
这样,这个算法就包括了两个步骤了:寻找参考白点,白点调整。
寻找参考白点:为了确定一个接近白色的区域,我们就必须把RGB色空间转换成YCbCr色空间。
色空间转换后,就是计算Cb、Cr的均值Mb、Mr;然后通过下式计算Cb、Cr的均方差Db、Dr:Db=∑(|Cb(i,j)−Mb|) i,jN⁄Dr=∑(|Cr(i,j)−Mr|) i,jN⁄为了提高算法的稳健性,将图片分为几个区域并且计算每个区域的Mb、Mr、Db、Dr,如果一个区域的Db,Dr太小,那么这个区域就没有足够的色彩变化,就可以丢弃掉了。
这样可以避免大面积的统一色调对结果的影响。
接下来就可以通过下面的关系式得到接近白色区域的所有像素点了:|Cb(i,j)−(Mb+Db×sign(Mb))|<1.5×Db|Cr(i,j)−(1.5×Mr+Dr×sign(Mr))|<1.5×Dr 根据亮度值,我们选择接近白色区域中的10%的候选参考白点最为参考白点。
在白点确定后,就可以从参考白点中得到信道增益的值了。
为了维持整幅图片的亮度不变,亮度的最大值被用来得到信道增益。
所以信道增益不及和参考白点有关还与亮度的最大值有关,其表达式如下:⁄R gain=Y max RavewG gain=Y max G⁄avewB gain=Y max B⁄avew其中Y max是整幅图片像素的亮度最大值,R avew、G avew和B avew是参考白点的RGB信道的均值。
最后,根据von-kvies model来调整图片,使其达到白平衡的效果。
调整的表达式如下:R=́R gain×RG=́G gain×GB=́B gain×B其中RGB是图片的像素点的三个信道值,ŔǴB́是调整之后的图片的像素点的三个信道值。
其源程序如下:%Program for white balancing%function W=wbalance(im)clear all;close all;%读取照片的信息%[filename, pathname] = uigetfile('*.jpg;*.bmp;*.gif', 'Pick an image-file');if isequal(filename,0)disp('User selected Cancel');elsedisp(['User selected', fullfile(pathname, filename)]);endfname=strcat(pathname,filename);im=imread(fname);im2=im;im1=rgb2ycbcr(im);%将图片的RGB值转换成YCbCr值% Lu=im1(:,:,1);Cb=im1(:,:,2);Cr=im1(:,:,3);[x y z]=size(im);tst=zeros(x,y);%计算Cb、Cr的均值Mb、Mr%Mb=sum(sum(Cb));Mr=sum(sum(Cr));Mb=Mb/(x*y);Mr=Mr/(x*y);%计算Cb、Cr的均方差%Db=sum(sum(Cb-Mb))/(x*y);Dr=sum(sum(Cr-Mr))/(x*y);%根据阀值的要求提取出near-white区域的像素点% cnt=1;for i=1:xfor j=1:yb1=Cb(i,j)-(Mb+Db*sign(Mb));b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr));if (b1<abs(1.5*Db) & b2<abs(1.5*Dr))Ciny(cnt)=Lu(i,j);tst(i,j)=Lu(i,j);cnt=cnt+1;endendendcnt=cnt-1;iy=sort(Ciny,'descend');%将提取出的像素点从亮度值大的点到小的点依次排列%nn=round(cnt/10);Ciny2(1:nn)=iy(1:nn);%提取出near-white区域中10%的亮度值较大的像素点做参考白点%%提取出参考白点的RGB三信道的值%mn=min(Ciny2);c=0;for i=1:xfor j=1:yif tst(i,j)<mntst(i,j)=0;elsetst(i,j)=1;c=c+1;endendendR=im(:,:,1);G=im(:,:,2);B=im(:,:,3);R=double(R).*tst;G=double(G).*tst;B=double(B).*tst;%计算参考白点的RGB的均值%Rav=mean(mean(R));Gav=mean(mean(G));Bav=mean(mean(B));Ymax=double(max(max(Lu)))/15;%计算出图片的亮度的最大值% %计算出RGB三信道的增益%Rgain=Ymax/Rav;Ggain=Ymax/Gav;Bgain=Ymax/Bav;%通过增益调整图片的RGB三信道%im(:,:,1)=im(:,:,1)*Rgain;im(:,:,2)=im(:,:,2)*Ggain;im(:,:,3)=im(:,:,3)*Bgain;%显示图片%W=im;figure,imshow(im2,[]),title('原图');figure,imshow(im,[]),title('白平衡后的效果图');黄偏色图片正常光照下的图片次算法的缺点是运行速度慢,但是对图片的还原效果还是比较显著的。
其他白平衡算法镜面法(Perfect Reflector Model)根据图像形成理论,对于纯白色的反射面而言,无论光源是什么颜色,最终反射后的颜色总能完全表现出光源的颜色。
如果景物中有纯白的部分,那么就可以直接从这些像素中提取出光源信息。
基于这种思想的方法都被称为是镜面法。
与灰色世界法类似的,镜面法也有多种调整方式。
在本文中着重介绍两种。
第一种方法较为基本也较为简便。
这种方法假设图片中一定有纯白色面存在,那么在经典光源下,图片中所有像素点三个信道的最大值都应该等于255,或者是一个给定的纯白色的值。
在任何其他的光源下,图片纯白色点的像素值就会小于经典光源下的纯白色,并且这些点将代表整幅图片中最亮的点。
那么只要将各信道的值按比例规一化到最大值(纯白色)就可以获得在经典光源下的图片了。