局地自适应机关色阶/比较度算法在图像增强上的运用。

   
限制相比度自适应直方图均衡化算法原理、完毕及作用一文中针对全局直方图均衡化的壹对弱点,建议了分块的自适应均衡化技术,很好的制伏了大局直方图均衡化的部分缺点,对于图像增强也负有分明的效果,咱们有点回看下CLAHE的算法流程,简单的能够用上边包车型地铁经过描述:

for each Tile in Image 
{
   Calcuate( HistGram);
   ClipHistGram(HistGram, ClipLimit);
   MakeMapping(HistGram);
}
for each Tile in Image 
    for each Pixel in Tile
        use bilinear interpolation between four adjacent HistGram info to generate new Pixel

   原始的直方图均衡化算法的核心在上述 MakeMapping(HistGram)函数中能够显示,

void MakeMapping(int* Histgram)
{
    int I, Sum = 0, Amount = 0;
    for (I = 0; I < 256; I++) Amount += Histgram[I];
    for (I = 0; I < 256; I++)
    {
        Sum += Histgram[I];
        Histgram[I] = Sum * 255/ Amount;     // 计算分布
    }
}

    上述Histgram[I] = Sum * 255/
Amount;   一句就是HE算法的为主,就直方图数据再次分布。

    大家回想一下PS的调整菜系,除了直方图均衡化是一键式菜单(即点击无可调参数界面,实际上直翻图均衡化照旧有个别,在有选区的事态下回弹出3个框),还有其它七个常用的一键操作,即:自动色阶、自动相比度以及电动颜色。从精神上讲,这多个算法同直方图均衡化一样,在中间也是贰个直方图再度分布和像素重新照射的长河,因而,假如把那里的MakeMapping函数总映射进程替换他们3者中的某一种会是怎么着景况和遵守呢,
那实质上是探听了CLAHE算法的原理后,很自然的能推广和联想到的。

    
关于机关色阶和自动比较度的规律,作者在调整图像-
自动相比度、自动色阶算法
一文中早已有了相比较详细的达成,而关于机关颜色的规律,方今截至笔者就像从未发现有任什么人对其展开了详实的演说。小编在Imageshop中也只是做了1种简单的模仿,那里就不提了。

    
以机关色阶为例,上述MakeMapping函数的款式可能如下所示:

void MakeMapping(int* Histgram,float CutLimit=0.01)
{
    int I, Sum = 0, Amount = 0;
    const int Level = 256;
    for (I = 0; I < Level; I++) Amount += Histgram[I];
    int MinB,MaxB;
    for (I = 0; I < Level; I++)
    {
        Sum = Sum + Histgram[I];
        if (Sum >= Amount * CutLimit )
        {
            MinB = I;                              
            break;
        }
    }  
    Sum = 0;
    for(I = Level-1; I >= 0; I--)
    {
        Sum = Sum +Histgram[I];
        if (Sum >= Amount * CutLimit )
        {
            MaxB = I ;                            
            break;
        }   
    }

    if (MaxB!=MinB)
    {
        for (I = 0; I < Level; I++)
        {
            if (I<MinB)
                Histgram[I] =0;
            else if(I>MaxB)
                Histgram[I]=255;
            else
                Histgram[I] = 255* (I - MinB) / (MaxB - MinB) ;     
        }
    }
    else
    {
        for (I = 0; I < Level; I++) Histgram[I]=MaxB;        //     必须有,不然会有一些图像平坦的部位效果出错
    }
}

  注意在那几个函数里作者扩充了CutLimit参数,那几个参数名和CLAHE的相同,实际上是因为机关色阶那种工作方法,正是对直方图的一种裁剪,因而CLAHE算法的ClipHistGram进度就足以舍去了,而把CutLimit作为机关色阶的1个调节参数也是任其自然的三个思想政治工作了。

      在上述代码代码中,if
(马克斯B!=MinB)的论断首假如幸免出现除以0的荒唐,同时在那种景色时有发生时,必须把直方图中的全体数据都安装为马克斯B(其实那种景况时有发生时,原始直方图数据中势必是超越八分之四都等于马克斯B,但或许仍旧有①对是例外的,即使不赋值为马克斯B,处理的结果图像中会出现莫明其妙的纹理图)。

     
把上述代码替换掉CLAHE算法中相应的局地,保持插值等代码不动,可获得如下效果:

   
 图片 1    图片 2

               原图                        
 块大小为200,CutLimit =0.0一 处理后结果

    
由地点的图能够看到,处理前后的增加效率依旧很分明的,整个图像呈现更显然。

    
依据上述代码分析,那样处理的功能自然是本来图像中的黑的片段更黑,白的壹部分更白,因而,相比较度越发宣明。为了能操纵总体比较度调节的水准,我们新扩充1个参数,用来调节在结尾隐射阶段的最大值。笔者那边做了之类的处理:

void MakeMapping(int* Histgram,float CutLimit=0.01,float Contrast = 1)
{
    int I, Sum = 0, Amount = 0;
    const int Level = 256;
    for (I = 0; I < Level; I++) Amount += Histgram[I];
    int MinB =0 ,MaxB=255;
    int Min = 0,Max=255;
    for (I = 0; I < Level; I++)
    {
        if  (Histgram[I]!=0) 
        {
            Min = I ;
            break;
        }
    }

    for(I = Level-1; I >= 0; I--)
    {
        if  (Histgram[I]!=0) 
        {
            Max = I ;
            break;
        }
    }
    for (I = 0; I < Level; I++)
    {
        Sum = Sum + Histgram[I];
        if (Sum >= Amount * CutLimit )
        {
            MinB = I;                              
            break;
        }
    }

    Sum = 0;
    for(I = Level-1; I >= 0; I--)
    {
        Sum = Sum +Histgram[I];
        if (Sum >= Amount * CutLimit )
        {
            MaxB = I ;                            
            break;
        }   
    }
    int Delta = (Max - Min) * Contrast * 0.5  ;
    Min = Min - Delta;
    Max = Max +    Delta ;
    if (Min    < 0) Min = 0;
    if (Max > 255) Max = 255;

    if (MaxB!=MinB)
    {
        for (I = 0; I < Level; I++)
        {
            if (I<MinB)
                Histgram[I] =Min;
            else if(I>MaxB)
                Histgram[I]=Max;
            else
                Histgram[I] = (Max-Min)* (I - MinB) / (MaxB - MinB) + Min ;     
        }
    }
    else
    {
        for (I = 0; I < Level; I++) Histgram[I]=MaxB;        //     必须有,不然会有一些图像平坦的部位效果出错
    }
}

   首先分析获得原始块中的最大值和微小值,然后再那一个的功底上遵从设定的参数向黑和白五个方向同样水平扩展,这样就防止了随便什么样状态下的遍布都直接扩大到0-25伍内。有效的平抑了噪音的放大。

  修改后,大家看看一些意义:

图片 3图片 4图片 5

          
原图                      CutLimit
=0.01,Contrast=1                    CutLimit
=0.05,Contrast=1

   
分析:上边那幅图原本图像全体就比较亮,因而,在Contrast=1的时候,很多块调整后的Min=0,马克斯也就是25五了,由此继续扩充Contrast参数,图像的功效基本未有啥样变动了。而充实CutLimit值使得图像的映射表由四个十分向中档靠拢,图像会稍微显得浓烈1些。

图片 6图片 7图片 8

       原图                      CutLimit
=0.01,Contrast=1                    CutLimit
=0.01,Contrast=2.5    

   
而地方那幅图像,则由于全体比较暗,增添Contrast的效应就比较显然了,当Contrast=二.五,图像顶部的一部分细节音讯也能清楚的表达出来。

   
别的,分析原始代码的双线性插值部分可见,在周边边缘处,特备是离边缘小于TileX/2或小于TileY/贰的一对,由于其临近音讯的缺点和失误,实际上是绝非展开双线性插值的,那样对于部分图像,边缘处显得略微不自然,弥补的不贰诀窍正是在拍卖前对图像举办扩充,分别向四周扩大TileX/二和TileY/2大小,当然扩张部分的多少供给遵照镜像的法子填充数据。

    在贴1些以此算法的拍卖作用:

图片 9图片 10图片 11

图片 12图片 13图片 14

图片 15   图片 16 图片 17                     图片 18                

     
尤其是最后一幅图,处理的作用都要比本人博客中其余的三种形式来的好,感觉真是帅呆了。

      实际中还发现,假如各种块的轻重缓急太小,处理的进程和效果都会拥有下落,太大就也正是大局的处理了,由此,一般景观下可取将一副图平均分为约四*肆块大小的块大小。同时,调节块大小时还会合世有的点突然过亮或过暗的现象,这几个难题恐怕会潜移默化局地图的效益。

      用C写个DLL,并提供了C#调用的实例:http://files.cnblogs.com/Imageshop/AdaptAutoContrastTest.rar

    图片 19

    上海体育场所中通道分别选项能够用作是1些自动色阶和自行相比较度算法的切换,在勾选通道分别选项时,对于有个别图像会发现有偏色的场合,这几个现象在PS中利用电动色阶和机关对比度时也会冒出。

 图片 20

*********************************小编:
laviewpbt   时间: 20一三.10.2玖    联系QQ:  33184777 转载请保留本行新闻************************