一般而言可以利用经典USM技术来落实,光影魔术手有柔化程度和高光柔化两个参数

     
关于算法的履行进度可以说只在乎第二步,因为亮度比较度的调试实际上是个查表的进程(PS的亮度相比度指令其实要比大家想像的复杂点的,这些有时机再谈,也足以参考阿发伯的博文http://blog.csdn.net/maozefa/article/details/4778934),而第四步其实也是可以用查表的措施来加速的(然则早晚要用一位的艺术)。高斯模糊那多少个老生长谈的题材,在自家所搜索过的网页中是尚未何人给出过一个整机的、完美的、执行进度和指定半径无关的、可运行的VB或VC或JAVA程序源代码(一般都是交由参考小说介绍)。我要好有那一个方面的代码,可是我也不乐意共享。真正有趣味的自身推荐你去找GIMP的算法代码,在GIMP的万事源码系统,至少给出了两种高斯模糊优化的代码,分别位居blur-gauss.c(给出了2种:RLE及IIR优化代码)以及contrast-retinex.c中(代码特别简洁),当然,那一个代码假使提取出来还应当举办代码层面的盘整和优化。Paint.net也提供了高斯模糊函数,但是期实质并不是高斯模糊,而是一种用线性分布的权重函数代替恒值权重,但是这些算法里面没有浮点运算,并且还存在比Paint.net里的代码快很多即执行时间于半径无关的优化算法,而且该优化算法比其他真正的高斯模糊优化算法要快1倍多,而效能上分别不大,可视作实时性特别强的场所的备用算法。

 
  图片 1  图片 2  图片 3

   
关于落实代码,基本上我在下边已经提及,其实最要害仍旧高斯模糊的落实。就算您以为有难度,正如上文所说,也足以用均值来替代,而均值模糊编码则异常简单。 

     以及代码片段:

   
 MSR(最大规格为300,尺度数为3)增强图像        
  MSRCR(最大口径为300,尺度数为3,Dynamic=2)增强图像
  MSRCR(最大条件为300,尺度数为6,Dynamic=2)增强图像

 

      第一步:备份原始图像;

   
关于实现代码,提供GIMP的contrast-retinex.c的下载链接(要像完全看懂其中的保有代码的趣味很艰难,可是要提取其中的算法部分就不那么复杂了)。

                    原图                  
                                             Radius=5                  
                          Radius=50                                    
     Radius=200

     
关于滤色模式的良莠不齐算法这里大概的提一下:  Blend = X + Y – X * Y / 255 ;
 其中X和Y分别表示基色和混合色,Blend表示结果色。

       
(2)对于MSRCR,尺度数对结果的形象不是特别大,不过随着标准化数的增多,算法耗时会线性扩展,因此,一般原则数取3就相比较合适了。

 图片 4  图片 5  图片 6  图片 7  

        public GlowEffect()  : base(StaticName, StaticImage, null, EffectDirectives.None, true)
        {
            this.blurEffect = new BlurEffect();
            this.bcAdjustment = new BrightnessAndContrastAdjustment();
            this.screenBlendOp = new UserBlendOps.ScreenBlendOp();
        }

    Multi-Scale
Retinex for Color Image
Enhancement

                   原图
                  Amount=25                                   
Amount=100

   public override unsafe void Render(
            EffectConfigToken parameters, 
            RenderArgs dstArgs, 
            RenderArgs srcArgs, 
            System.Drawing.Rectangle[] rois, 
            int startIndex, 
            int length)
        {
            // First we blur the source, and write the result to the destination surface
            // Then we apply Brightness/Contrast with the input as the dst, and the output as the dst
            // Third, we apply the Screen blend operation so that dst = dst OVER src

            ThreeAmountsConfigToken token = (ThreeAmountsConfigToken)parameters;

            AmountEffectConfigToken blurToken = new AmountEffectConfigToken(token.Amount1);
            this.blurEffect.Render(blurToken, dstArgs, srcArgs, rois, startIndex, length);

            BrightnessAndContrastAdjustmentConfigToken bcToken = new BrightnessAndContrastAdjustmentConfigToken(token.Amount2, token.Amount3);
            this.bcAdjustment.Render(bcToken, dstArgs, dstArgs, rois, startIndex, length);

            for (int i = startIndex; i < startIndex + length; ++i)
            {
                Rectangle roi = rois[i];

                for (int y = roi.Top; y < roi.Bottom; ++y)
                {
                    ColorBgra* dstPtr = dstArgs.Surface.GetPointAddressUnchecked(roi.Left, y);
                    ColorBgra* srcPtr = srcArgs.Surface.GetPointAddressUnchecked(roi.Left, y);

                    screenBlendOp.Apply(dstPtr, srcPtr, dstPtr, roi.Width);
                }
            }
        }

  图片 8 
 图片 9   图片 10

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

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

   
上述照片均接纳最大标准为300,尺度数为3,Dynamic=2时的法力。

    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();

 
  同样,提供个编译好的文书给有趣味研商该算法的情人看看效果:

   
由以上几组照片,可以观察,Retinex在图像去雾、宇航图、艺术学图像、老照片等图像的拍卖上效能十分家喻户晓。

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

 

                     
原图                                             MSRCR                  
                                 美图秀秀 

                   
图片 11

     
算法的源码能够参考我在地点说的多少个开源的软件,当然这也许需要你有一定的编程基础,毕竟这个软件的框架都相比复杂。 

               
 可牛映像                                                
 光影魔术手

     
在开场在此以前,首先表明某些,Photoshop的USM锐化只是本文所指USM的一种相比较非凡的例证而已。

  
 由上述代码起先得出结论:他们是以高斯模糊以及亮度比较度调节两个滤镜为底蕴,稍作混合即可。

      The general
effect of retinex processing on images with regional or global
gray-world violations is a “graying out” of the image, either globally
or in specific regions. This desaturation of color can, in some cases, be
severe (see Fig. 4, middle). More rarely, the gray-world violations
can simply produce an unexpected color distortion (see Fig. 4,top
left).

     图片 12 
  图片 13   
图片 14

     
第二步:对原始图像按指定的半径举行高斯模糊;

   
注意到某些,似乎在量化的时候从不什么人会将 Log[R(x,y)]举行Exp函数的运算而直白拿走R(x,y),至于为何,我不可能提交明确的答案。

    
在Photoshop的锐化菜单中也有一项USM锐化,其实这些效应也是符合式1的定义的。通过其UI界面大家可以窥见其有3个参数:半径、数量、阈值,其内部的算法过程可以用如下的粗略代码表示:

     
第三步:对模糊后的图像继续举办亮度和比较度的调动;

           if (R(x,y)
> 255)  R(x,y) =255; else if (R(x,y) < 0) R(x,y)=0;

 

 

    A Multiscale
Retinex for Bridging the Gap Between Color Images and the Human
Observation of
Scenes

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

   
 我们以paint.net的落实过程为例举办验证,在paint.net的源代码中,GlowEffect.cs为落实该意义的文本,我抽取其部分源代码简要表达下这么些算法的过程。

       
(1)MSRCR效果要比MSR好很多,基本免除了色偏。

        贴部分参考代码:

     
第四步:用原来图像的备份数据通原始图像(经过上述二及三处理后的图像)依照Photoshop的滤色(Screen)形式举办混合。

  图片 19 
  图片 20

     
实际上,上述高斯模糊也得以用中值模糊、方框模糊来代表,所得到的效用和高斯滤波相当相似。在Paint.net的职能-》相片-》尖锐化滤镜就是用的中值的点子实现的。

          图片 21       
  图片 22       
 图片 23     
 图片 24

       
 继续贴图做相比:

  在众多场子,这个点子也能博得较好的效应,比如下述的Lena图。

   图片 25 

   
可以看得出,算法很粗略,其要旨的事物如故在于高斯模糊的实现。关于高斯模糊,网上有不少赶快优化的稿子参考,具体的参考代码可能很少有好人提供的。

      当然也足以用如下的模版:

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

   
 在上述的两幅测试图像中,特别是第二幅,大家看来显著的偏色效果,这就是SSR和MSR普遍都设有的题材。给一段比较经典的杂谈中的原话供我们参考:

      实际的效能讲明,这种办法的锐化要比传统的USM锐化能拿到更好的调剂效用。

     
最近,关于该算法的可控参数,美图秀秀只提供了一个品位(0-100%)控制量,其算法调节的功效和幅度都较小,光影魔术手有柔化程度和高光柔化六个参数,其中柔化程度决定柔化的不明效果,高光柔化调节图像的亮度。
还有一对开源的软件如Imagestone、paint.net、gimp也有softglow算法,他们都提供了3个控制量:半径、亮度、相比较度(锐度),其中Imagestone其实是翻译的gimp的算法,而GIMP和paint.net的算法在基本原理上是千篇一律的,细节上有所区别而已。

   
http://files.cnblogs.com/Imageshop/contrast-retinex.rar

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

  图像柔光效果在无数商业软件中都有落实,比如美图秀秀,光影魔术手等。其能针对原始图像发生一副新的可比坦荡感觉光线相比平缓的效果,给人一种朦胧美,如下边几幅图所示:

     
MSR(最大条件为300,尺度数为3)增强图像        
 MSRCR(最大规格为300,尺度数为3,Dynamic=2)增强图像
  MSRCR(最大口径为300,尺度数为6,Dynamic=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);

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

      但是这些方面也有以下的瑕疵: 1)
线性的高通滤波使得效果对噪声非常乖巧,这会促成有的不期望的扭转,特别在图像变换相比缓慢的地方的噪音,比如上图3中草帽的左手平坦区域。2)对于图像的边缘(高比较度区域)会冒出增长过头的境况,如上图草帽的边缘。 
这两点会造成出口图像存在有的令人看起来不佳受的地点。
     很多舆论中指出了有的自适应通过动态的改变式(1)中的λ参数来控制调节结果。在图像的转移相比较坦荡的区域,λ取值小,在较大的比较度(边缘处)地点取适量的λ,而在中相比度处取较大的λ值,以使得这有的的取得最大的加强。
比如这篇著作Image Enhancement via Adaptive Unsharp
Masking
 中就提议了一种渐渐更新的不二法门。然而类似这样的篇章都普遍存在一个题目,这就是可控参数过多,且这多少个从参数的取值需要过多的人造参预,我认为这样的算法,是不拥有实用的市值的。

 
  图片 26 
 图片 27 
 图片 28

     
Amount参数对职能的影响很引人注目能够识破,越大,相比度越高,不过出于其和结果的线性关系,这些参数的转变对结果的熏陶比其它多少个参数更敏锐。

   
 retinex算法的功力对于有些好端端的图像处理后的效力并不好,我们可以认为她就是为那么些在外场条件不出彩的图景下素描的图像增强而规划的,特此外,对于航拍的雾天图片,艺术学上的成像图片等成像条件恶劣的图有很彰着的效益,再列出有些相片处理效果。

   
同样,提供个编译好的文书给有趣味研讨该算法的心上人看看效果:

   
 关于最大标准,个人提出取值以超越100为佳。

 

                     
     原图                                    
 经过SSR(尺度为300)增强后的图像            
 经过MSR(最大原则为300,尺度数为3)增强后的图像

      用实际的公式表明即为:

   
 图片 29 
 图片 30   图片 31

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

 
  图片 32 
 图片 33 
 图片 34

     
那里对式(1)多引进了一个参数阈值,通过调试该值,来决定达到何种程度相比度的像素才需要提升。

   
(1)分别总括出 Log[R(x,y)]中R/G/B各通道数据的均值Mean和均方差Var(注意是均方差)。

     
通过加强图像的往往部分的情节,图像的视觉效果可以大幅度的拿走改观。为达到这几个目的,平日可以应用经典USM技术来促成。这一个技能的流水线可用下图来实现:

   
关于去雾效果,我们在来和美图秀秀、可牛影象、光影魔术手等现有的软件做个简易的相比:

 

   
按照Retinex理论,人眼感知物体的亮度取决于环境的照明和物体表面对照射光的反光,其数学表明式为:

                     
图片 35

 
  图片 36 
 图片 37 
 图片 38

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

 
  图片 39

     
以下为Threshold=0,Amount=50时不同半径的效用。

   
关于NASA对Retinex技术的利用,可以参见:http://dragon.larc.nasa.gov/retinex/

      随着半径的增大,图像的周旋统一度渐渐变强,边缘越发显著,但是所有的调节后的图像都未出现显然的噪音增强,效果特别之出色,对于Lena图,处理后的图纸中可以显明的寓目在眼睛部位,眼白和眼球的对峙统一更为彰着、显著,而且整幅图形从感觉上说原来图像较为模糊,处理后的清晰不少。

  • Dynamic * Var;  

 

               
MSRCR(Dynamic=1)增强图像                          
 MSRCR(Dynamic=2)增强图像                            
 MSRCR(Dynamic=5)增强图像

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

            R(x,y) = (
Value – Min ) / (Max – Min) * (255-0)                          
(2-3)

     
众所周知,高斯模糊时低通滤波,那么 Value = Pointer[X] –
PointerC[X](原值-低通)则相当于高通的结果,假诺原值和低通的出入的相对化值超越指定的阈值,则对改点举办所谓的锐化。

              (3)
将 Log[R(x,y)]量化为0到255限制的像素值,作为最后的出口。

   
量化的措施实际上有这个种,而这多少个主意在很大的品位上对处理的意义有所决定性的震慑。至今自己没看出有哪一篇散文对这一块讲的很精晓,也不知底他们的这么些结果是怎么收获的,一种最简便的办法就是精打细算出Log[R(x,y)]的最大值马克斯(Max)和纤维值Min,然后对每一个值Value,举行线性量化,公式为:

           R(x,y) = (
Value – Min ) / (Max – Min) * (255-0)
,同时要留意扩展一个溢出判断,即:

 
  (2)利用类似下述公式统计各通道的Min和马克斯(Max)值。

   
同样,提供个编译好的文件给有趣味钻探该算法的爱侣看看效果:

                     
 原图                                  
经过Retinex(尺度为10)增强后的图像                
经过Retinex(尺度为300)增强后的图像

   
NASA的拍卖效率要比自己这边的MSRCR好一些,这自然无可厚非,人家是如何单位呀。

           
I(x,y)=L(x,y)*R(x,y)                            (2-1)

 图片 40

 
  图片 41   图片 42 
 图片 43

 
 图片 44  图片 45  图片 46

   
以上算法所实现的历程一般倍称作为SSR(Single Scale
Retinex,单尺度视网膜增强);

                
可牛影象                                                
光影魔术手

              (2)
遵照2-2式的盘算办法总计出 Log[R(x,y)]的值。

       
 由上述三幅图的效果得出的定论:

   
杂谈中说,尺度取值较刻钟, 可以较好地形成动态范围的削减,暗区域的底细能收获较好地增强,但输出颜色易失真;取值较大时,色感一致性较好。
我倒是没来看尺度小有什么好处。

  图片 47 
 图片 48

    效果测试:

     (2)
 对各类尺度下开展添加总括  Log[R(x,y)] =  Log[R(x,y)] + Weight(i)*
( Log[Ii(x,y)]-Log[Li(x,y)]);
 其中Weight(i)表示每个尺度对应的权重,要求各尺度权重之和必须为1,经典的取值为等权重。

     1、输入:
原始图像数据I(x,y),尺度(也就是所谓的混淆的半径)

       Log[R(x,y)] =
Log[I(x,y)]-Log[L(x,y)];                
     (2-2)

               
 MSRCR(Dynamic=1)增强图像                          
 MSRCR(Dynamic=2)增强图像                        
 MSRCR(Dynamic=5)增强图像

   
关于Rentinex,在共享两篇相比经典的英文杂文:

  图片 49 
 图片 50  图片 51

   
 其他的步骤和单尺度的从未有过分别。

 

                     
 原图                                                 MSRCR            
                                    美图秀秀 

   
 由此这多少个算法的细路就很简短了,具体步骤如下:

   
(3)Dynamic取值越小,图像的自查自纠度越强。

  
 SSR和MSR在最大规格相同的时候什么人好什么人坏我还真讲不清。

   
从我当下的问询来看,GIMP的contrast-retinex.c文件里使用的算法很好,效果也很好。他平昔从量化的措施上动手,引入了均值和均方差的概念,再增长一个决定图像动态的参数来落实无色偏的调试过程,简要描述如下。

   
关于什么人是何人非,为制止不必要的口舌之争,那里仍旧提交给位看管去辨别吧。

   
为了拿走更好的效应,人们又开发出所谓的多尺度视网膜增强算法(MSR,
Multi-Scale
Retinex),最为经典的就是3原则的,大、中、小,既能实现图像动态范围的缩减,又能保全色感的一致性较好。同单尺度相比较,该算法有在测算Log[R(x,y)]的值时步骤有所不同:

 

   
(4)一般的话Dynamic取值2-3以内能博取相比较强烈的增高效用,即能收获很自然过渡效果,又能维系图像的清晰度适度提升。

 
  图片 52  图片 53  图片 54 

                     
  原图                                    
 经过SSR(尺度为300)增强后的图像              
经过MSR(最大口径为300,尺度数为3)增强后的图像

 
  图片 55  图片 56  图片 57

 
 图片 58 
 图片 59  图片 60 
   

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

            Min = Mean

    (1)
需要对原有图像进行每个尺度的高斯模糊,拿到模糊后的图像Li(x,y),其中小标i表示原则数。

   
对下面的辩解的举办一个粗略的注释吧。把这多少个技术使用到图像处理上,就是本着我们现在早就取得的一副图像数据I(x,y),统计出相应的R(x,y),则R(x,y)认为是提升后的图像,现在的要害是如何赢得L(X,Y)。Retinex理论的发起人提出这一个L(x,y)可以因而对图像数据I(x,y)进行高斯模糊而得到,很多杂谈中都列出了十分主旨/围绕函数以及需要归一化的K值,搞的不在少数新手都不知情是何等了,其实就是一个模糊而已。从骨子里行使的角度来说,也足以用均值模糊来代替高斯模糊。

 
  图片 61  图片 62  图片 63

 
  图片 64 
 图片 65  图片 66

   
 图片 67 
 图片 68 
 图片 69

  • Dynamic * Var;
        (3)  对Log[R(x,y)]的每一个值Value,举办线性映射: 

   
将(2-1)式两边取对数,则可抛开入射光的特性得到物体的本来面貌,即有关系式

                   
原始图像                                             MSRCR增强的效应    
                                   NASA的Retinex增强结果

*** ***  
 为此,钻探者又开发出一种名叫带色彩复苏的多尺度视网膜增强算法(MSRCR,Multi-Scale
Retinex with Color Restoration) ,具体商量的历程详见 <A Multiscale
Retinex for Bridging the Gap Between Color Images and the Human
Observation of
Scenes>那篇论文,这里要说的是,我觉得杂文里的措施不起任何效能,并且杂谈里为了这一个又引入了太多的可调参数,扩张了算法的错综复杂,不便宜自动化实现。

   
 就是经过这么简单的拍卖,实践申明可以收获十分好的法力,下边贴出一些拍卖后的机能。

   
Retinex这多少个词是由视网膜(Retina)和大脑皮层(Cortex)
三个词组合构成的。Retinex理论紧要涵盖了三个方面的内容:物体的颜色是由物体对长波、
中波和短波光线的反射能力决定的,而不是由反射光强度的相对值控制的;物体的情调不受光照 非均匀性的熏陶,具有一致性
。 

     2、处理:(1)
统计原始图像按指定尺度举办模糊后的图像 L(x,y);

                     
   原图                                  
经过Retinex(尺度为10)增强后的图像            
 经过Retinex(尺度为300)增强后的图像

 
  图片 70   图片 71 
 图片 72

   
  由以上三幅图的效能得出的定论:

            Max = Mean

  式中: I(x,y)代表被观望或照相机接收到的图像信号;L(x,y)代表环境光的炫耀分量
;R(x,y)表示带领图像细节新闻的对象物体的反光分量 。

相关文章