zoukankan      html  css  js  c++  java
  • 带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用。

        Retinex这个词是由视网膜(Retina)和大脑皮层(Cortex) 两个词组合构成的。Retinex理论主要包含了两个方面的内容:物体的颜色是由物体对长波、 中波和短波光线的反射能力决定的,而不是由反射光强度的绝对值决定的;物体的色彩不受光照 非均匀性的影响,具有一致性 。 

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

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

      式中: I(x,y)代表被观察或照相机接收到的图像信号;L(x,y)代表环境光的照射分量 ;R(x,y)表示携带图像细节信息的目标物体的反射分量 。

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

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

        对上面的理论的进行一个简单的注释吧。把这个技术运用到图像处理上,就是针对我们现在已经获得的一副图像数据I(x,y),计算出对应的R(x,y),则R(x,y)认为是增强后的图像,现在的关键是如何得到L(X,Y)。Retinex理论的提出者指出这个L(x,y)可以通过对图像数据I(x,y)进行高斯模糊而得到,很多论文中都列出了那个中心/围绕函数以及需要归一化的K值,搞的很多新手都不明白是什么了,其实就是一个模糊而已。从实际运用的角度来说,也可以用均值模糊来代替高斯模糊。

         因此这个算法的细路就很简单了,具体步骤如下:

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

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

                  (2) 按照2-2式的计算方法计算出 Log[R(x,y)]的值。

                  (3) 将 Log[R(x,y)]量化为0到255范围的像素值,作为最终的输出。

        可以看得出,算法很简单,其核心的东西还是在于高斯模糊的实现。关于高斯模糊,网上有很多快速优化的文章参考,具体的参考代码可能很少有好人提供的。

        注意到一点,似乎在量化的时候没有谁会将 Log[R(x,y)]进行Exp函数的运算而直接得到R(x,y),至于为什么,我无法给出明确的答案。

        量化的方式其实有很多种,而这个方法在很大的程度上对处理的效果有着决定性的影响。至今我没看到有哪一篇论文对这一块讲的很清楚,也不知道他们的那些结果是如何取得的,一种最简单的方式就是计算出Log[R(x,y)]的最大值Max和最小值Min,然后对每一个值Value,进行线性量化,公式为:

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

        效果测试:

             

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

            

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

        论文中说,尺度取值较小时, 能够较好地完成动态范围的压缩,暗区域的细节能得到较好地增强,但输出颜色易失真;取值较大时,色感一致性较好。 我倒是没看出尺度小有什么好处。

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

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

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

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

         其他的步骤和单尺度的没有区别。

               

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

               

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

        SSR和MSR在最大尺度相同的时候谁好谁坏我还真讲不清。

         在以上的两幅测试图像中,特别是第二幅,我们看到明显的偏色效果,这就是SSR和MSR普遍都存在的问题。给一段比较经典的论文中的原话供大家参考:

          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).

         为此,研究者又开发出一种称之为带色彩恢复的多尺度视网膜增强算法(MSRCR,Multi-Scale Retinex with Color Restoration) ,具体讨论的过程详见 <A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes>这篇论文,这里要说的是,我认为论文里的方法不起任何作用,并且论文里为了这个又引入了太多的可调参数,增加了算法的复杂性,不利于自动化实现。

        从我目前的了解来看,GIMP的contrast-retinex.c文件里使用的算法很好,效果也很好。他直接从量化的方式上入手,引入了均值和均方差的概念,再加上一个控制图像动态的参数来实现无色偏的调节过程,简要描述如下。

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

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

                Min = Mean - Dynamic * Var;  

                Max = Mean + Dynamic * Var;
        (3)  对Log[R(x,y)]的每一个值Value,进行线性映射: 

               R(x,y) = ( Value - Min ) / (Max - Min) * (255-0) ,同时要注意增加一个溢出判断,即:

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

         就是经过这么简单的处理,实践证明可以取得非常好的效果,下面贴出一些处理后的效果。

           

         MSR(最大尺度为300,尺度数为3)增强图像           MSRCR(最大尺度为300,尺度数为3,Dynamic=2)增强图像   MSRCR(最大尺度为300,尺度数为6,Dynamic=2)增强图像

            

          MSR(最大尺度为300,尺度数为3)增强图像          MSRCR(最大尺度为300,尺度数为3,Dynamic=2)增强图像   MSRCR(最大尺度为300,尺度数为6,Dynamic=2)增强图像

             由以上三幅图的效果得出的结论:

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

            (2)对于MSRCR,尺度数对结果的影像不是特别大,但是随着尺度数的增加,算法耗时会线性增加,因此,一般尺度数取3就较为合适了。

             继续贴图做比较:

            

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

                 

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

          由以上三幅图的效果得出的结论:

        (3)Dynamic取值越小,图像的对比度越强。

        (4)一般来说Dynamic取值2-3之间能取得较为明显的增强效果,即能取得很自然过渡效果,又能保持图像的清晰度适度增强。

         关于最大尺度,个人建议取值以大于100为佳。

         retinex算法的效果对于一些正常的图像处理后的效果并不佳,我们可以认为他就是为那些在外界环境不理想的状态下拍摄的图像增强而设计的,特别的,对于航拍的雾天图片,医学上的成像图片等成像条件恶劣的图有很明显的效果,再列出一些照片处理效果。

              

              

              

             

              

              

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

        上述照片均使用最大尺度为300,尺度数为3,Dynamic=2时的效果。

        由以上几组照片,可以看到,Retinex在图像去雾、宇航图、医学图像、老照片等图像的处理上效果很是明显。

        NASA的处理效果要比我这里的MSRCR好一些,这当然无可厚非,人家是什么单位啊。

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

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

            

                          原图                                             MSRCR                                                    美图秀秀 

         

                     可牛影像                                                  光影魔术手

           

                           原图                                                 MSRCR                                                 美图秀秀 

          

                     可牛影像                                                 光影魔术手

        关于谁是谁非,为避免不必要的口舌之争,这里还是交给给位看管去分辨吧。

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

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

     

        

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

        Multi-Scale Retinex for Color Image Enhancement

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

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

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

     

     

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

  • 相关阅读:
    彻底领悟javascript中的exec与match方法
    javascript doT 使用
    pluginstorage 插件
    html5离线储存,application cache,manifest使用体验
    window.location.hash属性介绍 ajax后退按钮失效问题
    控制textarea光标移到末尾
    webkitanylink 谷歌浏览器CSS之A:HOVER
    正则表达式详细参考文档
    复杂应用的 CSS 性能分析和优化建议
    seaJs api 帮助文档
  • 原文地址:https://www.cnblogs.com/Imageshop/p/3026881.html
Copyright © 2011-2022 走看看