m)为出口图像。通常可以行使藏USM技术来促成。AHE算法使用有的直方图的有关消息对数码开展映射。

     
在开局之前,首先说明一些,Photoshop的USM锐化只是本文所指USM的平栽比较突出之事例而已。

由于CSDN博客及博客园的编撰方面发生非一致的地方,导致文中部分图片错位,为免影响浏览效果,建议点击打开链接。 

     
图像的对比度增强算法在过剩场子都起正值至关重要的使用,特别是在医学图像及,这是为于广大病的诊断中,医学图像的视觉检查时老有必不可少之。而医学图像由于自家以及成像法的限制,图像的针对性比度很没有。因此,在是上面曾经进行了很多的研讨。这种增长算法一般还以一定的视觉原则。众所周知,人眼对屡次信号(边缘处等)比较快。虽然细节信息往往是屡信号,但是她们时常坐在大气底低频背景信号中,从而让那视觉可见性降低。因此适合的增强往往部分会加强视觉效果并有利于诊断。

     
通过增强图像的往往部分的情,图像的视觉效果可以大幅度的取得改变。为达成这目的,通常可以利用藏USM技术来兑现。这个技能之流水线可用下图来落实:

   
 在起初之前,首先说明某些,Photoshop的USM锐化只是本文所指USM的平等种比较特殊之例证而已。

    
在马上一边,传统的线性对比度拉升以及直方图均衡化是下的最为广泛的大局图像增强方法。对比度拉升线性的调整了图像的动态范围,而直方图均衡化栖利用累计直方图分布概率重新照射图像的数码。这些主意虽然简单,但是都不曾设想到有的的信息。并且,全局直方图均衡化(GHE)还会见起让一些噪声过度加强。

                   

     
通过提高图像的勤部分的情,图像的视觉效果可以大幅度的拿走改观。为达到这个目的,通常可以应用藏USM技术来兑现。这个技能之流程可用下图来落实:

    
在一些对比度增强地方,有点儿栽办法是太出名的,一种是于适应直方图均衡化(AHE),这个算法可以参见我之博文范围对比度自适应直方图均衡化算法原理、实现和力量。还有雷同种就是由适应对比度增强(ACE)。AHE算法使用部分的直方图的相干信息对数码进行映射。这反了图像的对准比度,但是用大量之计。后来有人利用了双线性差值技术克服了这个题目,首先用图像分块,然后分别计这些抢中的映射关系。为了提高某一个像素点的价值,映射关系通过与这像素所在块相邻的季独片的投关系差值获得。在是算法中,仅仅要一个块大小的参数(在自身之博文中尚针对性参数进行了扩大)。

      用实际的公式表达就是为:

                   

      ACE算法采用了反锐化掩模技术,我们针对是过程解释如下:首先图像于分为两单部分。一凡是低频的反锐化掩模(unsharp
mask)部分,可以经图像的低通滤波(平滑,模糊技术)获得。二凡是反复成分,可以了本图减去倒锐化掩模获取。然后反复部分于放大(放大系数即为对比度增益CG)并参加到反锐化掩模中错过,最后得到加强的图像。ACE算法的主干就是是安算CG,这里拿介绍两种简易的CG计算方式。

                    y(n,m)= x(n,m)+
λz(n,m)                                                      
(1)

      用现实的公式表达就是为:

   
在继续证明之前,先贴平轴是算法处理的希冀于大家省效果,免得都是通篇的契。

     
其中, x(n,m)为输入图像,y(n,m)为出口图像,而z(n,m)为校正信号,一般是经对x进行大通滤波获取。λ是用于控制增强功能的的一个缩放因子。

                    y(n,m)= x(n,m)+
λz(n,m)                                                       (1)

 
 

     
在风的USM算法中,z(n,m)一般可由此下式获取:

     
其中, x(n,m)为输入图像,y(n,m)为出口图像,而z(n,m)为校正信号,一般是经过对x进行大通滤波获取。λ是用于控制增强力量的的一个缩放因子。

                  原图                                     处理后底图

             
z(n,m)=4x(n,m)-x(n-1,m) -x(n +1,m)-x(n, m-1) -x(n,m+1)            
(2)

      在传统的USM算法中,z(n,m)一般可透过下式获取:

      在谈及CG之前,我们要待探视有基础之做事。首先上面讲到了unsharp
mask,他本着许给图像的低频成分。对于现实的像素,一般可由此测算为该像从也主干的一对区域的像素平均值来贯彻。我们假定x(i,j)是图像中某点的灰度值,局部区域之概念也:以(i,j)为主导,窗口大小也(2n+1)*(2n+1)的区域,其中n为一个平头。当然这窗口区域啊无必然将是刚方形。局部的平均值,也就是是低频部分,可以据此下式计算:

      当然也可就此如下的模板:

              z(n,m)=4x(n,m)-x(n-1,m) -x(n +1,m)-x(n,
m-1) -x(n,m+1)             (2)

                   

                     

      当然为足以为此如下的模板:

      而有的方差为:

        贴有参考代码:

                     

       

   Width = Bitmap.Width; Height = Bitmap.Height; Stride = Bitmap.Stride; 
   NewHeight = Height +  2; NewStride = (Width +  2) * BytePerPixel;          
   ExpandPtr = (byte*)Win32Api.GlobalAlloc(Win32Const.GPTR, NewStride * NewHeight);  // 为保证边缘部分处理方便,扩展边界部分
   Utility.GetExpandImage(Bitmap, 1, ExpandPtr);      // 拷贝图像到缓冲区,以及填充边缘像素
   for (Y = 0; Y < Height; Y++)                // 处理灰度图像
   {
       Pointer = Bitmap.Pointer + Y * Stride;
       ExpandP = ExpandPtr + (Y+1) * NewStride+1;
       for (X = 0; X < Width; X++)
       {
           HighPass = (ExpandP[X] << 2) - ExpandP[X - 1] - ExpandP[X + 1] - ExpandP[X - NewStride] - ExpandP[X + NewStride];   // z(n,m)
           Value = Pointer[X] + Amount * HighPass / 100;   // x(n,m)+ λz(n,m),式中的Amount即这里的λ     
           Pointer[X] = (byte)((((ushort)Value | ((short)(255 - Value) >> 15)) & ~Value >> 15));  // 防止数据溢出
        }
    }
    Win32Api.GlobalFree((IntPtr)ExpandPtr);

        贴有参考代码:

      上式中σx(i,j)就是所谓的有标准差(LSD)。定义f(i,j)表示x(i,j)对应之增进后的诸如素值。则ACE算法可以表示如下:

  以许多场地,这个措施呢会获比较好之法力,比如下述的Lena图。

   Width = Bitmap.Width; Height = Bitmap.Height; Stride = Bitmap.Stride; 
   NewHeight = Height +  2; NewStride = (Width +  2) * BytePerPixel;          
   ExpandPtr = (byte*)Win32Api.GlobalAlloc(Win32Const.GPTR, NewStride * NewHeight);  // 为保证边缘部分处理方便,扩展边界部分
   Utility.GetExpandImage(Bitmap, 1, ExpandPtr);      // 拷贝图像到缓冲区,以及填充边缘像素
   for (Y = 0; Y < Height; Y++)                // 处理灰度图像
   {
       Pointer = Bitmap.Pointer + Y * Stride;
       ExpandP = ExpandPtr + (Y+1) * NewStride+1;
       for (X = 0; X < Width; X++)
       {
           HighPass = (ExpandP[X] << 2) - ExpandP[X - 1] - ExpandP[X + 1] - ExpandP[X - NewStride] - ExpandP[X + NewStride];   // z(n,m)
           Value = Pointer[X] + Amount * HighPass / 100;   // x(n,m)+ λz(n,m),式中的Amount即这里的λ     
           Pointer[X] = (byte)((((ushort)Value | ((short)(255 - Value) >> 15)) & ~Value >> 15));  // 防止数据溢出
        }
    }

    Win32Api.GlobalFree((IntPtr)ExpandPtr);

                

      
     

  在众场子,这个法子吗克赢得比较好之功能,比如下述的Lena图,

    
其中的函数G(i,j)就是上文所提的CG。一般景象下CG总是凌驾1的,这样翻来覆去成分即便可知得到提高。

                   原图
                  Amount=25                                   
Amount=100

    
        

    
关于CG的取值,一栽最简单易行的道就是是使其也常量,假得为C,一般C>1,这样式3就成:

      不过此方面呢起以下的缺陷: 1)
线性的高通滤波使得效果指向噪声大敏感,这会招致有的非期望之转,特别在图像变换比较缓慢的地方的噪音,比如达图3蒙受草帽的左边平坦区域。2)对于图像的边缘(高对比度区域)会出现增长过头的光景,如齐图草帽的边缘。 
这有限点会促成出口图像在部分让人看上去不痛快的地方。
     很多论文被提出了有的自适应通过动态的改变式(1)中之λ参数来决定调节结果。在图像的转移比较坦荡的区域,λ取值小,在比较生之对准比度(边缘处)地方获得适量的λ,而以受针对比度处取较充分之λ值,以使这部分的取最特别之增强。
比如这首文章Image Enhancement via Adaptive Unsharp
Masking 中便提出了同一种植逐步翻新的法子。不过类似这样的章都普遍存在一个题材,那就是可控参数过多,且这些由参数的取值需要了多之人造参与,我以为这样的算法,是无有实用的价值之。

                   原图
                  Amount=25                                   
Amount=100

                  
 

    
在Photoshop的锐化菜单中呢闹平等项USM锐化,其实这个效应为是符合式1之概念的。通过其UI界面我们好窥见那来3独参数:半径、数量、阈值,其内部的算法过程可以据此如下的简约代码表示:

      不过是点为出以下的缺陷: 1)
线性的高通滤波使得效果指向噪音十分敏感,这会招有的不希望的扭转,特别以图像变换比较慢的地方的噪声,比如达图3蒙草帽的左平坦区域。2)对于图像的边缘(高对比度区域)会面世增长过头的景,如达到图草帽的边缘。 
这有限接触见面促成出口图像在一些让人看上去不痛快的地方。
     很多舆论中提出了有从适应通过动态的改变式(1)中之λ参数来控制调节结果。在图像的转移比较平的区域,λ取值小,在可比生的对比度(边缘处)地方得适量的λ,而当遭到针对比度处取较生之λ值,以使得这片之收获最好特别之增强。
比如这首文章Image Enhancement via Adaptive Unsharp
Masking 中就是提出了千篇一律种逐步翻新的法。不过类似这样的章都普遍存在一个题目,那就算是可控参数过多,且这些自参数的取值需要了多之人为参与,我觉着这样的算法,是不具实用的值的。

     这种气象下,图像遭到享有的一再部分还为同放大,可能稍累部分会冒出过增强的景之。

    Width = Bitmap.Width; Height = Bitmap.Height; Stride = Bitmap.Stride; BytePerPixel = Bitmap.BitCount / 8;
    FastBitmap Clone = Bitmap.Clone();    // 备份图像数据
    BlurEffect.GaussianBlur(Clone, Radius);  // 对备份的数据进行高斯模糊处理
    for (Y = 0; Y < Height; Y++)
    {
        Pointer = Bitmap.Pointer + Y * Stride;
        PointerC = Clone.Pointer + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            Value = Pointer[X] - PointerC[X];
            if (Utility.Abs (Value) > Threshold)
            {
                Value = Pointer[X] + Amount * Value / 100;
                Pointer[X] = (byte)((((ushort)Value | ((short)(255 - Value) >> 15)) & ~Value >> 15));
            }
        }
    }
    Clone.Dispose();

    
在Photoshop的锐化菜单中也生雷同起USM锐化,其实这个功能吗是符合式1之定义的。通过该UI界面我们得发现那个发生3单参数:半径、数量、阈值,其内部的算法过程可以就此如下的简便代码表示:

   

     
众所周知,高斯模糊时没有通滤波,那么 Value = Pointer[X] –
PointerC[X](原值-低通)则相当给高通的结果,如果原值和低通的差别的断然值超出指定的阈值,则指向改点进行所谓的锐化。

    Width = Bitmap.Width; Height = Bitmap.Height; Stride = Bitmap.Stride; BytePerPixel = Bitmap.BitCount / 8;
    FastBitmap Clone = Bitmap.Clone();    // 备份图像数据
    BlurEffect.GaussianBlur(Clone, Radius);  // 对备份的数据进行高斯模糊处理
    for (Y = 0; Y < Height; Y++)
    {
        Pointer = Bitmap.Pointer + Y * Stride;
        PointerC = Clone.Pointer + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            Value = Pointer[X] - PointerC[X];
            if (Utility.Abs (Value) > Threshold)
            {
                Value = Pointer[X] + Amount * Value / 100;
                Pointer[X] = (byte)((((ushort)Value | ((short)(255 - Value) >> 15)) & ~Value >> 15));
            }
        }
    }
    Clone.Dispose();

                   
原图                                                                    
 n=50,c=2                                                              n=50,c=3

     
这里对式(1)多引进了一个参数阈值,通过调试该值,来决定及何种程度对比度的诸如素才需要增强。

      众所周知,高斯模糊时小通滤波,那么 Value = Pointer[X] –
PointerC[X](原值-低通)则相当给高通的结果,如果原值和低通的歧异的绝对值超出指定的阈值,则针对改点进行所谓的锐化。

   
在达成图中,分别下了C=2及C=3的底事态,在C=3时,可见星球边缘之部分被过增强,出现成片的白色。

      实际的效益表明,这种方法的锐化要较传统的USM锐化能收获更好之调剂功能。

     
这里对式(1)多引进了一个参数阈值,通过调试该值,来控制及何种程度对比度的如素才需要加强。

   
一栽缓解的方案便是运不同之增益。Lee等丁提出了之类的方案:

     
以下也Threshold=0,Amount=50常不同半径的法力。

      实际的效用表明,这种办法的锐化要比传统的USM锐化能博取重新好的调剂作用。

           

         

     以下也Threshold=0,Amount=50经常不同半径的功力。

    
上式中,D是个常反复,这样,CG是空中由适应之,并且和有均方差成反比,在图像的边缘或者其他变化可以的地方,局部均方差比较大,因此CG的值就是比粗,这样即便非会见生振铃效应。然而,在平的区域,局部均方差就会见好有些,这样CG的值比较大,从而引起了噪音的加大,所以需要针对CG的最深价值做肯定之界定才能够获得重新好之机能。

       

    
       
 

     D这个常数的取值有些文章介绍说用图像的全局平均值,我编程的时候是用的图像的大局均方差,并且增加一个参数Amount,用来还决定频增强的品位。

                    原图                  
                                             Radius=5                  
                          Radius=50                                    
     Radius=200

              

    
对式我们进行了编程,并测试一些图像,当进行局部参数的调动时,都能够取比好之增进力量,举例如下:

      随着半径的增大,图像的比度渐渐变大,边缘越发强烈,但是所有的调剂后底图像都不出现显著的噪声增强,效果异常的美,对于Lena图,处理后底图中得以判的顾在眼睛部位,眼白和眼球的对比更为鲜明、明显,而且整幅图形由感觉上说原来图像较为模糊,处理后的鲜明不丢掉。

                         
原图                                             Radius=5                                 
   Radius=50                                           Radius=200

 

     
Amount参数对效果的熏陶挺扎眼得查出,越怪,对比度越强,但是由于那个和结果的线性关系,这个参数的更动对结果的熏陶比较另外两只参数还敏锐。

      随着半径的增大,图像的对立统一度渐渐变大,边缘越发明朗,但是有的调试后底图像都非出现显著的噪音增强,效果大之妙。

                             
原图                                                     n=20,Amount=100,MaxCG=3                   
             n=20,Amount=100,MaxCG=10

     
实际上,上述高斯模糊也得就此中值模糊、方框模糊来替,所取的法力和高斯滤波非常相似。在Paint.net的机能-》相片-》尖锐化滤镜就是故的中值的点子实现的。

     
Amount参数对职能的震慑好强烈好识破,越充分,对比度越强,但是由其同结果的线性关系,这个参数的变动对结果的震慑比任何两单参数还灵活。

  

   
关于实现代码,基本上我于上头就提及,其实最要紧要高斯模糊的实现。如果你看出难度,正使上文所说,也得以就此全值来替代,而均值模糊编码则非常简单。 

     
实际上,上述高斯模糊也得以据此中值模糊、方框模糊来替代,所抱的法力以及高斯滤波非常相似。在Paint.net的机能-》相片-》尖锐化滤镜就是为此之中值的方实现的。

                             
原图                                                   n=25,Amount=100,MaxCG=2                                n=50,Amount=150,MaxCG=2

 

   
关于落实代码,基本上自己在上面已经提及,其实最好重大还是高斯模糊的贯彻。如果您道出难度,正而上文所说,也可据此都值来代替,而均值模糊编码则非常简单。 

  

   
同样,提供个编译好的文本给来趣味研究该算法的爱人看效果:

    
同样,提供个编译好的文件被出趣味研究该算法的情人看效果: 

                            
原图                                                   n=50,Amount=150,MaxCG=3                                n=50,Amount=150,MaxCG=10

    http://files.cnblogs.com/Imageshop/USM.rar

    http://files.cnblogs.com/Imageshop/USM.rar

    
不仅是针对性医学图像,对于自日常生活中之有请勿是很美好的图样,经过上述ACE算法在大多数状下为可获取比较好之效用:

 

 

 

 

 

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

 
为什么而本着CG的极可怜价值进行界定,我们选下面这个图作为例子:

 

 

 

                               
原图                                                                                                 
n=50,Amount=150,CG不限制

   于高达图中,图像右上比赛部位属于同一滑区域,但是仔细察看有着微弱的层次感,如果未针对CG进行限制,则由LSD的价老粗,导致CG的价值特别深,从而来像素饱和的场景(即像从的价值超过了255)。如右图所显示,解决此问题一样种植办法就是增加n的价,即增加取样半径,通过取样半径的增,使得以平滑区域为主干的窗口能覆盖有非平滑的区域,从而来比充分的LSD值。另外一栽不畏是使用CG限幅的点子,效果如下:

   

                                 n=200,Amount=150,CG不限制                                                                       
  n=50,Amount=150,CG<3

    
针对不同之图像,要惦记获得理想的力量,可能要得人工的错过介入与调整这些参数,我时从未有过发现能够自行确定这些参数的文章。

     根据公式5,是容易写来实现代码的,但还要实用,主要的困难还是什么样实现迅速的乘除,因为随着取样半径n之长,每个像素点涉及到之区域限就越宽广,计算量会直线上升,因此用采用优化的方针。

     均值模糊的优化已经有了不少熟之方案,普遍的便是预先均值,在列均值,当然还有复好的优化措施。

    
而计量局部均方差,则要肯定之水平了,但是同的原理还是用每变换一涂鸦还产生成百上千之交汇的组成部分的数额,这个当空闲了我会专门写首文章的。

     虽然采用了优化算法,但是其实是算法还是生点慢的,主要因还是合算都方差确实发接触耗时,并且优化的算法为是生一行像从的结果值乘让前一行的计结果,而于第一行是索要展开出格处理的,因此,这个动用GPU计算也是挺不便更拓展优化的。

    
但是优化后底算法执行时跟n基本是从来不涉嫌的。

    
同样,提供个编译好之公文给有趣味研究该算法的对象看效果:http://files.cnblogs.com/Imageshop/LocalAreaContrastEnhance.rar

     当然,这个算法不是对准其它图像都能起正能量,那些本就是大好之希冀,你用它只有会弄巧成拙。

 

      参考论文:Real-Time Adaptive
Contrast
Enhancement

2013.10.19 日补充:

     今本着改算法又开展了有测试,发现其对雾天图像,或者正如暗的图像都来不行好之增强作用,再补充部分测试图像的事例:

   
  

      

    抽空用C++写了单正规的DLL,结合OpenMp工具对算法实现了大多线总长运行,执行进度及比C#的多线程版本要趁早那么一点点底。

     DLL的接口函数函数如下:

[DllImport("LocalAreaContrastEnhance.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern void LocalAreaContrastEnhance(byte* Scan0, int Width, int Height, int Stride, int Radius, int Amount, int MaxCG);

    注意自己只兑现了24各之算法。
    再上污染一个C#调用该DLL的代码示例:http://files.cnblogs.com/Imageshop/LocalAreaContrastEnhanceTest.rar

 

 

 

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

 

 

相关文章