精华内容
下载资源
问答
  • 延迟:使用循环缓冲区插入延迟音频的概念证明。 用户界面允许用户动态改变干,湿信号,反馈水平和延迟时间之间的平衡。 第一个原型应该是合唱效果,镶边效果和其他类型延迟(例如乒乓延迟)的基础
  • AVL树 & 重平衡概念

    2017-12-24 17:14:00
    AVL树是有平衡条件二叉搜索树。这个平衡条件必须容易保持,而且需要保证树深度是O(logN)。 AVL=BBST  作为二叉搜索树最后一部分,我们来介绍最为经典一种平衡二叉搜索... 和动态操作角度讲,BST相对...

         AVL树是有平衡条件的二叉搜索树这个平衡条件必须容易保持而且需要保证树的深度是OlogN)

     

    • AVL=BBST

      作为二叉搜索树的最后一部分我们来介绍最为经典的一种平衡二叉搜索树AVL回顾此前的几节我们首先介绍的是二叉查找树BST。然而我们也能感受到,尽管从同时兼顾高效的静态操作

      和动态操作的角度讲,BST相对此前简单的向量和链表已经具有某种优势和潜质但是毕竟它并不能保证这一点其原因在于 它的高度无论是从平均情况 还是最坏情况都不能保证做到足够的低具体来说也就是做到logN以下当然——BST中的确存在一种特殊的类型也就是所谓的Complete Binary Tree它的高度可以达到严格的最小——也就是logN。然而相对于整体的BST这类BST的数量极少。而且将任何一棵树转化为一棵完全二叉树所需要的成本也太高,也正因如此,我们的建议是:或许应该适当地放松所谓“平衡”的标准。也就是说,只需考察某一类在渐近意义下不超O(logN)高度的树即可。而这样一类树,也就是我们所说的平衡二叉搜索树Balanced Binary Search TreeBBST。

     

         本节涉及概念及其关系

     

      比如我们这一节将要介绍的AVL就是在这种意义下的一种BBST。以AVL树为代表的这些BBST

      首先并没有放弃渐近意义logN的复杂度底线。同时正因为它已经适度地放松了平衡的标准,所以通过精巧地设计,它们都可以具有这样一种属性:具体来说,对于任何一棵这样意义下的BBST在其生命期内即便在某次操作之后它不再满足BBST的条件, 游离到BBST这个范畴之外,我们也可以通过上节所介绍的等价变换迅速地将其重新转化为一棵等价的BBST。也就是说可以通过极小的代价就使之重新归入BBST的范畴。而这种极小的代价是多少呢?不出你的意料——依然是不超过logN

     

      令刚刚失衡的搜索树重新恢复为一棵BBST的过程也称作重平衡Rebalance。而对于包括AVL树在内的各种BBST而言,其核心的技巧无非两条:

    •  如何来界定一种适度的平衡”标准

     

    • 其次则是一整套重平衡的技巧和算法

     

      以下我们就以AVL树为例具体地讲解如何完成这两项任务

     

      先不管具体AVL树的要求,先来想想,如果我们自己来设计平衡标准,该如何考虑呢?最简单的想法是,要求左右子树具有相同的高度,那这种想法不要求树的高度尽量低。但是……极端情况下可能出现两条左右分叉的单链,这就很心碎了。所以这个标准是远远不够的。

     

      再想想有没有更好的办法,(可达鸭眉头一皱,发现事情并不简单hhhh)于是我们想到了另一种平衡条件——要求每个节点都必须有同高的左右子树。可是这样一来又会出问题:因为空树-1,那就只有具有2^k-1个节点的理想平衡树(Perfect Binary Tree)满足了,这个适用性就太狭窄了……很扎心。因此,虽然这个条件保证了树的高度很低,但是太苛刻了,我们还要再放宽点条件。

      后来,凶暴死宅的计算机科学家们(误)想到了一个绝妙的点子,而且我这里地方够大,写得下hhhhh 用这个条件来限制:“让每个节点的左右子树高度最多差1”。可以证明,大致来讲一个AVL树的高度<=1.44log(N+2)-1.328

     

      这棵树的左子树是高度为7且节点数最少的AVL树,右子树是高度为8且节点数最少的AVL树。可以看出在高度为h的AVL树中,最少节点数S(h)=S(h-1) + S(h-2) + 1。对于h=0,S(h) = 1;h=1,S(h)=2。函数S(h)与斐波那契数密切相关,由此可以推出上面的关于AVL树的高度上界。

       有了上面的感性认识后我们来详细讨论、解释AVL树的各处细节,将上面给出的若干浓缩表述一一诠释

       首先给出在AVL的意义下什么叫做适度的平衡这要引入一个概念——平衡因子,凭它来判断一棵树是否是在AVL意义下的适度平衡

     

     平衡因子(Balanced  Factor)就是左子树的高度与右子树高度之差,BalFac(v)=heightlcv))- heightrcv))。结合上面发明者的定义

      

      那么很显然,这是一颗AVL树(通过校验每个节点的balFac,每处都上上下下不超过1):

      

     

      AVL树只考虑左右子树的高度,所以只有所有节点满足全局的单调性即可,并不需要关心具体的数值。我们应该把更多的关注点集中于每个节点的平衡因子上。从这个例子可以看出,AVL树未必是CBT,反过来说,如此定义的AVL树,是否适度平衡呢?

     

     

    • AVL=适度平衡

      可以证明,AVL树的确是适度平衡的——也就是说 一棵规模为N的AVL高度在渐近意义下是不超过logN的。

      

     

     

      实际上,为了证明规模固定的AVL高度不会超过某个上限,我们可以等价地证明:在高度固定的情况下,一棵AVL树的节点也不至于太少。具体来说,可以证明这样一个事实:对于高度固定为hAVL其中所包含的节点数,至少是与hfibonacci数关系。

      

     

      为了得到这个关系式,我们需要借助递推式。具体而言可以证明这样一个递推式:S(h)=S(h-1) + S(h-2) + 1,这也就是上面所给出的那个递推式。如果我们将高度为hAVL树的规模下限定义为S(h)的话,那么S(h)S(h-1)以及S(h-2)之间就满足这么样一个叠加的关系。

     

      为此,我们来考察那棵高度为h同时规模达到最小的AVL树。

     

      

      既然它的规模要达到最少,所以它的左子树和右子树的规模也应该尽可能少,那么在AVL树的定义下,可变化的余地充其量不过其中一棵子树比另一棵子树高一层。不失一般性,假设左子树比右子树高出一层,因为它的高度为h-1,所以它的规模下限自然也就是S(h-1)。同理,作为高度为h-2的右子树,它的规模下限自然也就是S(h-2)。当然——还不要忘了这里的树根节点。这也就是为什么我们还要再附加上一个单位1

     

       这个递推式是我们所有分析的核心,而以下只不过是一些简单的数学技巧而已。为此,我们不妨对它做一个等价变换——在左右各加一个1。

     

       S(h)+1=[S(h-1)+1 ]+ [S(h-2) + 1]

     

       接下来,如果我们将S(h)+1定义为一个新的函数T(h),就会发现递推式的右侧变成T(h-1) +T(h-2)。这种形式是fibonacci所特有的递推形式。所以我们可以断定它应该是等于fibonacci的某一项。那么具体的是从 h前后位移多少项呢?

       我们只需考察对应的边界情况即可:首先考察规模为1高度为0AVL树。此时的T(h)应该等于1+1这是fibonacci数的第三项。再来考察高度为1AVL树,其规模最小也不至低于2,也就是左子树为一个节点、右子树为空的一棵AVL树,此时的T(h)应该是2+1,这是fibonacci数的第四项。

     

     

       由此可见 这里的T(h),只不过是fibonacci向前位移了三位。我们知道fibonacci数,大致是呈Φ的指数形式增长,由此我们也得到了n关于高度h的一个下界。因此反过来等价地 n的对数,也就构成了h的一个上界。而这一点正是BBST所谓适度平衡的要求——这就意味着我们的AVL的确是适度平衡的。

     

      好了至此我们也就完成了第一项使命——也就是给出AVL意义下的,适度平衡标准。下一节将给出具体的重平衡(旋转操作)细节和插入新节点的算法。

     

     

     

     

     

     

    展开全文
  • 时间复杂度为O(logn)在46.5%情况下,需要把二叉树平衡化成“平衡二叉树”。 平衡二叉树 平衡二叉树(Balanced binary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出,所以又...

    二叉树

    左子树都小于根节点,右子树都大于根节点。可以动态维护这棵树(因为是树结构,可以有限步完成插入),所以是动态查找算法。时间复杂度为O(logn)在46.5%的情况下,需要把二叉树平衡化成“平衡二叉树”。

    平衡二叉树

    平衡二叉树(Balanced binary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出的,所以又称为AVL树。

    定义:平衡二叉树或为空树,或为如下性质的二叉排序树:

      (1)左右子树深度之差的绝对值不超过1;

      (2)左右子树仍然为平衡二叉树.

     平衡因子

    平衡因子bf=左子树深度-右子树深度,每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平衡的。增加一个元素后,平衡二叉树有可能变成不平衡了,所以需要旋转平衡调整。如图所示为平衡树和非平衡树示意图:

    2011060517003933.png 

    平衡二叉树算法思想

    若 向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于1的结点作为根的子树。假设用A表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。

     (1)LL型平衡旋转法

    由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行一次顺时针旋转操作。 即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。而原来B的右子树则变成A的左子树。

     2011060517023545.png

    (2)RR型平衡旋转法

    由于在A的右孩子C 的右子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行一次逆时针旋转操作。即将A的右孩子C向左上旋转代替A作为根结点,A向左下旋转成为C的左子树的根结点。而原来C的左子树则变成A的右子树。

    2011060517030690.png 

    (3)LR型平衡旋转法

    由于在A的左孩子B的右子数上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行两次旋转操作(先逆时针,后顺时针)。即先将A结点的左孩子B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。即先使之成为LL型,再按LL型处理。

    2011060517033328.png 

          如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到A的左子树上,此时成为LL型,再按LL型处理成平衡型。

    (4)RL型平衡旋转法  

    由于在A的右孩子C的左子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行两次旋转操作(先顺时针,后逆时针),即先将A结点的右孩子C的左子2011060517111237.png树的根结点D向右上旋转提升到C结点的位置,然后再把该D结点向左上旋转提升到A结点的位置。即先使之成为RR型,再按RR型处理。

     如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到A的左子树上,此时成为RR型,再按RR型处理成平衡型。

    平衡化靠的是旋转。参与旋转的是3个节点(其中一个可能是外部节点NULL),旋转就是把这3个节点转个位置。注意的是,左旋的时候p->right一定不为空,右旋的时候p->left一定不为空,这是显而易见的。

    如果从空树开始建立,并时刻保持平衡,那么不平衡只会发生在插入删除操作上,而不平衡的标志就是出现bf == 2或者 bf == -2的节点。

    插入和删除

    插入删除是互为镜像的操作。我们可以采用前面对二叉排序树的删除操作来进行。然后,在删除掉结点后,再对平衡树进行平衡化处理。删除之所以删除操作需要的平衡化可能比插入时次数多,就是因为平衡化不会增加子树的高度,但是可能会减少子树的高度,在有有可能使树增高的插入操作中,一次平衡化能抵消掉增高;在有可能使树减低的删除操作中,平衡化可能会带来祖先节点的不平衡。AVL树体现了一种平衡的美感,两种旋转是互为镜像的,插入删除是互为镜像的操作,没理由会有那么大的差别。实际上,平衡化可以统一的这样来操作:
    1、while (current != NULL)修改current的平衡因子。

    (1)插入节点时current->bf += (current->data > *p)?1:-1;

    (2)删除节点时current->bf -= (current->data > *p)?1:-1;

    (3)current指向插入节点或者实际删除节点的父节点,这是普通二叉搜索树的插入和删除操作带来的结果。*p初始值是插入节点或者实际删除节点的data。因为删除操作可能实际删除的不是data。

    2、判断是否需要平衡化

    if (current->bf == -2)     L_Balance(c_root);

    else if (current->bf == 2)  R_Balance(c_root);

    3、是否要继续向上修改父节点的平衡因子

    (1)插入节点时if (!current->bf) break;这时,以current为根的子树的高度和插入前的高度相同。

    (2)删除节点时if (current->bf) break;这时,以current为根的子树的高度和删除前的高度相同

    4、当前节点移动到父节点,转1。

    p = &(current->data); current = current->parent;

    欢迎大家提出问题,此贴正在整理中................

    转载于:https://www.cnblogs.com/Cmpl/archive/2011/06/05/2073217.html

    展开全文
  • 平衡是图像处理一个极重要概念。所谓白平衡(White Balance),就是对白色物体还原。当我们用肉眼观看这大千世界时,在不同光线下,对相同颜色感觉基本是相同,比如在早晨旭日初升时,我们看一个白色...

    白平衡是图像处理的一个极重要概念。所谓白平衡(White Balance),就是对白色物体的还原。当我们用肉眼观看这大千世界时,在不同的光线下,对相同的颜色的感觉基本是相同的,比如在早晨旭日初升时,我们看一个白色的物体,感到它是白的;而我们在夜晚昏暗的灯光下,看到的白色物体,感到它仍然是白的。这是由于人类从出生以后的成长过程中,人的大脑已经对不同光线下的物体的彩色还原有了适应性。但是,作为拍摄设备,如数码相机,可没有人眼的适应性,在不同的光线下,由于CCD输出的不平衡性,造成数码相机彩色还原失真。一般情况下,我们习惯性地认为太阳光是白色的,已知直射日光的色温是5200K左右,白炽灯的色温是3000K左右。用传统相机的日光片拍摄时,白炽灯光由于色温太低,所以偏黄偏红。所以通常现场光线的色温低于相机设定的色温时,往往偏黄偏红,现场光线的色温高于相机设定时,就会偏蓝。

    为了解决不同色温下,引起的白色漂移现象。由于白色对色温变化的响应最大,通常用白色来作为调整的基色。接下来主要介绍几种较为经典的白平衡算法。

    1.灰色世界法(grey world method)
    灰度世界算法假设给定的一幅色彩变化很大的图像的R、G、B元素的平均值合成是一种普通的灰色。这样我们就可以在一幅数码相机在特殊光源下拍摄的图片中应用灰度世界假设来去掉因光源而带来的模糊层面。一旦选择了一种普通灰度值,每一种色彩元素就可以应用Von Kries转化用以下的系数进行调整。这里,使用50%作为反射率,就是取灰度值为0.5或128。
    那么,灰色世界法的算法过程如下:
    1.灰色的选择,比如选50%作为反射率。
    2.计算RGB三通道的均值。
    3.计算各通道的增益。
    Rgain=grayRavgR_{gain} = \frac{gray}{R_{avg}}
    Ggain=grayGavgG_{gain} = \frac{gray}{G_{avg}}
    Bgain=grayBavgB_{gain} = \frac{gray}{B_{avg}}
    4.光源变换,即
    Rnew=min(RRgain,1)R_{new} = min(R*R_{gain},1)
    Gnew=min(GGgain,1)G_{new} = min(G*G_{gain},1)
    Bnew=min(BBgain,1)B_{new} = min(B*B_{gain},1)
    上面是为了防止像素值溢出,对三通道的像素值做了取小。

    当然,其中第一步灰色的选择,也有其他的选择,如取RGB三色的均值:
    gray=Ravg+Gavg+Bavg3gray = \frac{R_{avg}+G_{avg}+B_{avg}}{3}
    matlab程序如下

    function [output] = grey_awb(im)
    %% 基于灰色世界的自动白平衡,输入Im为RGB图像
    R_avg = mean(mean(im(:,:,1))); % 计算各通道均值
    G_avg = mean(mean(im(:,:,2)));
    B_avg = mean(mean(im(:,:,3)));
    
    grey = 0.5;  % 定义灰色值
    % K = mean([R_avg,G_avg,B_avg]);
    Rgain = grey/R_avg;
    Ggain = grey/G_avg;
    Bgain = grey/B_avg;
    
    im(:,:,1) = im(:,:,1).*Rgain;  % % 图像校正
    im(:,:,2) = im(:,:,2).*Ggain;
    im(:,:,3) = im(:,:,3).*Bgain;
    output = im
    

    2.基于动态阈值的自动白平衡

    该算法是通过将RGB变换到YCrCb色空间进行分析来确定参考白点的,其选择参考白点的阈值是动态变化的,我们通过对图片的YCrCb色坐标空间的分析,可以找到一个接近白色的区域(near white region),该区域是包含着参考白点的,通过设定一个阈值来规定某些点为参考白点。因此该算法是一个动态的自适应白平衡算法。
    该算法共分为两步:白色点的检测,白色点的调整。具体的算法过程如下:
    1.将图像从RGB空间变换到YCrCb空间
    Y=0.257R+0.504G+0.098B+16/255Y=0.257*R+0.504*G+0.098*B+16/255
    Cb=0.148R0.291G+0.439B+128/255Cb = -0.148*R-0.291*G+0.439*B+128/255
    Cr=0.439R0.368G0.071B+128/255Cr = -0.439*R-0.368*G-0.071*B+128/255
    2.白点检测:为了增强算法的鲁棒性,将图像分为12部分

    a.计算每个区域的Cr,Cb的均值Mr,Mb

    Mr=Cr(i,j)N,Mb=Cb(i,j)NM_r=\frac{\sum C_r(i,j)}{N},M_b=\frac{\sum C_b(i,j)}{N}
    N为每块区域的像素个数。

    b.计算每个区域的Cr,Cb分量的绝对偏差的均值Dr,Db:
    Dr=Cr(i,j)MrN,Db=Cb(i,j)MbND_r=\frac{\sum |C_r (i,j)-M_r|}{N},D_b=\frac{\sum |C_b(i,j)-M_b|}{N}

    c.如果Db,DrD_b,D_r的值偏小,则忽略这一块,因为这表明这一块的颜色分布比较均匀,而这样的局部对于白平衡不好。

    d.最后整幅图像的均值 Mb,Mr 以及方差 Db,Dr 由除去T条件c后剩下的块计算平均值得到。

    e.选择候补白点,若某像素满足一下条件:
    Cb(i,j)(Mb+Db×sign(Mb))&lt;1.5×DbC_b (i,j)-(M_b+D_b×sign(M_b))&lt;|1.5×D_b |
    Cb(i,j)(1.5×Mr+Dr×sign(Mr))&lt;1.5×DrC_b (i,j)-(1.5×M_r+D_r×sign(M_r))&lt;|1.5×D_r |
    3.然后根据候补白点的像素亮度值由高到低排列,从候补白点中选取亮度值在前 10%的白点做为参考白点。白平衡的增益值就是根据选取的参考白点确定的。

    为了让校正后的图像亮度跟校正前的图像亮度保持在同一水平,在增益计算时采用最大的亮度值作为参考。增益系数的计算公式公式如下:
    Rgain=YmaxRavgw,Ggain=YmaxGavgw,Bgain=YmaxBavgwR_{gain}=\frac{Y_{max}}{R_{avgw}},G_{gain}=\frac{Y_{max}}{G_{avgw}},B_{gain}=\frac{Y_{max}}{B_{avgw}}
    其中,Ravgw,Gavgw,BavgwR_{avgw},G_{avgw},B_{avgw}是参考白点的RGB三通道均值,YmaxY_{max}是图像中所有图像亮度的最大值。
    其matlab代码实现如下:

    function [output] = dynamic_awb_521(im)
    %% 基于阈值的动态白平衡
    [m,n,k] = size(im);
    R = im(:,:,1);
    G = im(:,:,2);
    B = im(:,:,3);
    Y = 0.257*R+0.504*G+0.098*B+16/255;
    Cb = -0.148*R-0.291*G+0.439*B+128/255;
    Cr = -0.439*R-0.368*G-0.071*B+128/255;
    
    row = m/3; % 将image分块4*4块,则row为每分块的行数
    col = n/3; %col为列数
    count = 1;
    Mb = 0;
    Mr = 0;
    Db = 0;
    Dr = 0;
    
    for i=1:row:m
        for j=1:col:n
            Ib = Cb(i:1:i+row-1,j:1:j+col-1); %每分块的Cb值
            Ir = Cr(i:1:i+row-1,j:1:j+col-1);
            Mbt = mean(mean(Ib)); % 分块的Cb均值
            Mrt = mean(mean(Ir)); % 分块的Cr均值
            Dbt = sum(sum(abs(Ib-Mbt)))/(row*col);% 分块的绝对偏差
            Drt = sum(sum(abs(Ir-Mrt)))/(row*col);
            Mb(count) = Mbt;
            Mr(count) = Mrt;
    %         if Dbt>0.01 && Drt>0.01  % 判断该分块的方差是否足够大
                Db(count) = Dbt;
                Dr(count) = Drt;
                count = count+1;
    %         end
        end
    end
    
    Mb = mean(Mb); %得到分块Mb的均值
    Mr = mean(Mr);
    Db = mean(Db);
    Dr = mean(Dr);
    J = zeros(m,n); % 记录候补白点的位置信息,若(i,j)位置为1,则(i,j)像素是候补白点
    
    for i=1:1:m
        for j=1:1:n
            bv = abs(Cb(i,j)-(Mb+Db*sign(Mb))); 
            rv = abs(Cr(i,j)-(1.5*Mr+Dr*sign(Mr)));
            if (bv<1.5*Db) && (rv<1.5*Dr) % 判断是否满足候补条件
                J(i,j) = 1;
            end
        end
    end
    candidate = reshape(Y.*J,m*n,1);
    candidate = sort(candidate,'descend'); % 将候补白点的亮度值Y降序排序
    kk = round(sum(sum(J))*0.1); 
    min_v = candidate(kk); % 得到前10%的最小值
    
    Y1 = (Y>(ones(m,n)*min_v));  % 得到参考白点的亮度矩阵
    R1 = R.*Y1; % RGB三通道的参考白点
    G1 = G.*Y1;
    B1 = B.*Y1;
    Ravg = sum(sum(R1))/sum(sum(Y1)); % 参考白点RGB三通道的均值
    Gavg = sum(sum(G1))/sum(sum(Y1));
    Bavg = sum(sum(B1))/sum(sum(Y1));
    Ymax = double(max(max(Y))); % 亮度最大值
    
    Rgain = Ymax/Ravg; % 计算增益
    Ggain = Ymax/Gavg;
    Bgain = Ymax/Bavg;
    % R = R*Rgain;
    % G = G*Ggain;
    % B = B*Bgain;
    im(:,:,1) = im(:,:,1)*Rgain;
    im(:,:,2) = im(:,:,2)*Ggain;
    im(:,:,3) = im(:,:,3)*Bgain;
    output = im;
    end
    
    展开全文
  • 平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题。白平衡是随着电子影像再现色彩真实而产生的,在专业摄像领域白平衡应用的较早,现在家用电子产品(家用摄像机、数码照相机...
    白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题。白平衡是随着电子影像再现色彩真实而产生的,在专业摄像领域白平衡应用的较早,现在家用电子产品(家用摄像机、数码照相机)中也广泛地使用,然而技术的发展使得白平衡调整变得越来越简单容易,但许多使用者还不甚了解白平衡的工作原理,理解上存在诸多误区。它是实现摄像机图像能精确反映被摄物的色彩状况,有手动白平衡和自动白平衡等方式,本文简要的介绍了几种自动白平衡算法。

    一、原始的灰度世界算法

      灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩变化的图像, R、 G、 B 三个分量的平均值趋于同一个灰度K。一般有两种方法来确定该灰度。

            (1)直接给定为固定值, 取其各通道最大值的一半,即取为127或128;

           (2)令 K = (Raver+Gaver+Baver)/3,其中Raver,Gaver,Baver分别表示红、 绿、 蓝三个通道的平均值。

             算法的第二步是分别计算各通道的增益:

               Kr=K/Raver;

        Kg=K/Gaver;

               Kb=K/Baver;

           算法第三步为根据Von Kries 对角模型,对于图像中的每个像素R、G、B,计算其结果值:

                 Rnew = R * Kr;

        Gnew = G * Kg;

         Bnew = B * Kb;

             对于上式,计算中可能会存在溢出(>255,不会出现小于0的)现象,处理方式有两种。

             a、 直接将像素设置为255,这可能会造成图像整体偏白。

             b、 计算所有Rnew、Gnew、Bnew的最大值,然后利用该最大值将将计算后数据重新线性映射到[0,255]内。实践证明这种方式将会使图像整体偏暗,建议采用第一种方案。

    二、完美反射算法

          当初写这个代码的时候的一些参考文献一下子也找不到了,就从已经写好的代码中描述下该算法的过程吧。

          原理:完美全反射理论perfect Reflector假设图像上最亮点就是白点,并以此白点为参考对图像进行自动白平衡,最亮点定义为R+G+B的最大值,具体编码步骤如下:

          (1)计算每个像素的R\G\B之和,并保存到一临时内存块中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for (Y = 0; Y < Height; Y++)
    {
        Pointer = bmp.Pointer + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            Sum = (short)(*(Pointer) + *(Pointer + 1) + *(Pointer + 2));     // R+G+B
            HistRGB[Sum]++;
            *SumP = (short)Sum;
            Pointer += 3;
            SumP++;
        }
    }

         (2)按R+G+B值的大小计算出其前10%或其他Ratio的白色参考点的的阈值T。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (Y = 767; Y >= 0; Y--)
    {
        Sum += HistRGB[Y];
        if (Sum > Width * Height * Ratio / 100)
        {
            Threshold = Y;
            break;
        }
    }

        (3)遍历图像中的每个点,计算其中R+G+B值大于T的所有点的R\G\B分量的累积和的平均值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    for (Y = 0; Y < Height; Y++)
    {
        Pointer = bmp.Pointer + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            if (*SumP > Threshold)
            {
                AvgB += *Pointer;
                AvgG += *(Pointer + 1);
                AvgR += *(Pointer + 2);             // 为获得增益做准备
                Amount++;
            }
            Pointer += 3;
            SumP++;
        }
    }
    AvgB /= Amount;
    AvgG /= Amount;
    AvgR /= Amount;

       (4)对每个点将像素量化到[0,255]之间。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    for (Y = 0; Y < Height; Y++)
    {
        Pointer = bmp.Pointer + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            Blue = *Pointer * MaxValue / AvgB;                                   // 另外一种算法需要先计算不抑制重新计算的RGB的范围,然后求RGB的最大值,如果最大值大于255,则所有的结果都要除以最大值在乘以255,但实际表明该算法、   不合适;
            Green = *(Pointer + 1) * MaxValue / AvgG;
            Red = *(Pointer + 2) * MaxValue / AvgR;
            if (Red > 255) Red = 255; else if (Red < 0) Red = 0;                // 这里需要判断,因为RGB空间所有的颜色转换到YCbCr后,并不是填充满了0-255的范围的,反转过去就会存在一些溢出的点。
            if (Green > 255) Green = 255; else if (Green < 0) Green = 0;        // 编译后应该比三目运算符的效率高
            if (Blue > 255) Blue = 255; else if (Blue < 0) Blue = 0;
            *Pointer = (byte)Blue;
            *(Pointer + 1) = (byte)Green;
            *(Pointer + 2) = (byte)Red;
            Pointer += 3;
        }

    }


    三、动态阈值算法

          参考论文:A Novel Automatic White Balance Method For Digital Still Cameras

          同经典的一些算法相同,算法分为两个步骤:白点检测和白点调整。

          白点检测:

               (1)为了增强算法的鲁棒性,原文将图像分成12部分,其中宽高比为4:3,关于这一点,我认为不合理,对图像不是通用的,后文再说。

                (2)计算每个区域的Cb\Cr分量的平均值Mb/Mr

                (3)按下式计算每个区域的Cb\Cr分量的绝对差的累积值Db/Dr

                                     

                                     

                      上式中N为每个区域的像素数。

             (4)如果Db/Dr的值偏小,则我们忽略这一块,因为这表明这一块的颜色分布比较均匀,而这样的局部对于白平衡不好。这个偏小的准则我们稍微再谈。

             (5)统计对于除了符合第四条的的其他区域的Mb/Mr/Db/Dr的平均值作为整幅图像的Mb/Mr/Db/Dr值。

            关于这一条,原文的话是:The final Mb、Mr、Db、Dr are obtained by taking the average of those regions that pass this additional step。

           我在实际中做的时候就是分别对每块进行的,似乎效果也还不错。

             (6)按下述规则初步确定哪些点是属于白色参考点:

                           

                            

             (7)对于初步判断已经属于白色参考点的像素,按大小取其亮度值为前10%的位最终确定的白色参考点。

          白点调整:

         (1)计算白色参考点亮度值的平均值Raver,Gaver,Baver,(各通道分开计算)。

              (2)按照以下各式计算每个通道的增益:

                 

                           

                          

                  式中,Ymax就是YCbCr颜色空间中Y分量的在整幅图像中的最大值。

              (3)按照以下各式计算最终每个通道的颜色值:

                          

                          

                          

              其中R/G/B为在原始的颜色空间中的值,注意这里要进行溢出检测的。

            简单的谈下白点检测的分块操作吧,原文把图像分成4*3的12快,这样做事针对于我们很多数码照片是这个比例的,如果通用,我觉得应该用每个块的大小来控制,比如每块为 100*100个像素。

        该算法效果非常好;对块大小不太敏感,因此非常适合于自动化操作。


    同样,提供个编译好的文件给有兴趣研究该算法的朋友看看效果:

          http://files.cnblogs.com/Imageshop/AutoWhiteBalance.zip

    ********作者: laviewpbt   时间: 2013.4.20    联系QQ:  33184777  转载请保留本行信息*********



    展开全文
  • 红黑树-“旋转”实现自平衡概念理解(动图演示) 红黑树(Red-Black Tree),又称“R-B树”,属于“二叉查找树”一种,但它比较特殊,能够实现树结点“自平衡”特性,但这种平衡只是近似,不是绝对平衡。而这一...
  • 在第6章查找算法介绍中,我们提到了树表查找/动态表查找,BST因为关键字有序,在查找时同样高效,并且易于对关键字插入及删除操作。 二叉搜索树基本概念 二叉搜索树是一棵二叉树。这样一棵树可以使用一个...
  • 平衡是图像处理一个极重要概念。所谓白平衡(英文名称为White Balance),就是对白色物体还原。当我们用肉眼观看这大千世界时,在不同光线下,对相同颜色感觉基本是相同,比如在早晨旭日初升时,我们...
  • 我曾经使用过Java,Spring Boot和Angular,但是您无需了解任何特定的语言或技术即可了解微服务的概念。 只需先阅读文档。 一旦完成了文档,您就可以通过配置系统先决条件来运行本地系统中的每个应用程序,并且在...
  • 平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题。白平衡是随着电子影像再现色彩真实而产生的,在专业摄像领域白平衡应用的较早,现在家用电子产品(家用摄像机、数码照相机...
  • 平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题。白平衡是随着电子影像再现色彩真实而产生的,在专业摄像领域白平衡应用的较早,现在家用电子产品(家用摄像机、数码照相机...
  • 一、平衡二叉树的概念 平衡二叉树(Balancedbinarytree)是由阿德尔森-维尔斯和兰迪斯(Adelson-VelskiiandLandis)于1962年首先提出的,所以又称为AVL树。 定义:平衡二叉树或为空树,或为如下性质的二叉排序树: ...
  •  白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题。白平衡是随着电子影像再现色彩真实而产生的,在专业摄像领域白平衡应用的较早,现在家用电子产品(家用摄像机、数码...
  • 平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和色调处理的一系列问题。白平衡是随着电子影像再现色彩真实而产生的,在专业摄像领域白平衡应用的较早,现在家用电子产品(家用摄像机、数码...
  • 一、平衡二叉树的概念  平衡二叉树(Balanced binary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出的,所以又称为AVL树。 定义:平衡二叉树或为空树,或为如下性质的二叉排序树:...
  • 实测股债平衡的作用及适用场景

    千次阅读 2019-05-15 10:07:59
    各种大V推荐的股债平衡策略真实效果如何,是否是股市灵丹妙药,能带我们穿越牛熊?本文通过实测数据验证股债平衡的神话是否被夸大了。... 最简单的方案就是固定股债比例比如5:5,然后定期动态平衡比如半...
  • 1 不变集 一个集合G称为一个动态系统不变集,如果满足从G中一个点出发轨线永远停留在G中。任意一个平衡点是一个不变集;一个平衡吸引域也是一个不变集;极限环是一个特殊系统轨线,极限环也是不变集;2 ...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 235
精华内容 94
关键字:

动态平衡的概念