原来一直以为彩色图像的去色算法没啥研究价值。  这是首大古老的舆论中之算法。视频去雾效果。

   
因昨日写的焦急,有成千上万荒谬,特重写并追加了恰当的分解,并且认为对做图像处理的意中人的话,这个或许于诸多场地还是用得着的,因此去了原先随笔,又更颁发了生,非有意刷屏。

  这是首大古老的舆论被的算法,发表和1994年,是清华大学黄良凯(Liang-kai
Huang) 所描写,因此国外有论文里同代码里称之为Huang’s fuzzy thresholding
method。虽然古老吧异常简单,但是那个算法的规律还是值得学习之。

     原来一直以为彩色图像的去色算法没啥研究价值,网络达到业已生为数不少好像之算法了,比如有名的Gray
= R*0.299 + G*0.587 +
B*0.114公式,或者LAB颜色通道的L值,HSL的L通道等等,直到日前看一些论文,发现原来也生那么些人口对这进程进展了详细的钻暨创新。在上学这些算法的以,使自身吗认识及,任何你当简约的东西在不动声色还生或所有复杂的机理,只是你没有意识而已。

     该论文的初稿可自这边下载: Image
thresholding by minimizing the measure of
fuzziness。

原文:http://blog.csdn.net/laviewpbt/article/details/11555877

     
我先以简单单图片的例子来证实为何而对彩图去色的长河进展研讨,同时也证明了常用的法子存在的一些毛病。

    
该论文做了这处研究热潮的混淆集理论,提出了一如既往种有比较好成效的图像二值化算法,本文主要是指向那个进行简单的翻译和注释,并提供了测试代码。

 最新的效用见
:http://video.sina.com.cn/v/b/124538950-1254492273.html
 

     
下面水平4副图自漏洞百出至右依次为原图、PS的多彩转灰度命令、PS的去色命令和matlab的rgb2gray命令的功效。

     一、模糊集及其附属度函数

 
 
 可处理视频的言传身教:视频去雾效果

 图片 1
图片 2 图片 3 图片 4        

    
首先,我们假定X代表同样适合大小也M×N的保有L个色阶的灰度图像,而xmn表示图像X中点(m,n)处的像素灰度值,定义μx(xmn)表示该点具有某种属性的附属度值,也就是说我们定义了一个自图像X映射到[0,1]距离的混淆子集,用规范的模糊集表达,即来:

   
在图像去雾是领域,几乎没有丁非晓得《Single Image Haze Removal Using
Dark Channel
Prior》这首文章,该文是2009年CVPR最佳论文。作者何凯明博士,2007年清华大学毕业,2011年香港中文大学博士毕业,可谓是功力深厚,感叹于国内部分所谓博士的水准,何这样的博士才好真正叫Doctor。

 图片 5 图片 6 图片 7 图片 8

                                    
  图片 9

    
关于何博士之一对资料和论文,大家好看这里:http://research.microsoft.com/en-us/um/people/kahe/

    上面的功效有什么问题,不错,很多人口包自我开始也觉得如没啥异常毛病,可密切看,你虽会见发现第一帧图备受之晚霞以及晚霞在水中的倒影和日光在去色后曾死麻烦找到其踪迹了,而第二副图的红花和绿叶去色后为主转移得一样了,这实质上就是凡所谓的对比度丢失,这种丢失对于普通的图像处理用户可能问题未充分,不过对此图像分析者是殊不利于的。

      
其中0≤μx(xmn)≤1,m=0,1,…M-1,n=0,1,…N-1。对于二值化来说,每个像素对于其所属的色(前景或背景)都应生出格外相近之涉,因此,我们好这种关系来代表μx(xmn)的值。

    
最初步接触何的就篇论文是当2011年,说其实的不胜时段,只是凭浏览了下,看到其中的soft
matting过程比较复杂,并且实施进度好缓慢,就从未有过呀大的趣味。最近还要奇迹拾打,仔细研读,觉得论文的推理步骤特别清楚,讲解很到位。恰好适逢浏览到其另外一篇稿子《Guided
Image
Filtering》 ,其中涉及了可以据此导向滤波来取代soft
matting的进程,且速度很快,因此,我本着去雾的趣味算法又大大提高了。
 

    
针对此问题,不少作者都提出了化解方案,我这边列有三篇论文供有趣味之朋友参考:

      
定义h(g)表示图像遭到装有灰度级g的像素的个数,对于一个加的阈值t,背景及前景各自色阶值的平分值μ0和μ1可用下式表示:

     本文主要及是对《Single Image Haze
Removal Using Dark Channel
Prior》的翻译、整理、及一些解释。如果您的英文水准好,建议看原稿可能来之再次爽些。

     (1)Color2Gray:
Salience-Preserving Color
Removal  ,作者Amy
A. Gooch Sven C. Olsen Jack Tumblin Bruce Gooch

                                图片 10

    一、论文思想的简要描述 

     论文中提及的源码下载地址早就行不通了,我哉无记我当即是起乌下充斥到的,但的确是跟原文匹配的代码:http://files.cnblogs.com/Imageshop/Color2GrayMatlabCode.rar

                                       
 图片 11

     首先看望暗通道先验是什么:

    
这个代码仅仅有学习价值,因为作者以舆论中说100*100轻重缓急的图像算法用时12.7秒,这么丰富的光阴那还行个屁啊。

     
上述μ0和μ1,可以当是指定阈值t所对应之前景和背景的靶子价,而图像X中某个一点以及其所陈述之区域间的干,在直觉上应当同该点的色阶值与所属区域的目标值之间的别相关。因此,对于触发(m,n),我们提出如下的依附度定义函数:

      
在大部非天空的局部区域里,某部分像素总会产生最少一个颜色通道有十分没有的值。换言之,该区域就强度的尽小值是个可怜有些的累累。

     (2)Contrast Preserving
Decolorization ,作者 Cewu Lu Li Xu Jiaya Jia

         图片 12

  我们于暗通道一个数学概念,对于随意的输入图像J,其暗通道可以用下式表达:

     以及:

  其中C是一个常数,该常数使得0.5≤μx(xmn)≤1。因此,对于一个加以的阈值t,图像被另外一个像素要么属于背景,要么属于前景,因此,每个像素的隶属度不承诺小于0.5。

                                   图片 13 

     (3)Real-time Contrast Preserving
Decolorization,作者
Cewu Lu Li Xu Jiaya Jia

    
C值当事实上的编程中,可以为此图像的极深灰度值减去极端小灰度值来表达,即
C=gmax-gmin;

      式中Jc表示彩色图像的每个通道 ,Ω(x)表示以像素X为主干的一个窗口。 

  后少首文章配套的下载地址也:http://appsrv.cse.cuhk.edu.hk/~xuli/mypapers/cpcolor2gray_v2.zip

  二、模糊度的胸怀及取得阈值的法

   
式(5)的意思用代码表达为格外简短,首先要出每个像素RGB分量中的最小值,存入相同可和原来图像大小一样的灰度图中,然后重新指向这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定,一般生WindowSize
= 2 * Radius + 1;          

   
后少首文章还是咱国人的大手笔,不过未是地的,是香港大学的几乎个哲人的著述,我特别关注的凡Jiaya
Jia,。

    
模糊度表示了一个模糊集的歪曲程度,有某些种植量方式都被提及了,本文就用了香农熵函数来度量模糊度。

      暗通道先验的申辩指出:

   
特别是终极一篇稿子的算法,效果好还行进度快,能满足实时的求。

    
基于香农熵函数,一个歪曲集A的熵定义为:

                                                         
  图片 14           

   
这3篇论文都是为极端小化一个能量函数为目标的:

      
图片 15

     实际生活被致暗原色中低通道值主要有三单元素:a)汽车、建筑物与市中玻璃窗户的阴影,或者是叶、树及岩等当风光的黑影;b)色彩鲜艳的物体或外部,在RGB的老三只通道被微微通道的值大没有(比如绿色的草地/树/植物,红色或黄色的花/叶子,或者蓝色之水面);c)颜色较暗的物体或表面,例如灰暗色的干与石头。总之,自然风光中处处都是影子或者彩色,这些景点的图像的暗原色总是特别惨淡的。

         
图片 16      (1)

      其中香农函数:

     
我们抛开开论文中罗列的那些例子,自己打网上搜几幅没有雾的风景照,看看结果如下:

     其中gx,gy呢灰度化后底比如说素值。而δx,y虽说象征颜色对比度,三首论文被开的下都是故的LAB颜色空间的部分相关计算公式。

     
图片 17

   图片 18 
   图片 19

    
在第三篇论文被,作者进一步用对象函数改写为:

     
扩展至2维底图像,图像X的熵可以表达也:

   图片 20     图片 21

            
图片 22  (2)

     图片 23

   图片 24     图片 25

  式中:Nб凡高斯分布函数,△gx,y=gx-gy\ ;

  因为灰度图像及多单出L个色阶,因此采取直方图式(7)可更写成:

                     
一些无雾的图样                                                                               
  其暗通道

  然后优化的靶子即是求上式的极致特别价值。

        
图片 26

以看望有有雾的觊觎的暗通道:

     在第三篇论文中提出算法极其实用,他无如第二篇那样采用了二维的型,而是简化为同一维模型,类似于公式Gray
= R*0.299 + G*0.587 +
B*0.114,论文被吗是下W1,W2,W3老三只系数来支配结果值,但是就三个系数不是一定的,而是与用户输入的图像于适应之。同时起约规范W1>0;W2>0;W3>0,以及W1+W2+W3=1;满足当下几乎单原则的W1,W2,W3的价的组合要产生无比个底,但是笔者注意到系数的轻微转移于出口的结果的熏陶不是专门可怜,因此,论文中提出了拿每个系数在[0,1]里头量化为10等客,即单独取0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8,0.9、1.0立马11单价值,在满足约束规范的情事下,W1、W2、W2的构成总共仅见面出11*(11+1)/2
=66 种,如下所示:

    可以证明式(6)在区间[0,0.5]里头是枯燥递增而当[0.5,1]里面是乏味递减的,并且E(X)具有以下属性:

   图片 27   图片 28

W = [    0         0    1.0000
         0    0.1000    0.9000
         0    0.2000    0.8000
         0    0.3000    0.7000
         0    0.4000    0.6000
         0    0.5000    0.5000
         0    0.6000    0.4000
         0    0.7000    0.3000
         0    0.8000    0.2000
         0    0.9000    0.1000
         0    1.0000         0
    0.1000         0    0.9000
    0.1000    0.1000    0.8000
    0.1000    0.2000    0.7000
    0.1000    0.3000    0.6000
    0.1000    0.4000    0.5000
    0.1000    0.5000    0.4000
    0.1000    0.6000    0.3000
    0.1000    0.7000    0.2000
    0.1000    0.8000    0.1000
    0.1000    0.9000         0
    0.2000         0    0.8000
    0.2000    0.1000    0.7000
    0.2000    0.2000    0.6000
    0.2000    0.3000    0.5000
    0.2000    0.4000    0.4000
    0.2000    0.5000    0.3000
    0.2000    0.6000    0.2000
    0.2000    0.7000    0.1000
    0.2000    0.8000         0
    0.3000         0    0.7000
    0.3000    0.1000    0.6000
    0.3000    0.2000    0.5000
    0.3000    0.3000    0.4000
    0.3000    0.4000    0.3000
    0.3000    0.5000    0.2000
    0.3000    0.6000    0.1000
    0.3000    0.7000    0.0000
    0.4000         0    0.6000
    0.4000    0.1000    0.5000
    0.4000    0.2000    0.4000
    0.4000    0.3000    0.3000
    0.4000    0.4000    0.2000
    0.4000    0.5000    0.1000
    0.4000    0.6000    0.0000
    0.5000         0    0.5000
    0.5000    0.1000    0.4000
    0.5000    0.2000    0.3000
    0.5000    0.3000    0.2000
    0.5000    0.4000    0.1000
    0.5000    0.5000         0
    0.6000         0    0.4000
    0.6000    0.1000    0.3000
    0.6000    0.2000    0.2000
    0.6000    0.3000    0.1000
    0.6000    0.4000    0.0000
    0.7000         0    0.3000
    0.7000    0.1000    0.2000
    0.7000    0.2000    0.1000
    0.7000    0.3000    0.0000
    0.8000         0    0.2000
    0.8000    0.1000    0.1000
    0.8000    0.2000    0.0000
    0.9000         0    0.1000
    0.9000    0.1000    0.0000
    1.0000         0         0];

     (1)0≤E(X)≤1 ;

   图片 29   图片 30

   优化的目的就是是由输入图像的数码确定最妙的权值使得式(2)的价最老。

   
  (2)如果μx(xmn)=0或者μx(xmn)=1时,E(X)具有最小值0,在本文中μx(xmn)只可能啊1,此时分门别类具有无比好的明确性。

          一些有雾的图                                                                              
   其暗通道

    
考虑到图片内在的水彩的冗余性,为进一步提高速度,论文提出不以本来之图像被搜索最优系数,而是临时用图像缩小至一定范围,在缩放后的希冀被追寻寻,作者建议缩小至64*64(原图为当方便高的情事)大小,此时虽会增长速度,又非见面骤降精度,但是注意一点即便是不过是采用最近邻插值,因为就不会见产生新的像素。    

    
(3)当μx(xmn)=0.5,E(X)获得最好深价值1,此时的分类具有极其酷之含糊确性。

  上述暗通道图像俱运用的窗口大小也15*15,即绝小值滤波的半径为7像素。

    
上面两种优化措施,特别是摸索空间的这种离散化,我眷恋在博算法中都得去学的。

    
那么对于图像X,我们规定最好之阈值t的规则就是是:对于有所的恐怕的阈值t,取香农熵值最小时之深t为终极的分开阈值。

     
由上述几帧图像,可以判的看来暗通道先验理论的普遍性。在笔者的舆论中,统计了5000差不多合乎图像的特征,也都基本吻合这个先验,因此,我们得以认为实际一条定律。

  贴些和老三首文章基本对应之matlab代码。

     三、编程中的技术

     
有了此先验,接着就是用开展有数学方面的演绎来最后解决问题。

 1 function  img  = rtcprgb2gray(im)
 2  
 3 %%  Proprocessing 
 4 [n,m,ch] = size(im); 
 5 sigma = 0.05;
 6 W = wei();
 7  
 8  
 9 %%  Global and Local Contrast Computing
10 ims = imresize(im, round(64/sqrt(n*m)*[n,m]),'nearest');
11 R = ims(:,:,1);G = ims(:,:,2);B = ims(:,:,3);
12 imV = [R(:),G(:),B(:)];
13 defaultStream = RandStream.getDefaultStream; savedState = defaultStream.State;
14 t1 = randperm(size(imV,1));
15 Pg = [imV - imV(t1,:)];
16 
17 ims = imresize(ims, 0.5 ,'nearest');
18 Rx = ims(:,1:end-1,1) - ims(:,2:end,1);
19 Gx = ims(:,1:end-1,2) - ims(:,2:end,2);
20 Bx = ims(:,1:end-1,3) - ims(:,2:end,3);
21 
22 Ry = ims(1:end-1,:,1) - ims(2:end,:,1);
23 Gy = ims(1:end-1,:,2) - ims(2:end,:,2);
24 By = ims(1:end-1,:,3) - ims(2:end,:,3);
25 Pl = [[Rx(:),Gx(:),Bx(:)];[Ry(:),Gy(:),By(:)]];
26 
27 P = [Pg;Pl ]; 
28  
29 det = sqrt(sum(P.^2,2))/1.41  ;
30  
31 P( (det < 0.05),:) = []; det( (det < 0.05)) = [];
32 detM =  repmat(det,[1,size(W,1)]); L = P*W'; 
33  
34 %% Energy optimization
35  
36 U = log(exp(- (L + detM ).^2/sigma.^2) + exp(- (L- detM).^2/sigma.^2));
37 Es = mean(U); 
38  
39   
40  
41 %% Output
42 [NULLval,bw] = max(Es); 
43 img = imlincomb(W(bw,1),im(:,:,1) , W(bw,2),im(:,:,2) ,  W(bw,3),im(:,:,3));
44  
45 end

    
有了上述原理,其实编程也是桩非常爱的政工了,你得按照卿的想法去做,不过作者论文中之阐述会叫代码写起来重清楚、更实用。

  首先,在计算机视觉和电脑图形中,下述方程所讲述的雾图形成模型被广泛采用:

  第10行就为压缩搜索样本。第14实行有不重的继对,第27推行及下计算det的代码未与原文对应,不过像未影响结果,第36行计算能量,然后取能量最要命之哪位作为权值。

    
首先,为了发挥好,我们定义如下一些表达式:

                                                
  图片 31

     上述代码中PL值其实就计算水平跟直方向的梯度值,而更用ims
= imresize(ims, 0.5 ,’nearest’);这样的语为是为加快计算速度,对怎么用这么的算计方式,原始论文也未曾提及,编码的下像失去丢这个pl效果啊无啥区别。

       
图片 32

 
 其中,I(X)就是我们现已局部图像(待去雾的图像),J(x)是咱们要还原的无雾的图像,A是大地大气光成分,
t(x)为透射率。现在之就解条件虽是I(X),要求目标值J(x),显然,这是单有那么些解的方程,因此,就用有的先验了。

    
上述代码如果只要当类型受到动用,还得更换为另外的语种,转换应该不存困难的地方,基本就是有些矩阵或者说反复组的操作,唯一比较艰难的就算是randperm函数,他来一定限制外的未又的即兴数,这个得参照http://blog.csdn.net/devfun/article/details/6534476平等温情,抑或是复制下面的代码:

    
根据上述表达式,可以知道S(L-1)及W(L-1)对于同顺应图像来说是个常量,其中S(L-1)明显就是是诸如从的究竟个数。

  将式(1)稍作处理,变形也下式:

private static int[] RandPerm(int N)
{
    //http://blog.csdn.net/devfun/article/details/6534476
    int X;
    Random Rnd = new Random(Environment.TickCount);
    int[] TempArray = new int[N];
    int[] Value = new int[N];
    for (X = 0; X < N; X++) TempArray[X] = X;
    for (X = 0; X < N; X++)
    {
        int Seed = Rnd.Next(0, N - X);           //从剩下的随机数里生成     
         Value[X] = TempArray[Seed];                 //赋值给结果数组     
         TempArray[Seed] = TempArray[N - X - 1];   //把随机数产生过的位置替换为未被选中的值。     
    }
    return Value;
}

  我们的算法步骤如下:

                                                 
  图片 33

    
至于算法的尤为原理性的事物,只能看论文本身了咔嚓,实用吧天子,对于那些提供了参考代码的论文,基本了解原理的意,然后要就左右代码的改写了。

    
(1)、计算S(L-1)、W(L-1),设置初始阈值t=gmin,令S(t-1)=0、W(t-1)=0;

   
如上所述,上标C表示R/G/B三单通道的意思。

    
至于速度,在自身I3的记录簿CPU上,参考上述M代码,用C#修的次,对于1024*768底图样耗时约为40ms(未优化代码,优化应该力所能及达到20ms)。

      (2)、 计算下面算式:

   
首先假而于各级一个窗口外透射率t(x)为常数,定义他吗图片 34,并且A值已经给定,然后对式(7)两边求少破顶小价运算,得到下式:

    
而算法效果,我们可由此以下十几抱图像的比得出结论。

               
图片 35

                               
  图片 36

    
下面水平4顺应图自错误到右依次为原图、PS的多姿多彩转灰度命令、PS的去色命令以舆论3的结果。

      稍微有硌数学基础的食指犹应力所能及看懂上述算式的演绎原理。

   
上式中,J是待求的无雾的图像,根据前述的暗原色先验理论有:

 图片 37 图片 38 图片 39 图片 40

       
根据式(2)和式(3),可以解背景与前景的区域的平分灰度值为:

                                               图片 41

 图片 42 图片 43 图片 44 图片 45

         
图片 46

     因此,可推导出:

 图片 47 图片 48 图片 49 图片 50

   上式中int表示取整操作。

                                                     
   图片 51

 图片 52 图片 53 图片 54 图片 55

      
(3)根据式(4)及式(11)计算图像的混淆度;

    把式(10)带入式(8)中,得到:

 图片 56 图片 57 图片 58 
图片 59

       (4)令t=t+1,然后重新履行步骤2,直到t=gmax-1;

                                                 图片 60

 图片 61 图片 62 图片 63 图片 64

       
(5)找到任何经过中之极度小模糊度值对应的阈值t,并当超级的分阈值。

    这便是透射率图片 65的预估值。

 图片 66 图片 67 图片 68 图片 69

    
为了多少加快点速度,上述式4遭之计好当步骤1吃之所以同翻看找表实现。

   
在现实生活中,即使是晴天白云,空气被也有着部分粒,因此,看天的体或能够发到雾的熏陶,另外,雾的留存于人类感到景深的存在,因此,有必要当去雾的上保留得水准之雾,这好透过在式(11)中引入一个每当[0,1]
之间的因数,则式(11)修正为:

 图片 70 图片 71 图片 72 图片 73

    四、参考代码:

                                          
    图片 74

 图片 75 图片 76 图片 77 图片 78

public static int GetHuangFuzzyThreshold(int[] HistGram)
{
    int X, Y;
    int First, Last;
    int Threshold = -1;
    double BestEntropy = Double.MaxValue, Entropy;
    //   找到第一个和最后一个非0的色阶值
    for (First = 0; First < HistGram.Length && HistGram[First] == 0; First++) ;
    for (Last = HistGram.Length - 1; Last > First && HistGram[Last] == 0; Last--) ;
    if (First == Last) return First;                // 图像中只有一个颜色
    if (First + 1 == Last) return First;            // 图像中只有二个颜色

    // 计算累计直方图以及对应的带权重的累计直方图
    int[] S = new int[Last + 1];
    int[] W = new int[Last + 1];            // 对于特大图,此数组的保存数据可能会超出int的表示范围,可以考虑用long类型来代替
    S[0] = HistGram[0];
    for (Y = First > 1 ? First : 1; Y <= Last; Y++)
    {
        S[Y] = S[Y - 1] + HistGram[Y];
        W[Y] = W[Y - 1] + Y * HistGram[Y];
    }

    // 建立公式(4)及(6)所用的查找表
    double[] Smu = new double[Last + 1 - First];
    for (Y = 1; Y < Smu.Length; Y++)
    {
        double mu = 1 / (1 + (double)Y / (Last - First));               // 公式(4)
        Smu[Y] = -mu * Math.Log(mu) - (1 - mu) * Math.Log(1 - mu);      // 公式(6)
    }

    // 迭代计算最佳阈值
    for (Y = First; Y <= Last; Y++)
    {
        Entropy = 0;
        int mu = (int)Math.Round((double)W[Y] / S[Y]);             // 公式17
        for (X = First; X <= Y; X++)
            Entropy += Smu[Math.Abs(X - mu)] * HistGram[X];
        mu = (int)Math.Round((double)(W[Last] - W[Y]) / (S[Last] - S[Y]));  // 公式18
        for (X = Y + 1; X <= Last; X++)
            Entropy += Smu[Math.Abs(X - mu)] * HistGram[X];       // 公式8
        if (BestEntropy > Entropy)
        {
            BestEntropy = Entropy;      // 取最小熵处为最佳阈值
            Threshold = Y;
        }
    }
    return Threshold;
}

     本文中存有的测试结果负让: 
ω=0.95。

 图片 79 图片 80 图片 81 图片 82

   代码其实还是怪简单的。

    
上述推论中还是如全球达到气光A值时曾清楚之,在实际上被,我们可以依赖暗通道图来起产生雾图像被取该值。具体步骤如下:

 图片 83 图片 84 图片 85
图片 86

   五、效果:

      1)
从暗通道图备受按照亮度的深浅取前0.1%的像素。

         

 针对部分图像,我们举行了如下测试:

          2)
在这些职务被,在老有雾图像I中寻找对应的有高亮度的接触之价,作为A值。

 
图片 87                 
图片 88              
图片 89          
 图片 90

 
图片 91 
图片 92

    
到及时无异步,我们不怕可进行管雾图像的复原了。由式(1)可知:  J = ( I –
A)/t + A  

        原图
                
PS的多姿多彩转灰度                 
PS的去色命令                论文3的结果

            原图                                二值图,阈值=175

     现在I,A,t都已经求得了,因此,完全好开展J的精打细算。

  由以上举的一些事例,可以一目了然的视论文中的效能使十分多,有些图PS转换为灰度后掉了极端多的消息了即转换得毫无意义了。

  
上图使用OSTU等藏算法都没法儿取上图的不错效果。

     当投射图t
的价值好小时,会招J的价偏老,从而使淂图像整体为白场过度,因此一般可安装同样阈值T0,当t值小于T0时,令t=T0,本文中保有机能图俱以T0=0.1为标准计算。

    在处理器识别领域,有很多算法需要以彩色先易为灰度,我思念是时刻上述论文被的这种转移职能就坏有意义了。

   图片 93  
 图片 94

     因此,最终之复原公式如下:

   
提供一个C#的测试程序:http://files.cnblogs.com/Imageshop/Decolorization.rar

               原图                                  
二值图,阈值=67

                              
 图片 95

    关于去色,仔细找找,其实还有很多旁的较成与美妙之算法,因此,不要轻视一些基础的算法,只要您精心研究,总会时有发生新意识。

   
上图与另外部分二值算法的效能啊是甚类似之。

    
当直接用上述辩解进行回复时,去雾的力量其实呢是老显著的,比如下面有例子:

 图片 96

 

   图片 97    图片 98

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

 

   图片 99  
 图片 100

 

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

                
有雾图                                           
 去雾图

      注意到第一帧图的原图两单字的方圆明显发生同样块不协调的地方,而第二贪图顶部水平方向似乎来一样块没有展开去雾处理,这些还是由于我们的透射率图过于粗糙了。

     
要拿走更加精致的透射率图,何博士当篇章中提出了了soft
matting方法,能获好细致之结果。但是他的一个致命的缺点就是是快特慢,不以让实际利用。在2011年,何博士而除了同切片论文,其中涉嫌了导向滤波的不二法门来博比较好之透射率图。该方法的根本过程集中为简单的方框模糊,而方框模糊有多重新和半径无关之飞跃算法。因此,算法的实用性就高,关于这导向滤波算法大家以乌博士的网站可以友善失去研习下,除了当去雾方面他,还拥有另外多点的应用,这有本文不多述。

     使用了导向滤波后底去雾效果:

  图片 101   图片 102

  图片 103   图片 104 

         
  使用初之预估透射率图                               
 使用导向滤波后底透射率图

  图片 105    图片 106

               (a)
原图                               
  (b)  去雾结果图

  图片 107    图片 108

                (c)   
暗通道图                          (d) 导向图
(原始图像的灰度图)

  图片 109  
 图片 110

                (e) 
 预估透射率图                       (f)   使用导向滤波后的透射率图

  二、各参数对失去雾结果的熏陶

  第一:窗口的深浅。这个针对结果来说是个重大之参数,窗口更加老,其富含暗通道的票房价值越怪,暗通道为就算更非法。我们无错过于理论角度解析,从履行的效益来拘禁,似乎窗口更加充分,去雾的法力更不鲜明,如下图所示:

   图片 111   
 图片 112

                              (a)
原始图像                            (b)
窗口大小=11

   图片 113   图片 114

              (c)
窗口大小=21                         (d)
窗口大小=101 

  我之建议是窗口大小在11-51里边,即半径在5-25里边。

    
式(12)中之ω具有着明确的意义,其价值更聊,去雾效果更是不明白,举例如下:

   图片 115   图片 116

                                    (a)
原始图像                                  
(b)    ω=0.5         

   图片 117   图片 118    

                                       (c)   
ω=0.8                                                                  
    (d)    ω=1 

    三:编码的步骤

  如果您仔细的剖析了初稿的细路,加上适量的参考,编码其实并无是很艰苦。

  1)根据旧图像求暗通道,参考代码如下:

    for (Y = 0, DarkPt = DarkChannel; Y < Height; Y++)
    {
        ImgPt = Scan0 + Y * Stride;
        for (X = 0; X < Width; X++)
        {
            Min = *ImgPt;
            if (Min > *(ImgPt + 1)) Min = *(ImgPt + 1);
            if (Min > *(ImgPt + 2)) Min = *(ImgPt + 2);
            *DarkPt = Min;
            ImgPt += 3;
            DarkPt++;
        }
    }

    MinFilter(DarkChannel, Width, Height, Radius);

    这里要注意的凡MinFilter算法的快实现,提供平等篇论文供有需要的冤家学习:STREAMING
MAXIMUM-MINIMUM FILTER USING NO MORE THAN THREE COMPARISONS PER
ELEMENT 。这个算法的时空复杂度是O(1)的。

     
2)按文中所讲述的算法自动获取世界大气光的值。

     这里说明某些,原始论文中的A最终是取原始像素中之某一个碰之像素,我其实是得的符合条件的所有点的平均值作为A的价值,我这么做是坐,如果是沾一个触及,则各通道的A值老有或整个不胜类似255,这样的话会招处理后底图像偏色和产出大量色斑。原文作者说这个算法对天空部分非需特备处理,我实在发现该算法对发出天之图像的职能一般都未好。天空会并发鲜明的连通区域。作为化解方案,我多了一个参数,最充分环球大气光值,当计算的值超过该值时,则就是取得该值。  

    图片 119   图片 120  
 图片 121

                       
原图                                                        
未对A值做限定                  最要命A值限定为220

       3)
按式(12)计算预估的透射率图。

  在式(12)中,每个通道的数据都亟需除以对应之A值,即由一化,这样做,还设有一个问题,由于A的取舍过程,并无能够担保每个像素分量值除以A值后都低于1,从而导致t的值可能小于0,而立是未可能的,原文作者并从未招这或多或少是什么样处理的。我在其实的编码中发觉,如果确实如此做了,其效果也并无是雅理想 ,因此,我最终之道是在式(12)中,不考虑A的乘除。

        4)计算导向滤波图。

  
这里可以直接用原始的图像做导向图,当然也得为此其灰度图,但是之所以RGB导向图于产一致步之计量中见面占有比较老的日子。

        5)按照《Guided Image
Filtering》论文被的公式(5)、(6)、(8)编码计算获得迷你的透射率图。

    网络上有是算法的
matlab代码可下载的,这里贴有代码:

  function q = guidedfilter(I, p, r, eps)
  %   GUIDEDFILTER   O(1) time implementation of guided filter.
  %
  %   - guidance image: I (should be a gray-scale/single channel image)
  %   - filtering input image: p (should be a gray-scale/single channel image)
  %   - local window radius: r
  %   - regularization parameter: eps

  [hei, wid] = size(I);
  N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.

  % imwrite(uint8(N), 'N.jpg');
  % figure,imshow(N,[]),title('N');
  

  mean_I = boxfilter(I, r) ./ N;
  mean_p = boxfilter(p, r) ./ N;
  mean_Ip = boxfilter(I.*p, r) ./ N;
  cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch.

  mean_II = boxfilter(I.*I, r) ./ N;
  var_I = mean_II - mean_I .* mean_I;

  a = cov_Ip ./ (var_I + eps); % Eqn. (5) in the paper;
  b = mean_p - a .* mean_I; % Eqn. (6) in the paper;

  mean_a = boxfilter(a, r) ./ N;
  mean_b = boxfilter(b, r) ./ N;

  q = mean_a .* I + mean_b; % Eqn. (8) in the paper;
  end

      
由方的代码,可见,主要的工作量在均值模糊上,而均值模糊是单非常迅速的算法,关于均值模糊的优化可参考我原先的篇章:彩色图像高速模糊的懒惰算法。

      还有某些哪怕是,上述计算需要在[0,1]限定外开展,也就是说导向图和预估的透射率图都要于[0,255]先映射到[0,1]每当拓展测算。

     
关于guidedfilter中的半径r值,因为于头里进行极端小值后迷迷糊糊通道的图像成为一块一样块的,为了要透射率图更加精致,建议这r的取值不小于进行极端小值滤波的半径的4加倍,如下图所示:

    图片 122  
  图片 123

          (a) 
r=最小值滤波半径的2加倍
                       (b) r=最小值滤波半径的8倍增

      可以看到,当r比较粗的上,在透射率图被基本看不到什么细节信息,因此恢复处之图像边缘处不明明。

     
参数eps的取值也富有侧重,他第一是为防范计算着除以0的谬误和为使一些计算结果未必过大,一般建议取值0.001要么重新小。

     
如果采取的彩色RGB图做导向图,计算时间上会见增多很多,所之至之透射率图的边缘会比灰度图所处理的保留了还多的底细,效果及粗微比灰度图好,如下所示:

     图片 124  
 图片 125

              (a)
原图                                                                               
    (b)预估的透射率图

  
  图片 126    图片 127

                      
(c)使用灰度图为导向图取的透射率图                      
    (d)使用RGB图为导向图取的透射率图

     图片 128    图片 129

           (e)灰度图也导向图对应的去雾效果    
                       
  (f)RGB图导向图对应之去雾效果

       以RGB图也导向图的盘算着,涉及到3*3局部矩阵求逆的长河,如果用非matlab语言写,可以先乘matlab的符号计算功能,以及中间的符号计算命令simple,把计算结果算出来,然后再次重复其他高档语言中落实。

       (6)
按式(22)进行任雾图像的复原。

 四、其他部分失去雾效果图

  图片 130  图片 131  图片 132

   图片 133  
 图片 134   图片 135

 
 图片 136    图片 137   图片 138

   图片 139  
 图片 140   图片 141

                             
原图                                                
去雾效果图                                                     
透射率图

      上图备受最终一契合图自接连开了区区糟错过雾的处理。 

      在原文中,有诸如此类平等段话:

  Since the scene radiance is usually not
as bright as the atmospheric light, the image after haze removal looks
dim. So we increase the exposure of J(x) for
display.

     意思就是说直接去雾后的图像会于原来之暗,因此在拍卖完毕后需要开展自然的曝光增强,但笔者没有证实其是什么增强的,
因此,这里的觊觎及他论文的效力有所不同时正常的。一般以去雾处理后又用自动色剂之类的算法增强下会获得比较满意的结果,如下图:

     图片 142 
   图片 143  
 图片 144

         
原图                
去雾后              +自动色阶

     
去雾算法目前也有众多其它的道,不过自己所点的,很多都是因这吧底蕴,因此,先动手会这啊研究其他的去雾算法能奠定坚实的根基。

      网络直达有部分比好的暗原色先验去雾的matlab代码:比如同本文基本对应的matlab资源:http://files.cnblogs.com/Imageshop/cvpr09defog%28matlab%29.rar

  后记:稍微有看了几乎首去雾的篇章,基本上都是圈着收获透视率图做文章,比如有篇章讲用联合双边滤波方式赢得迷你的透射率,从自个人浅薄的认面临,我认为去雾已大多跳不发出暗原色这个局面了。

     
我对两端滤波算法那吧召开了实验,发现这的效力呢还行,就是快迟滞了诸多,双边滤波的快算法其实抢不起的,所以这个的实用性不愈,我选择了片图像做比较:

     图片 145    图片 146

                                   
(a) 原图                                                              
(b)   联合双边滤波去雾图

     图片 147    图片 148

                        (c)
导向滤波获得透射率图                                                  
(d)联合双边滤波透射率图(Sigmad=SigmaR=100)

       上图可以生明朗的看来联合双边滤波的透射率图无导向滤波的精细,但正如原来的粗疏的透射率图或吓过多,过渡很细腻,因此,也会获是的视觉去雾效果。

      
联合双边滤波器中的算法是参考了OpenCv中互相关函数写的。

     和凡一样,提供一个只是供应大家测试效果的顺序: 依据暗原色先验的图像去雾演示程序

    图片 149

   
我分别就此VB6和C#举行了个次,两只次都已经通过个别的语言艺术开展了优化,算法有编码是一模一样的,C#运作速度约是VB6的1.8倍增。

     在处理速度上,比
matalb的不久了无数倍增,在I3的笔记本电脑上,一契合1024*768底图像去雾时间大体在150ms内(以灰度图也导向图)。

 

 五、算法的局限性

 

     
暗原色先验是平等栽统计的结果,是本着大气露天无雾照片(outdoor haze-free
images)的统计结果,如果目标场景内在的就算跟大气光类似,比如雪地、白色背景墙、大海等,则由前提条件就非得法,因此一般无法获得满意的意义,而对此一般的景色照片是算法能处理的是。

    

 

    2013.8.23 后记补充修正:

     在连续对该算法的关心着,发现自己在前头做出了一个错误的判断,就是关于式(11)中/A的操作。我于眼前说此除法会引起一些问题,因此,去除了及时等同步。但是后来之实践证明正是有了当时无异于步,对于对比度低之图像才足以获得非常好之去雾高对比度图。

    前面说之/A操作可能会见导致t的值小于0,这种气象就可把t的值直接装也0来缓解。

   
还有一个事情就是式(11)严格的来说是只要指向老图像的每个通道进行归一化后,再取每个通道R/G/B值的极致小值得到中图,然后针对之当中图进行点名半径的顶小值滤波后,通过11式抱粗糙的透射率图,那么如此就是用差不多过多乘除,我在其实被发现要一直用前的暗通道图/A进行操作,两者的法力区别不显眼,因此,可用这种便当的方。

图片 150   图片 151

 上图是如出一辙合乎经典的测试图,虽然赢得了于好的职能,不过似乎马路那无异块的效能不如部分其他人公开的成果那么好。

图片 152   图片 153

     这为是一律可比较宽泛的测试图,该图也是紧用去雾获得结果,未举行其他的继甩卖,同CSDN一个之案例库:图像去雾的算法研究遭逢的法力比,在整幅图像的比与跟协调性及且如好一个品位。

    
再设下图,也比较CSDN那个案例库中之作用使好广大。

  图片 154   图片 155

     还有:

图片 156  图片 157

图片 158  图片 159

   

   总结:我本着这种去雾算法的效能还是非常满意的, 效果与速度都还比较恰当。

   附件的测试程序已经同更新。

   2013.10,10 后记补充:

    一直听说C的频率很高,于是用C实现了拖欠算法,并且编制了一个而供应其他语言调用的dll文件,然后针对最小值滤波算法又展开了非常之优化,算法速度发出矣酷死的加强,特别是在用VS2010时,编写C的代码可以勾选下图被的SSE选项和高效(fp:fast),程序会调用SSE一些函数,实现指令级别的互相。而这些C#的编译器是无能为力落实的。

图片 160

     同样的算法,相对于老之C#次第,程序的速会增长一倍左右,对于800*600底图像,在自的I3的CPU上平均能会达到20fps的速(只占了一个核对的CPU资源),因此可适用于不盖该限制外的实时图像处理。

    
同样我多了3独里面可调的参数供大家测试。

图片 161

     相应的DLL函数声明如下:

     c风格:

void HazeRemovalUseDarkChannelPrior(unsigned char * Src,unsigned char * Dest,int Width,int Height,int Stride, int Radius ,int GuideRadius, int MaxAtom, float Omega,float Epsilon,float T0 )

    c#调用:

 [DllImport("HazeRemoval.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true)]
  private static extern void HazeRemovalUseDarkChannelPrior(byte* Src, byte* Dest, int Width, int Height, int Stride, int Radius,int GuideRadius, int MaxAtom, float Omega, float Epsilon, float T0);

    VB6调用:

Private Declare Sub HazeRemovalUseDarkChannelPrior Lib "HazeRemoval.dll" (ByVal Src As Long, ByVal dest As Long, ByVal Width As Long, ByVal Height As Long, ByVal Stride As Long, ByVal Radius As Long, ByVal GuideRadius As Long, ByVal MaxAtom As Long, ByVal Omega As Single, ByVal Epsilon As Single, ByVal T0 As Single)

     

    
调用实例源代码下载:http://files.cnblogs.com/Imageshop/HazeRemovalTest.rar

 2013.11,22修正: 

  通过联合双边滤波求透射率图的意义上面的莫得法的,进最新的钻结果表明,双边滤波确实也克赢得迷你的投射图,比如依旧那方面的测试图像,不同之SigmaS和SigmaR下获得透射率效果如下:

   图片 162   
 图片 163

          SigmaS=50,SigmaR=30                          
SigmaS=100,SigmaR=30

 

 2014.1.12
重大创新(可实现实时效果):

   
 何的算法效果以及常见的实用性还较其他的去雾算法要好,而着重的题材虽是彼速度还是不敷快,有着极其多的浮点计算。鉴于此,作者也频碰着对代码进行好层次的优化,包括SSE处理、并行运行等,但鉴于算法本身的各个执行,无法全程并行,偶尔一个聊函数可以并行,但出于该本身执行就专门快,比如不要5ms,你失去用并行算法可能耗时还会见充分一部分。因此,一直尚未呀大之向上,对于同契合1024*768之彩图进行去雾需要90ms,这定无法满足需求。

   
 最近,在琢磨,既然暗通道去雾的透射率图于其它的算法都来之小巧,如果正好的减退一点点该精度,其夺雾的效能理论及相应无会见产生极好的别,于是我想到了一致栽艺术,即求取透射率的时刻不是对准原图进行求取,而是先对原图进行下采样,比如缩小为原图的1/4,计算产生小图的透射率,之后于经过插值的法子的落原图大概的透射率,则该也可以取得力量。经过实践,这种艺术大大的加强了推行进度,而且意义和旧的方案基本一致,对于1024*768底图像大约只有待(I3CPU)30ms了,如果越来越获取1/9的缩放,则仅仅待盖20ms,完全好满足工业实时性要求大的场所。

   
当然,如果您的缩小系数不是特意特别之言语,比如缩小为原本的0.5分寸,可能有数不行缩放所用的耗时尚抵了匡小图的透射率图所换来之扭亏,因此要合理合法选择这个下采样率。

   
要落实这样的快慢,当然要待特别高之优化技术的,这些事物还是有所保留比较好。 

   
我举行了一个顺序,集成了本博客中6栽图像去雾的算法: 图像去雾综合版

图片 164

因此暗通道的算法对同样段视频展开了处理,大家可以当这里看效果:http://video.sina.com.cn/v/b/124538950-1254492273.html



相关文章