为您推荐:
精华内容
最热下载
问答
  • 2KB weixin_38530995 2021-05-30 04:48:10
  • 1KB weixin_42668301 2021-09-29 00:20:53
  • 3星
    3KB piaoxuezhong 2017-10-19 16:11:04
  • 4KB qq_41881145 2021-01-19 10:25:09
  • 带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用。  Retinex这个词是由视网膜(Retina)和大脑皮层(Cortex) 两个词组合构成的。Retinex理论主要包含了两个方面的内容:物体的颜色是由物体对长波、 ...
     
    

        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                                                 美图秀秀 

          

                     可牛影像                                                 光影魔术手

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

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

        http://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的下载链接(要像完全看懂其中的所有代码的意思很困难,但是要提取其中的算法部分就不那么复杂了)。

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

     



      最近再次看了一下IPOL网站,有一篇最近发表的文章,名字就是Multiscale Retinex,感觉自己对这个已经基本了解了,但还是进去看了看,也有一些收获,于是抽空把他们稍微整理了下,原始文章及其配套代码详见:http://www.ipol.im/pub/art/2014/107/

          之前在我的 带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用 一文中已经较为详细的描述了Multiscale Retinex的基本原理和应用,这里就不再做过多的说明。为表述方便,还是贴出其基本的计算原理:

        

      上式中,I为原始输入图像,F是滤波函数,一般为高斯函数,N为尺度的数量,W为每个尺度的权重,一般都为1/N, R表示在对数域的图像的输出。

      由于R是对数域的输出,要转换为数字图像,必须将他们量化为[0,255]的数字图像范畴,关于这个量化的算法,有这极为重要的意义,他的好坏直接决定了最终输出的图像的品质。

      目前,结合上述文章中提出的一些过程,有4种方式进行处理:

      第一种,也是最容易想到的就是,直接线性量化,即采用下式进行处理:

           

      这种方式,由于Retinex数据处理后的高动态特性,数据分布很广,会出现严重的两极化现象,一般难以获得满意的结果。

      第二种,就是在经典的MSRCR文章《A Multiscale Retinex for Bridging the Gap Between Color Images and the Human Observation of Scenes》中提出的Canonical Gain/Offset 算法。计算公式如下:

                 

      其中G和b为经验参数。

      第三种,实在上述文章中提到的Simplest Color Balance(我简写为SCR)方式,这种方式的处理类似于Photoshop中的自动色阶,他把数据按照一定的百分比去除最小和最大的部分,然后中间的部分重新线性量化到0和255之间。

      第四种,就是GIMP的Retinex算法,这个可详见 带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用 一文的描述。

      还有一种方式,就是大家知道HDR的过程吧,他也是将高动态的数据量化到图像的可视范围,因此可以直接将这类算法应用与这个问题上。我也做了实验,效果似乎一般。

      在用第二种或第三种方式处理时,最好还需要有个Color Restoration的过程,因为如果直接对MSR处理的结果进行量化,得到的图像往往整体偏灰度,这是由于原始的彩色值经过log处理后的数据范围就比较小了,这样各通道之间的差异也很小,而之后的线性量化比log曲线要平滑很多,因此整体就丧失了彩色。

      论文中提出了修正方式如下:

              

              

              

     

       其中β=46,α=125为经验参数,但是最终我的分析认为β不可能取这么大,取1试验表明效果还不错。

       对于一些原始图像HUE较为合理的图,如果用经典的MSRCR算法,会导致处理后的图容易偏色,上述论文提出了对图像的Intensity数据进行Retinex处理,然后再把数据根据原始的RGB的比例映射到每个通道,这样就能在保留原始颜色分布的基础上增强图像,文章中称其为MSRCP。

      这个算法的编码论文的附带代码里已经有了很好的例子了,其实真是很简单的工作,需要的朋友自己去参考。

      我自己做了5种算法的比较,分别是:

          MSRCRGIMP    -    Gimp内嵌的Retinex增强算法

          MSRCRStandard  -    按照《A Multiscale Retinex ....  the Human Observation of Scenes》一文写的算法,其中G=30,B=-6,β=1,α=125

          MSRCRSCR      -          使用Color Restoration + Simplest Color Balance算法量化得到的结果

            MSRCPSCR      -          使用Intensity数据 + Simplest Color Balance算法量化得到的结果

          MSRHSV      -    对HSV空间的V分量进行(用的SCR量化)Retinex处理并返回RGB空间后的结果

      他们的效果比较如下:

      

            original                         MSRCRGIMP                                   MSRCRStandard

      

               MSRCRSCR                        MSRCPSCR                        MSRHSV

      

            original                           MSRCRGIMP                                MSRCRStandard

      

           MSRCRSCR                            MSRCPSCR                        MSRHSV

      

            original                           MSRCRGIMP                                MSRCRStandard

      

             MSRCRSCR                            MSRCPSCR                        MSRHSV  

      孰好孰坏给位自己去斟酌吧。

      算法效果测试:http://files.cnblogs.com/Imageshop/Retinex%E7%BB%BC%E5%90%88.rar

      很久没有写博客了,其实也没有江郎才尽的感觉,就是呢没有想写的冲动。现在写也无以前那么认真了,感觉就是像计流水账一样。算了,记账就记账吧。

     

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

     



    展开全文
    yayan01 2015-12-01 14:49:43
  • 5星
    1KB weixin_42696271 2021-09-11 04:39:51
  • 3.37MB weixin_38735101 2021-03-25 13:28:05
  • 1.28MB hubeixiaocheng 2018-06-14 09:36:17
  • 18KB qq_33292612 2019-06-05 15:51:17
  • 1.28MB lys07962000 2019-06-16 12:05:40
  • 5星
    1.61MB bluecol 2015-05-14 15:43:44
  • 946KB sinat_15559987 2014-05-19 11:42:12
  • 达到颜色平衡的结果 MSRCR代码如下: 效果图(左上:原图,右上:SSR,左下:MSR,右下:MSRCR) 作为一枚技术小白,写这篇笔记的时候参考了很多博客论文,在这里表示感谢,同时,未经同意,请勿转载.... 关于...

    视网膜-大脑皮层(Retinex)理论认为世界是无色的,人眼看到的世界是光与物质相互作用的结果,也就是说,映射到人眼中的图像和光的长波(R)、中波(G)、短波(B)以及物体的反射性质有关

    50705aa1348cebd23b8d1f9d8f232922.png

    其中I是人眼中看到的图像,R是物体的反射分量,L是环境光照射分量,(x, y)是二维图像对应的位置

    基于上面的原理,看下Retinex常见的几种增强算法

    一、SSR(Single Scale Retinex)单尺度Retinex算法

    它通过估算L来计算R,具体来说,L可以通过高斯模糊和I做卷积运算求得,用公式表示为:

    1f8d6104d9f52ef6a1c0d015c58f1f0c.png

    其中F是高斯模糊的滤波器,“ * ”表示卷积运算

    5edb5c797cf5b5e5b35feb23690bbfa2.png

    其中σ称为高斯周围空间常数(Gaussian Surround Space Constant),也就是算法中所谓的尺度,对图像处理有比较大的影响,对于二维图像

    fd2cdd23dddcba12fbc99d31e6037099.png对应于图像中位置,即:

    acb9d47cd82d5cc51e94ab8855912820.png

    因此,这个算法的思路就可以归结为以下几步:

    1、输入: 原始图像数据I(x,y),尺度(也就是高斯函数中的σ)

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

    ②按照log(R)=log(I)-log(L)公式的计算方法计算出 Log[R(x,y)]的值

    ③将 Log[R(x,y)]量化为0到255范围的像素值,作为最终的输出,量化公式:R(x,y) = ( Value - Min ) / (Max - Min) * (255-0)(注:无需将Log[R(x,y)]进行Exp函数的运算,而是直接利用Log[R(x,y)]进行量化,即上述公式中的value值)

    代码如下:

    02a87610bf44987f7405ca4dda123184.png

    效果图(左边是原图,右边是SSR效果图):(其中σ=300,即代码中的sigma=300)

    4cf9769f7f0d2d4c03dda63bf9d58f99.png 

    71a4f6d7bfc1c4b9fd27835c5d21ed59.png

    二、MSR(Multi-Scale Retinex)多尺度Retinex算法

    多尺度视网膜增强算法(MSR, Multi-Scale Retinex),最为经典的就是3尺度的,大、中、小,既能实现图像动态范围的压缩,又能保持色感的一致性较好。基于单尺度Retinex算法,多尺度Retinex算法描述如下:

    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,经典的取值为等权重。

    如果尺度数为3,则:W1=W2=W3=1/3

    代码如下:

    d7e5b0d2048f1d3c401a7f3e23578020.png

    效果图(左边是原图,中间是SSR效果图,右边是MSR效果图)

    caaf45eb9763afce3e390e3ccc57b7be.png 

    cd1a836e7468d35982deb7051a10997b.png 

    fe69a5970fb588a34897374c48986f75.png

    三、MSRCR(Multi-Scale Retinex with Color Restoration)具有色彩恢复的多尺度Retinex算法

    在前面的增强过程中,图像可能会因为增加了噪声,而使得图像的局部细节色彩失真,不能显现出物体的真正颜色,整体视觉效果变差。针对这一点不足,MSRCR在MSR的基础上,加入了色彩恢复因子C来调节由于图像局部区域对比度增强而导致颜色失真的缺陷.

    先看一组公式:

    RMSRCR(x,y)'=G⋅RMSRCR(x,y)+b

    RMSRCR (x,y)=C(x,y)RMSR(x,y)

    C(x,y)=f[I'(x,y)]=f[I(x,y)/∑I(x,y)]Ci(x,y)=f[Ii′(x,y)]=f[Ii(x,y)∑j=1NIj(x,y)]

    f[I'(x,y)]=βlog[αI'(x,y)]=β{log[αI'(x,y)]−log[∑I(x,y)]}

    如果是灰度图像,只需要计算一次即可,如果是彩色图像,如RGB三通道,则每个通道均需要如上进行计算

    G表示增益Gain(一般取值:5)

    b表示偏差Offset(一般取值:25)

    I (x, y)表示某个通道的图像

    C表示某个通道的彩色回复因子,用来调节3个通道颜色的比例;

    f(·)表示颜色空间的映射函数;

    β是增益常数(一般取值:46);

    α是受控制的非线性强度(一般取值:125)

    MSRCR算法利用彩色恢复因子C,调节原始图像中3个颜色通道之间的比例关系,从而把相对较暗区域的信息凸显出来,达到了消除图像色彩失真的缺陷。 处理后的图像局部对比度提高,亮度与真实场景相似,在人们视觉感知下,图像显得更加逼真;但是MSRCR算法处理图像后,像素值一般会出现负值。所以从对数域r(x, y)转换为实数域R(x, y)后,需要通过改变增益Gain,偏差Offset对图像进行修正。

    另外:介绍下什么是颜色的简单白平衡(simplest Color Balance)

    白平衡的意思就是:是图片中最亮的部分为白色,最暗的部分为黑色。其余部分进行拉伸

    简单的说就是:在RGB三通道上分别统计每个像素值的出现次数。将1%的最大值和最小值设置为255和0。其余值映射到(0,255),这样使得每个值通道的值在RGB中分布较均匀。达到颜色平衡的结果

    MSRCR代码如下:

    ea295aabec00d72d7d98f0961826a76b.png

    效果图(左上:原图,右上:SSR,左下:MSR,右下:MSRCR)

    bd1742560437ef7087a2a7f02519c5ff.png   

    5f8bb15d0a9f75bc8b03becf9bcf15e8.png

    1b8baee7c06f49af58e8c380df19399a.png    

    622771444d268244cb7b721a00cf57c3.png

    作为一枚技术小白,写这篇笔记的时候参考了很多博客论文,在这里表示感谢,同时,未经同意,请勿转载....

    关于Retinex图像增强算法的一些新学习。

    最近再次看了一下IPOL网站,有一篇最近发表的文章,名字就是Multiscale Retinex,感觉自己对这个已经基本了解了,但还是进去看了看,也有一些收获,于是抽空把他们稍微整理了下,原始文章及其 ...

    基于Matlab的MMSE的语音增强算法的研究

    本课题隶属于学校的创新性课题研究项目.2012年就已经做完了,今天一并拿来发表.   目录: --基于谱减法的语音信号增强算法..................................... ...

    【红外DDE算法】数字细节增强算法的缘由与效果(我对FLIR文档详解)

    [红外DDE算法]数字细节增强算法的缘由与效果(我对FLIR文档详解) 1. 为什么红外系统中图像大多是14bit(甚至更高)?一个红外系统的性能经常以其探测的范围来区别,以及其对最小等效温差指标.首 ...

    Atitit 图像处理30大经典算法attilax总结

    Atitit 图像处理30大经典算法attilax总结 1. 识别模糊图片算法2 2. 相似度识别算法(ahash,phash,dhash)2 3. 分辨率太小图片2 4. 横条薯条广告2 5. 图像 ...

    Retinex图像增强算法代码

    http://www.cnblogs.com/sleepwalker/p/3676600.html?utm_source=tuicool http://blog.csdn.net/carson2005 ...

    Retinex图像增强算法

    前一段时间研究了一下图像增强算法,发现Retinex理论在彩色图像增强.图像去雾.彩色图像恢复方面拥有很好的效果,下面介绍一下我对该算法的理解. Retinex理论 Retinex理论始于Land和M ...

    retinex图像增强算法的研究

    图像增强方面我共研究了Retinex.暗通道去雾.ACE等算法.其实,它们都是共通的.甚至可以说,Retinex和暗通道去雾就是同一个算法的两个不同视角,而ACE算法又是将Retinex和灰度世界等白 ...

    【20160924】GOCVHelper MFC增强算法(1)

    //递归读取目录下全部文件(flag为r的时候递归)     void getFiles(string path, vector& files,string ...

    机器学习之Adaboost &lpar;自适应增强&rpar;算法

    注:本篇博文是根据其他优秀博文编写的,我只是对其改变了知识的排序,另外代码是中的.转载请标明出处及参考资料. 1 Adaboost 算法实现过程 1.1 什么是 Adabo ...

    随机推荐

    Hadoop多节点集群安装配置

    目录: 1.集群部署介绍 1.1 Hadoop简介 1.2 环境说明 1.3 环境配置 1.4 所需软件 2.SSH无密码验证配置 2.1 SSH基本原理和用法 2.2 配置Master无密码登录所有 ...

    Sending e-mail

    E-mail functionality uses the Apache Commons Email library under the hood. You can use theplay.libs. ...

    C&num;使用COM搜索本地word文档关键字

    /// /// 检索根目录下的子目录及其所有文件,并在datagridview中显示文档名称及路径--递归调用 /// /// &lt ...

    扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip

    原文:扩展ToolBarManager.ListView和Grid控件以实现气球式的ToolTip infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的 ...

    CAReplicatorLayer复制Layer和动画&comma; 实现神奇的效果

    今天我们看下CAReplicatorLayer, 官方的解释是一个高效处理复制图层的中间层.他能复制图层的所有属性,包括动画. 一样我们先看下头文件 @interface CAReplicatorLa ...

    OpenCV绘制图像中RGB三个通道的直方图

    一开始是看这本书学做直方图,但是书本里说直方图的部分只详细说了黑白图像(单通道)的直方图绘制方法,RGB图像的直方图只说了如何计算,没有说计算完 ...

    迅为-i&period;MX6Q核心板&lowbar;四核工业级

    飞思卡尔Freescale Cortex A9 四核处理器处理器:CPU Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 核心板工艺:十层设计,沉金工艺基本参数:内存 ...

    FB01与F-02的区别&lpar;转载&rpar;

    FB01与F-02的区别(转载) FB01 : a) ''Post Document'' b) No doc type as SA automatically comes. c) No automat ...

    django默认后台使用

    1.初始化数据python manage.py migrate 2.创建超级用户python manage.py createsuperuser 然后按照提示输入就可以了 3.admin管理页面找不到 ...

    第5章—构建Spring Web应用程序—SpringMVC详解

    SpringMVC详解 5.1.跟踪Springmvc的请求 SpringMVC的核心流程如下: 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求 ...

    展开全文
    weixin_33055757 2021-05-08 06:46:29
  • % MSRCR Method For Image Processing% Test for Digital Image Processing% By Gu Jinjin 2012/10/16-17% Refer to Retinex processing for automatic image enhancemen% And thank videoandimage08's help for sha...

    % MSRCR Method For Image Processing

    % Test for Digital Image Processing

    % By Gu Jinjin 2012/10/16-17

    % Refer to Retinex processing for automatic image enhancemen

    % And thank videoandimage08's help for sharing me some Info

    % ------

    clc;clear all;

    % 读取图像灰度值

    I = imread('test.jpg');

    IR = I(:,:,1);

    IG = I(:,:,2);

    IB = I(:,:,3);

    % 转换为 double 类型

    IR_double = double(IR);

    IG_double = double(IG);

    IB_double = double(IB);

    % Set Gaussian Parameters

    sigma1 = 5;

    sigma2 = 20;

    sigma3 = 240;

    % 矩阵化网格向量

    [x,y] = meshgrid((-(size(IR,2)-1)/2):(size(IR,2)/2),(-(size(IR,1)-1)/2):(size(IR,1)/2));

    % 计算高斯环境函数 Fk

    gauss1 = exp(-(x.^2+y.^2)/(sigma1*sigma1));

    % 归格化 Fk = k*Fk

    Gauss1 = gauss1/sum(gauss1(:));

    gauss2 = exp(-(x.^2+y.^2)/(sigma2*sigma2));

    Gauss2 = gauss2/sum(gauss2(:));

    gauss3 = exp(-(x.^2+y.^2)/(sigma3*sigma3));

    Gauss3 = gauss3/sum(gauss3(:));

    % 计算MSR,MSRCR

    for i = 1:3

    % MSR Part

    if i == 1

    Ii = IR;

    Ii_double = IR_double;

    elseif i == 2

    Ii = IG;

    Ii_double = IG_double;

    else

    Ii = IB;

    Ii_double = IB_double;

    end

    % 将图像转换到对数域

    Ii_log = log(Ii_double+1);

    % 对图像傅里叶变换,转换到频域

    f_Ii = fft2(Ii_double);

    fgauss = fft2(Gauss1,size(Ii,1),size(Ii,2));

    fgauss = fftshift(fgauss);

    % 卷积

    FI1 = ifft2(fgauss.*f_Ii);

    minv = min(min(FI1));

    FI1_log = log(FI1-minv+1);

    % 计算R, MSR公式

    R1 = Ii_log - FI1_log;

    fgauss = fft2(Gauss2,size(Ii,1),size(Ii,2));

    fgauss = fftshift(fgauss);

    % 卷积

    FI2 = ifft2(fgauss.*f_Ii);

    minv = min(min(FI2));

    FI2_log = log(FI2-minv+1);

    R2 = Ii_log - FI2_log;

    fgauss = fft2(Gauss3,size(Ii,1),size(Ii,2));

    fgauss = fftshift(fgauss);

    % 卷积

    FI3 = ifft2(fgauss.*f_Ii);

    minv = min(min(FI3));

    FI3_log = log(FI3-minv+1);

    R3 = Ii_log - FI3_log;

    % 加权求和得到 MSR R(x1,x2)

    Wk = 1/3;

    R = Wk*R1 + Wk*R2 + Wk*R3;

    % 计算 alpha, 取f() = log

    %N = 3;

    %alpha = log(N*Ii_double)-log(IR_double+IG_double+IB_double);

    %CR = alpha.*R;

    % MSRCR

    % 设定参数

    G = 192; b = -30;

    alpha = 125;

    beta = 46;

    CR = beta*(log(alpha*Ii_double+1))-log(IR_double+IG_double+IB_double+1);

    CR=G*CR.*R+b;

    % 转化为灰度值

    R = mat2gray(abs(R));

    CR = mat2gray(abs(CR));

    % figure,imshow(Rr);

    if i == 1

    MSRr = R;

    MSRCRr = CR;

    elseif i == 2

    MSRg = R;

    MSRCRg = CR;

    else

    MSRb = R;

    MSRCRb = CR;

    end

    end

    % imshow

    % 将三通道图像拼接

    IMSR = cat(3,MSRr,MSRg,MSRb);

    IMSRCR = cat(3,MSRCRr,MSRCRg,MSRCRb);

    % 显示原始图像

    figure,imshow(I);

    % MSR处理后图像

    figure,imshow(IMSR);

    % MSRCR处理后后图像

    figure,imshow(IMSRCR);

    展开全文
    weixin_34025386 2021-05-08 06:46:29
  • 3星
    4KB u012841284 2015-05-13 16:46:45
  • 三丶彩色恢复多尺度Retinex——MSRCR,MSRCP等 对多尺度MSR结果做了色彩平衡,归一化,增益和偏差线性加权 四丶参数说明 { “sigma_list”: [15, 80, 200],多尺度高斯模糊sigma值 “G” : 5.0,增益 ...

    转载请注明出处:https://blog.csdn.net/weixin_38285131/article/details/88097771

    最近在做街景图象色彩校正方面的工作,对于过暗,过曝光,以及背光等现象,用过一些gamma校正以及其他的方法,最终选择基于Retinex原理的方法对这几种现象都有一定的增强效果。

    Retinex理论基于一下假设:
    1.真实世界是无颜色的,我们所感知的颜色是光与物质的相互作用的结果。我们见到的水是无色的,但是水膜—肥皂膜却是显现五彩缤纷,那是薄膜表面光干涉的结果。
    2.每一颜色区域由给定波长的红、绿、蓝三原色构成的;
    3.三原色决定了每个单位区域的颜色。

    Retinex理论的基础理论是物体的颜色是由物体对长波(红色)、中波(绿色)、短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的绝对值来决定的,物体的色彩不受光照非均匀性的影响,具有一致性,即retinex是以色感一致性(颜色恒常性)为基础的。不同于传统的线性、非线性的只能增强图像某一类特征的方法,Retinex可以在动态范围压缩、边缘增强和颜色恒常三个方面达到平衡,因此可以对各种不同类型的图像进行自适应的增强。
    40多年来,研究人员模仿人类视觉系统发展了Retinex算法,从单尺度Retinex算法,MSR改进成多尺度加权平均的MSR算法,再发展成彩色恢复多尺度MSRCR算法色彩增益加权的AutoMSRCR算法
    主要算法公式介绍可以参考如下博客:
    https://blog.csdn.net/ajianyingxiaoqinghan/article/details/71435098
    我再对这几种方法稍稍总结一下:

    一丶单尺度的Retinex——SSR
    可以理解为图像分解,一幅图像S(x,y)可以分为他的光照图象 I(x,y)和反射图像R(x,y),反射图象是根据物体本身的反射特性,所以基本不会发生变化,光照图像是根据环境明暗来决定的。

    只看公式的话感觉一下就看懵逼了,我感觉就三个步骤:

    1)将图像进行log变换
    2)然后将log图像进行高斯模糊
    3)利用原图和模糊之后的log图像做差分

    二丶多尺度的Retinex——MSR
    通俗解释:就是再多个单尺度Retinex做平均,区别是在第二步高斯模糊是选择的sigma是不同的

    原始图像进行三次SSR
    高斯模糊选择15,80,200作为高斯模糊sigma参数
    对三次的SSR结果做平均即为MSR图像

    三丶彩色恢复多尺度Retinex——MSRCR,MSRCP等

    对多尺度MSR结果做了色彩平衡,归一化,增益和偏差线性加权

    四丶参数说明

    {
    “sigma_list”: [15, 80, 200],多尺度高斯模糊sigma值
    “G” : 5.0,增益
    “b” : 25.0,偏差
    “alpha” : 125.0,
    “beta” : 46.0,
    “low_clip” : 0.01,
    “high_clip” : 0.99
    }

    五丶图像增强结果:

    在这里插入图片描述
    在这里插入图片描述

    六丶代码

    retinex.py

    import numpy as np
    import cv2
    
    def singleScaleRetinex(img, sigma):
    
        retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma))
    
        return retinex
    
    def multiScaleRetinex(img, sigma_list):
    
        retinex = np.zeros_like(img)
        for sigma in sigma_list:
            retinex += singleScaleRetinex(img, sigma)
    
        retinex = retinex / len(sigma_list)
    
        return retinex
    
    def colorRestoration(img, alpha, beta):
    
        img_sum = np.sum(img, axis=2, keepdims=True)
    
        color_restoration = beta * (np.log10(alpha * img) - np.log10(img_sum))
    
        return color_restoration
    
    def simplestColorBalance(img, low_clip, high_clip):    
    
        total = img.shape[0] * img.shape[1]
        for i in range(img.shape[2]):
            unique, counts = np.unique(img[:, :, i], return_counts=True)
            current = 0
            for u, c in zip(unique, counts):            
                if float(current) / total < low_clip:
                    low_val = u
                if float(current) / total < high_clip:
                    high_val = u
                current += c
                    
            img[:, :, i] = np.maximum(np.minimum(img[:, :, i], high_val), low_val)
    
        return img    
    
    def MSRCR(img, sigma_list, G, b, alpha, beta, low_clip, high_clip):
    
        img = np.float64(img) + 1.0
    
        img_retinex = multiScaleRetinex(img, sigma_list)
    
        img_color = colorRestoration(img, alpha, beta)    
        img_msrcr = G * (img_retinex * img_color + b)
    
        for i in range(img_msrcr.shape[2]):
            img_msrcr[:, :, i] = (img_msrcr[:, :, i] - np.min(img_msrcr[:, :, i])) / \
                                 (np.max(img_msrcr[:, :, i]) - np.min(img_msrcr[:, :, i])) * \
                                 255
        
        img_msrcr = np.uint8(np.minimum(np.maximum(img_msrcr, 0), 255))
        img_msrcr = simplestColorBalance(img_msrcr, low_clip, high_clip)       
    
        return img_msrcr
    
    def automatedMSRCR(img, sigma_list):
    
        img = np.float64(img) + 1.0
    
        img_retinex = multiScaleRetinex(img, sigma_list)
    
        for i in range(img_retinex.shape[2]):
            unique, count = np.unique(np.int32(img_retinex[:, :, i] * 100), return_counts=True)
            for u, c in zip(unique, count):
                if u == 0:
                    zero_count = c
                    break
                
            low_val = unique[0] / 100.0
            high_val = unique[-1] / 100.0
            for u, c in zip(unique, count):
                if u < 0 and c < zero_count * 0.1:
                    low_val = u / 100.0
                if u > 0 and c < zero_count * 0.1:
                    high_val = u / 100.0
                    break
                
            img_retinex[:, :, i] = np.maximum(np.minimum(img_retinex[:, :, i], high_val), low_val)
            
            img_retinex[:, :, i] = (img_retinex[:, :, i] - np.min(img_retinex[:, :, i])) / \
                                   (np.max(img_retinex[:, :, i]) - np.min(img_retinex[:, :, i])) \
                                   * 255
    
        img_retinex = np.uint8(img_retinex)
            
        return img_retinex
    
    def MSRCP(img, sigma_list, low_clip, high_clip):
    
        img = np.float64(img) + 1.0
    
        intensity = np.sum(img, axis=2) / img.shape[2]    
    
        retinex = multiScaleRetinex(intensity, sigma_list)
    
        intensity = np.expand_dims(intensity, 2)
        retinex = np.expand_dims(retinex, 2)
    
        intensity1 = simplestColorBalance(retinex, low_clip, high_clip)
    
        intensity1 = (intensity1 - np.min(intensity1)) / \
                     (np.max(intensity1) - np.min(intensity1)) * \
                     255.0 + 1.0
    
        img_msrcp = np.zeros_like(img)
        
        for y in range(img_msrcp.shape[0]):
            for x in range(img_msrcp.shape[1]):
                B = np.max(img[y, x])
                A = np.minimum(256.0 / B, intensity1[y, x, 0] / intensity[y, x, 0])
                img_msrcp[y, x, 0] = A * img[y, x, 0]
                img_msrcp[y, x, 1] = A * img[y, x, 1]
                img_msrcp[y, x, 2] = A * img[y, x, 2]
    
        img_msrcp = np.uint8(img_msrcp - 1.0)
    
        return img_msrcp
    

    run.py

    import sys
    import os
    
    import cv2
    import json
    
    import retinex
    
    data_path = 'data'
    img_list = os.listdir(data_path)
    if len(img_list) == 0:
        print( 'Data directory is empty.')
        exit()
    
    with open('config.json', 'r') as f:
        config = json.load(f)
    
    for img_name in img_list:
        if img_name == '.gitkeep':
            continue
        
        img = cv2.imread(os.path.join(data_path, img_name))
    
        print('msrcr processing......')
        img_msrcr = retinex.MSRCR(
            img,
            config['sigma_list'],
            config['G'],
            config['b'],
            config['alpha'],
            config['beta'],
            config['low_clip'],
            config['high_clip']
        )
        cv2.imshow('MSRCR retinex', img_msrcr)
        cv2.imwrite("MSRCR_retinex.tif",img_msrcr);
    
    
        print('amsrcr processing......')
        img_amsrcr = retinex.automatedMSRCR(
            img,
            config['sigma_list']
        )
        cv2.imshow('autoMSRCR retinex', img_amsrcr)
        cv2.imwrite('AutomatedMSRCR_retinex.tif', img_amsrcr)
    
    
        print('msrcp processing......')
        img_msrcp = retinex.MSRCP(
            img,
            config['sigma_list'],
            config['low_clip'],
            config['high_clip']        
        )    
    
        shape = img.shape
        cv2.imshow('Image', img)
    
        cv2.imshow('MSRCP', img_msrcp)
        cv2.imwrite('MSRCP.tif', img_msrcp)
        cv2.waitKey()
    
    展开全文
    weixin_38285131 2019-03-04 08:35:52
  • 1.69MB weixin_42682754 2021-10-02 00:31:24
  • qq_37957854 2021-02-03 00:24:52
  • mangsite 2020-02-19 11:30:45
  • 464KB u010906311 2015-01-23 22:10:15
  • Gordon_Wei 2019-10-05 21:18:25
  • 2KB weixin_42665725 2021-10-02 10:29:34
  • weixin_43641241 2019-05-27 17:44:21
  • weixin_43646592 2021-02-19 12:36:41
  • weixin_30066287 2021-04-20 12:15:13
  • h_l_dou 2018-11-06 20:55:55
  • h_l_dou 2018-11-06 20:34:48
  • Julialove102123 2019-04-24 07:30:32

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 281
精华内容 112
关键字:

msrcr