Filtering的论文。文章中提到到彼此网格(Bilateral双边滤波的边缘保持特色主要是由此当卷积的过程遭到结成空域函数和值域核函数来落实的。

  研究两岸滤波有大丰富一段时间了,最近羁押了千篇一律首Real-Time
O(1) Bilateral
Filtering的舆论,标题很吸引人口,就研读了同洋,经过几天的上学,基本都领略其考虑,现用立即无异于进程做同粗略的总结。

1.前言

        最近以羁押Deep Bilateral Learning for Real-Time Image
Enhancement,是同样篇用CNN实现实时图像增强的方法,能够当大哥大及快速实现HDR。文章被干到两岸网格(Bilateral
Grid)的思想,查阅了汪洋底文献,对双方网格的论战做了转私房的懂得。

 一、引言    

     论文逾10MB,无法达到传至博客园,可以以这链接下载:http://www.cs.cityu.edu.hk/~qiyang/publications/cvpr-09-qingxiong-yang.pdf。

2.两头滤波器的飞跃近似

       在对两岸网格做总结前,先介绍一下双方滤波器的高效近似方法(A
Fast Approximation of the Bilateral Filter using a Signal Processing
Approach),它是两岸网格的雏形,是一个将两者滤波器扩展至高维空间拓展线性卷积的计。而彼此网格的撰稿人以及时篇稿子的底子及,将高维空间数据映射成3D
array,进而提出了二者网格。

     双边滤波在图像处理领域中持有广大的应用,比如去叫、去马赛克、光流估计等等,最近,比较盛行的Non-Local算法也可以当做是两岸滤波的一致栽扩大。自从Tomasi
et
al等人口提出该算法那同样龙从,如何高效的落实他,一直是人人讨论与钻研之典型之一,在2011年跟2012年Kunal
N.
Chaudhury等人发表的连锁论文中,提出了冲三角函数关系之值域核算法,能管用而又准确之兑现长足双边算法。本文主要针对是论文提出的方式加以阐述。

     首先,先为来一个本身要好的定论:这首稿子无甚新意,主要的算法思想都自于另外一首论文,Fast
Bilateral Filtering for the Display of High-Dynamic-Range
Images,而且文中的局部实验结果我当存在比较充分的水分,但是,其中提到的算法还是于快之。

2.1.双面滤波器

       
首先介绍一下哟是两者滤波器,这里引用一些人家的总结博客:二者滤波算法原理。

       
简单地游说,双边滤波器是同样种植高斯滤波器的扩展。传统的高斯滤波器有一个高斯审结,通过对空间相邻之例如素点以高斯函数位权值取均值,实现对图像的平滑。由于传统高斯滤波器只考虑了空的音讯,尽管她会落实对图像的管事平滑,但与此同时也搅乱了边缘信息。双边滤波器的原理就是于风高斯滤波器的根底及添加了一个表征亮度差异的高斯对,即既考虑了空间的消息,由考虑了值域的信息。在灰度差别不死之范围,表征亮度高斯核的权值较充分、接近于1,因此双方滤波退化为风的高斯滤波器,实现对图像的平整;在边缘有,尽管相邻像素点的上空接近,空间距离有些,但鉴于边缘有,灰度差别较充分,因此在值域上距离比较充分,所以在的初高斯核使得在该有无履行平滑处理,保留图像的边缘。所以说,双边滤波是一律种非线性(两独高斯核的积)的滤波方法,是结合图像的空中邻近度和如素值相似度的平栽折中处理,同时考虑空域信息和灰度相似性,达到保边去叫的目的。

    
双边滤波的边缘保持特色主要是由此当卷积的过程遭到结合空域函数和值域核函数来兑现之,典型的核函数为高斯分布函数,如下所示:

    
论文被针对两端模糊的优化思路大致是如此的:

2.2.快捷近似

双方网络接近例子

       
作者首先用两边滤波器的计算公式写成了齐次坐标的款型(关于齐次坐标的懂得,可以参考关于齐次坐标的明白(经典)):

两头滤波齐次表示

       
接着,作者引入δ函数,将公式从二维空间扩展至三维空间(即一个2D底空间域和一个1D的值域/亮度域):

引入δ函数

        作者引入一些函数来代表上式中的一对操作:

高斯核

δ函数

        最终,将两边滤波器的公式改写为:

两边滤波的线性形式

改进后的彼此滤波过程

       
作者提出,由于采样定理,可以经对图像下采样做卷积处理,再上采样恢复原式分辨率,达到快速的目的。

一部分标明的求证

           
                    
(1)

    
对于两者模糊,离散化后的表达式大概如下所示:

2.4.伪代码

       
下图为彼此近似之伪代码。1.初始化所有的生采样齐次值,令所有下采样权值为0。2.找到全图的无限小亮度点(这等同步是为持续将显示度域的限量平移到从0开始)。3.于高分辨率图像的无论是一个诸如素点(X,Y)和亮度I(X,Y),(a)同样计算其齐次形式;(b)计算下采样后的坐标(这里运用了取整,因此,在原式高分辨率图像中之隔壁空间,会为射到低分辨率下之同一空间坐标,但于亮度域可能未在一如既往坐标上);(c)更新下采样空间的坐标值,即于低分辨率空间达到助长强分辨率的齐次值(之所以用齐次值,是盖齐次坐标相加后,取出原始数据就好了针对性相应数额的加权平均:(w1i1,w1)+(w2i2,w2)=(w1i1+w2i2,w1+w2),数据对应(w1i1+w2i2)/(w1+w2))。4.当采样域做高斯卷积,得到卷积后的齐次坐标。5.直达采样回高分辨率图像,对于未知的数据点,使用三线性差值。

两边近似伪代码

    其中:

      

3.双方网格

       
有专家总结了两者滤波器的类似方法,使用相同种3D反复组的款型来代表这种以三维空间的两头滤波,提出了双面网格的争鸣(Real-time
edge-aware image processing with the bilateral
grid)。

二者网格的两岸滤波器实现原理

       
有了面前双边滤波近似之驳斥,再来了解两者网格就显简单得几近了。考虑上图所展示之1D输入图像。双边网格是以空间域和亮度域进行采样,划分成网格。双边的尽头也就算是从此间来之,空间(space)和亮度(range)。离散后,每个点的坐标和亮度信息取整到对应之网格内。每个值域内之亮度值可由于加权平均获得。通过以网格内展开滤波等拍卖,再由臻采样方法插值出处理后的原本图像。

       
因此,构建一个两头网格的章程是:首先,根据空域和值域,划分有网格结构,并初始化所有网格的节点为0:

初始化节点

       
对于高分辨率图像的坐标,分别除以空间采样间隔和亮度采样间隔并取整,再对应的节点处填入其原本的灰度值。考虑到取整函数会促成本图像的某个同邻域内之比如素点会生采样到与一个网格中,因此用灰度值写成齐次值(I(x,y),1)。并对准以拖欠网格内的装有齐次值叠加。这样,这个网格对应的末尾灰度最足描绘成这些灰度值的平均值:(I(x1,y1)+…+I(xn,yn))/n。

网格填充

       
这样,我们就用原先的图像数据转发为一个3D底两端网格。任何图像操作函数还得以作用在是两岸网格上,即一定给以欠双边网格左乘一个3D图像操作矩阵(例如,对于彼此滤波器而言,这个函数是一个高斯卷积核,包含了半空中的方差和亮度的方差),得到一个当低分辨率情况下拍卖的结果。最后经达成采样,并进行插值,获得最终让高分辨率图像结果。上采样的规律是择一个参考图,对那个擅自一个上空的像素进行空域和值域的采样,这里不开展取整操作,然后找到该在网格中之职务,由于没了取整,需要采取三线性插值的措施,来贯彻未知范围的亮度值的盘算,这个进程叫“slicing”。由插值上采样后,我们获取了最后的滤波结果。

           
              (2)

    
f(s)是空核函数,f(r)是值域核函数,  难以直接优化上式的因由是 f(r)的留存。  

4.双面网格的达到采样

        提出双方网格的撰稿人就以进行了友好的双边网格,发表了Bilateral
Guided
Upsampling,介绍了争用双边网格实现有图像操作算子。算法的核心思想就是将一律抱高分辨率的图像通过下采样转换成一个双方网格,而当双方网格中,每个cell里提供一个图像变换算子,它的规律是当空间及值域相近之区域外,相似输入图像的亮度经算子变换后为当是一般的,因此在每个cell里之操作算子可以当作是输入/输出的好像曲线,也就一个仿射模型,而对此不同的cell,作者通过为得输入和想输出去训练是两岸网格实现该仿射模型的全局分段平滑。再经达成采样,获得高分辨率的处理后底图像。

Bilateral Guided Upsampling

    为归一化的用意。

    
论文被提出同样栽思路,如果上式中固定I(X)的价,则于各级一个不一之I(y)值,上式的成员就是相当给对fR(I(x),I(y))*I(y)展开空域核卷积运算,分母则是针对性fR(I(x),I(y))进行空域核卷积元算,而这种卷积运算有着飞跃的算法。
这样,我们以图像的值域范围外选定若干起代表性的I(X)值,分别展开卷积,然后对图像被之另的像素值,进行线性插值得到。

   
σs也空白高斯函数的业内不同,σr呢值域高斯函数的标准不同,Ω表示卷积的定义域。
可见,在图像的平区域,f(y)-f(x)的价变化挺有些,对应之值域权重接近被1,此时空域权重于关键作用,相当给直接指向之区域开展高斯歪曲,在边缘区域,f(y)-f(x)会起于充分的距离,此时值域系数会下跌,从而造成这里整个核函数的分布之下挫,而保持了边缘之底细信息。

    
算法的关键贡献也不怕在此地,而此想法是于Fast Bilateral Filtering for
the Display of High-Dynamic-Range
Images如出一辙软遭遇取的,并且于此文中还提到了开展subsampleing进行更进一步的优化,即这些抽样卷积可以于原图的小图中进行,然后最后的结果以原图中经过双线性插值获取。

    
直接的编码实现上述过程是一对一耗时的,其日复杂度为O(σs2) ,因此严重的克住了拖欠算法的拓宽和实在使用。不断产生家提出了化解的方,其中Porikli基于片要是对之过程进行了优化,比如我便贯彻了里面同样种植:空域函数为全值函数,值域为外其它函数,此时足据此直方图技术进行拍卖,可减掉计算量,但本身的履行表明该算法那速度还是慢,并且职能也不好。

     
关于直接采样然后插值的算法源代码可以参考:http://files.cnblogs.com/Imageshop/qx_constant_time_bilateral_filter.rar

     在2011的论文《Fast O(1) bilateral
filtering using trigonometric range kernels》中,作者提出了用Raised
cosines函数来逼高斯值域函数,并使部分风味将值域函数分解为局部列函数的增大,从而实现函数的加速。下面我们重点描述下该过程。

      下面为其要的兑现代码:

二、推导

 1 int qx_constant_time_bilateral_filter::bilateral_filter(unsigned char **image_filtered,unsigned char **image,double sigma_range,unsigned char **texture)
 2 {
 3     unsigned char image_min,image_max; 
 4     int y,x,jk_0,jk_1;
 5     if(sigma_range>QX_DEF_THRESHOLD_ZERO) 
 6     {
 7         m_sigma_range=sigma_range;
 8         color_weighted_table_update(m_table,m_sigma_range*QX_DEF_CTBF_INTENSITY_RANGE,QX_DEF_CTBF_INTENSITY_RANGE);
 9     }
10     qx_timer timer;
11     timer.start();
12     if(texture==NULL)
13     {
14         vec_min_val(image_min,image[0],m_h*m_w);
15         vec_max_val(image_max,image[0],m_h*m_w);
16     }
17     else
18     {
19         vec_min_val(image_min,texture[0],m_h*m_w);
20         vec_max_val(image_max,texture[0],m_h*m_w);
21     }
22     m_nr_scale=qx_max(1,int(double(image_max-image_min)/(255*m_sigma_range)+0.5));
23     //printf("[qx_max,qx_min]:[%5.5f,%5.5f]\n",(float)image_max,(float)image_min);
24     //printf("[sigma_range: %1.3f]\n",m_sigma_range);
25     //printf("[nr_scale: %d]\n",m_nr_scale);
26     m_grayscale[0]=(double)image_min;
27     m_grayscale[m_nr_scale-1]=(double)image_max;
28     double delta_scale=double(image_max-image_min)/(m_nr_scale-1);
29     for(int i=1;i<m_nr_scale-1;i++) m_grayscale[i]=(double)image_min+delta_scale*i;
30     for(int i=0;i<m_nr_scale;i++)
31     {
32         double **jk;
33         if(i==0)
34         {
35             jk_0=0;
36             jk_1=1;
37             jk=m_jk[jk_0];
38         }
39         else 
40             jk=m_jk[jk_1];
41         for(y=0;y<m_h;y++)
42         {
43             for(x=0;x<m_w;x++)
44             {
45                 int index;
46                 if(texture==NULL) index=int(abs(m_grayscale[i]-image[y][x])+0.5f);
47                 else index=int(abs(m_grayscale[i]-texture[y][x])+0.5f); /*cross/joint bilateral filtering*/
48                 jk[y][x]=m_table[index]*image[y][x];
49                 m_wk[y][x]=m_table[index];
50             }
51         }
52         if(m_spatial_filter==QX_DEF_CTBF_BOX_BILATERAL_FILTER)
53         {
54             boxcar_sliding_window(jk,jk,m_box,m_h,m_w,m_radius);
55             boxcar_sliding_window(m_wk,m_wk,m_box,m_h,m_w,m_radius);
56         }
57         else if(m_spatial_filter==QX_DEF_CTBF_GAUSSIAN_BILATERAL_FILTER)
58         {
59             gaussian_recursive(jk,m_box,m_sigma_spatial*qx_min(m_h,m_w),0,m_h,m_w);
60             gaussian_recursive(m_wk,m_box,m_sigma_spatial*qx_min(m_h,m_w),0,m_h,m_w);
61         }
62         for(y=0;y<m_h;y++)
63         {
64             for(x=0;x<m_w;x++)
65             {
66                 jk[y][x]/=m_wk[y][x];
67             }
68         }
69         //image_display(jk,m_h,m_w);
70         if(i>0)
71         {
72             for(y=0;y<m_h;y++)
73             {
74                 for(x=0;x<m_w;x++)
75                 {
76                     double kf;
77                     if(texture==NULL) kf=double(image[y][x]-image_min)/delta_scale;
78                     else kf=double(texture[y][x]-image_min)/delta_scale; /*cross/joint bilateral filtering*/
79                     int k=int(kf); 
80                     if(k==(i-1))
81                     {
82                         double alpha=(k+1)-kf;
83                         image_filtered[y][x]=(unsigned char)qx_min(qx_max(alpha*m_jk[jk_0][y][x]+(1.f-alpha)*m_jk[jk_1][y][x],0.f)+0.5f,255.f);
84                     }
85                     else if(k==i&&i==(m_nr_scale-1)) image_filtered[y][x]=(unsigned char)(m_jk[jk_1][y][x]+0.5f);
86                 }
87             }
88             jk_1=jk_0;
89             jk_0=(jk_0+1)%2;
90         }
91     }
92     //timer.time_display("bilateral filter");
93     return(0);
94 }

     1、一些基础理论和常识。

   我这里对里面的代码进行简易的描述:

    (1)
Cos函数在[-Pi/2,Pi/2]里吧非负、对如、在半周期内单调递增以及且有峰值的函数;

     
1、第13、14履是取图像的动态范围,即具有无比特别亮度和极小亮度的像素值。

    (2) 欧拉公式:
 exp(ix)=cos(x)+isin(x);

      2、
第22行的m_nr_scale是计算以原图中的抽样数。26-29执吃之m_grayscale是为此来记录取样点的价的,比如要动态范围是[0,255],取样数,5,则m_grayscale的值分别吗0、64、128、192、255,
即对式(1)中之I(x)先固定啊当时5个价,计算式(1)的结果。

    (3) 分配律:
exp(a+b)=exp(a)*exp(b);

     
3、第32到第40实行直接的这些代码其实是为节省内存的,因为要取样点为5,那么就需要5*2倍增原图大小内存的空间来囤取样点的卷积值,但是一旦本身仍取样点的轻重顺序计算,那么每计算一个取样点后(第一只除外,这便是70履之论断),就好把本来图被夹于之取样点及这个取样点之前十分取样数量中的像素的结果值通过两者之间的线性插值获取。这种方案便可只有待2*2倍增原图大小的内存。但是这种方案虽关系到插值的逐一,32暨40即便是处理这样的经过的,实际的写法你得产生那么些种,上面的代码写的死去活来烂的。

    (4)
图像的动态范围:[0,T],比如对于灰度图像即为[0,255];

     
4、52至61中的代码是圈空域你是为此什么类型的卷积函数,这里可以行使任意的旁的卷积函数,而有关的卷积函数也足以时不时任意的,这个得参见代码中的color_weighted_table_update函数内之代码。

     2、一些卓有成效之论据

      
5、第72至87执之代码就是针对性那个飞取样点的数开展插值的过程,注意有边缘之处理过程。

     (1) 对于式子:

   
用插值+SubSampleing的代码可以起此处下载:http://files.cnblogs.com/Imageshop/qx_constant_time_bilateral_filter%28%E5%A2%9E%E5%BC%BA%E7%89%88%29.rar

            
                                                                        
(3)

    试验结果(SigmaS=10,SigmaR=30,使用高斯卷积核函数):

        
其中s是自变量,取值范围[-T,T],令γ= Pi /
2T,则γs的值在[-Pi/2,Pi/2]内。此时,可以证实:

   
 
 

           
               
(4)

          原图                       
 上述算法的结果                     
标准的结果

       (2)
当N足够深时,有下式成立:

  上述的取样数是随第22履行之m_nr_scale设置的,可见,视觉上如两者之间没有呀差别。

          
                (5)

     按照m_nr_scale的计办法,如果SigmaR比较粗,m_nr_scale值也会比较特别,对于有工程采用,往往SigmaR就是要拿走比较粗的价才会维护已边缘。因此,我们品尝修改m_nr_scale的价,实际的测试表明,将m_nr_scale的价更欠小一半,也克得到非常呢优质之作用,而快确实可以增长一倍。

    如果让ρ=γσ,则上式就成:

    
另外,上述代码还许诺对m_nr_scale的太小值做只限,m_nr_scale必须至少超过等于2的,否则无法插值的。

                  (6)

     在速度高达,使用这种艺术丰富一些另的优化技术,SigmaR=30(SigmaS对快没有影响)时,一契合640*480之彩色图像,在I3的记录簿及耗时约为75ms(值域使用均值模糊)、125ms(值域使用高斯函数)。

      
同样,上面立的标准化为须有:

    
论文被增长的产采样技术拓展进度之晋级,我之视角看事态选择。我要好也拓展了编程,得出的下结论是:

          

    
1、下采样的系数越小,结果跟准确值偏差越充分,并且这坐生采样造成高斯滤波或者都值滤波的加快已在周耗时里占的百分比不特别了,此时首要的抵触是最终的双线性插值以及线性插值了,因此,总体时间上管强烈提升。因此,我建议采样倍数不要跨越3,即采样图的轻重缓急最小也原图的1/9。

       当γs的值在[-Pi/2,Pi/2]经常,因此就待
即可,此时要求

    
2、为快跟意义综合考虑,可以动用下采样系数也2,这是双线程插值其实是呼吁四只相互邻像素的平均值,因此好起于生之优化空间。

         式6中,最右边有就为高斯函数,此时征,可以用 Raised
cosines函数来类之学高斯函数,我们为此相同段落matlab函数来说明该结果:

     同样的640*480的图像,使用2*2生采样时大概为40ms(均值模糊)以及55ms(高斯模糊);

 

    
在Real-Time O(1) Bilateral Filtering一温柔遭遇起瞬间几乎段子话:

clc;
T=255;
Delta =80;
Gamma = pi/(2*T);
Rho= Gamma * Delta;
Color = ['b','g','r','c','m','y','k'];
x=-T:T;
y1=exp(-x.^2/(2*Delta*Delta));
plot(x,y1,'--b','LineWidth',2);
hold on;
for k=2:7
    y2= cos(Gamma .* x/ (Rho * sqrt(k))).^(k);
    plot(x,y2,Color(k));
end

     As
visible, our results are visually very similar to the exact even using
very small number of PBFICs. To achieve acceptable PSNR value ( dB) for
variance2
R ∈ , our method generally requires to PBFICs, and the running time is
about 3.7ms to 15ms for MB image.

    

     For a
typical 1MB image, Porikli’s method runs at about second. Our GPU
implementation runs at about frames per second using 8 PBFICs
(Computation complexity of Recursive Gaussian filtering is about twice
the box filtering)……

 

     我对这个速度表示沉痛怀疑,第一论文被商他的算法占用内存数是大概4加倍图像大小,那大多就是是利用地方代码类似之流程,这个流程发生只沉痛的名堂便是个别独取样点的算计必须依大小的逐一进行,那是互动就是只难题。另外,我们掌握,8个PBFICs的长河就是包括16单均值模糊或高斯模糊的经过(1MB轻重的图像,就是1024*1024大大小小的灰度图),就无此进程在3.5要么15ms能执行了的机器或许还非常少见吧。GPU有能耐?抑或是作者用的是超级计算机,不知晓诸位大神同意也?

     
从左图的曲线分布可见,N=2(绿色),N=3(红色)两修曲线一览无遗不合乎我们的定义域的若 求,分别出现了非单调递增和负值得场面。之后就N的穿梭叠加,曲线更接近高斯分布曲线(蓝色曲线)。 这自事实上的角度证明了公式6之科学。

    因此,论文的标题 Real – Time
是免是值得商榷呢?

  3、推导

   
相关工程参考:http://files.cnblogs.com/Imageshop/FastBilateralFilterTest.rar

     
将公式(4)带入公式(6)中,得到:

    

    
           (7)

 

      
将公式(7)带入原始的两头滤波的公式(1)中,有:

 

    (8)

 

其中:

 

            

   

    
式(8)的老三执以了前基础理论中的老三条:分配率。注意式中的积分是对y积分,因此可拿f(x)相关部分提取及积分符号的外侧。

 

     同样,对于η,可以推导得到:

 

               
(9)

 

    
注意(8)和(9)两式中后的晚半有,比如 这个,可以见到这个其实就是是指向cos(β)这幅图像进行高斯歪曲,而高斯模糊可以经FFT或者回溯算法快速O(1)实现,这样少庆典8/9两式就分别转换为对f(y)cos(β)、f(y)sin(β)、cos(β)以及sin(β)图像进行相同文山会海高斯模糊的过程了。

     至此,所有的演绎工作形成,那么我们当张罗一下算法的实行步骤吧:

    
(1):已掌握条件:输入图像f(x),动态范围[-T,T],空域和值域方差σs、σr

     (2):设定γ = Pi /
2T,ρ=γσr,N=1/(γσr*γσr) ;

      (3) 
: for
(0≤n≤N),获取f(y)cos(β)、f(y)sin(β)、cos(β)以及sin(β)所对应之图像数据(浮点类型);

     (4):利用O(1)高斯模糊算法对上述四个图像数据进行科班差为σs的高斯模糊并累计。

     (5):对丰富后的多少开展除法操作,获得最后的结果图像。     

   
注意:式8和式9中之乘法最后见面有虚部的数码出现,在拍卖时可以直接丢掉弃掉。

老三、实现与功效

    以上算法在论文Fast O(1) bilateral filtering
using trigonometric range
kernels着有所比较详细的阐发,论文被还吃闹了JAVA代码实现之链接,但是该链接已失效,需要JAVA代码做参考的但是自这边下载:BilateralFilter-src.rar,其中的BilateralFilter_.jar可于ImageJ中作为插件加载,而立即篇论文的相应代码在解压后的bilateralfilterinstant文件夹着。注意,这个ImageJ的插件写的如来题目,运行时点plugins–>BilateralFilters–>Bilateral
Filter Instant
后弹来底对话框中,不要勾选多线程才会针对输入的任性参数进行处理,否则图像无外反映。

    
在第三步和季步之处理,N+1糟巡回中经常没有其它关联之,因此,只要内存许可,各循环里可互相的尽,这对今底2核和4按的CPU的来自然之含义,不过相比GPU来说,可能含义又充分吧。

    
按上述过程编制代码,测试效果测试如下:

    (1)
去除噪音

   
  

                        
 lena图增加专业各异吧20底高斯噪音                                  
 使用σs=20、σr=40双面滤波后底结果

    
(2)普通图像的边缘保持结果

  
 

            
带有噪音的玉女图1                                 使用σs=10、σr=35两岸滤波后的结果   

 

  

  
  带有噪音的红粉图2                    使用σs=15、σr=25彼此滤波后底结果    
      
 使用σs=10、σr=35两端滤波后的结果   

     美女1
细腻之毛发在滤波后仍有着飘然的感觉,而面的点也已经悄然消失。美女2的脸也落了适宜的护理,而那个湛蓝的双料肉眼还是那么来精明。

季、效率分析和越优化

     不行显,上述算法的实行时间一直依赖让N的尺寸,而自从有关推导公式中扣,N的值直接取决于T和σr的大小,T越大,N越大,σr进一步老,N越小。当T固定时,比如为255经常,取不同的σr对应之N值如下表所示:

       σr

5

10

20

30

40

60

80

1000

N

1053

263

66

29

16

7

4

3

    上表中,可以发现,当σr仅次于20时,所急需之循环次数N极有增加,当N超过100时常,可以看这算法就不再持有优化的含义了,可能比老的算法还慢。这个自常理上吗老好讲。当σr正如小时,高斯函数的曲线在主导线附近急剧下降,从而需要还多之三角形函数来逼他。

    
因此,进一步的优化内需从T的取值以及N的方予以考虑。

    
我们观察到,在对值域高斯核函数进行计算时,使用的凡f(y)-f(x),而非是f(y),通常情况下,一符合图像的f(y)中所有值的极深价值可能吧255,但是有区域外的f(y)-f(x)在全图备受的值也不必然也255,如果这个价值仅次于255,那么以上述算法中使的T值就好缩小,从而减少N的高低,比如当σr否10时,T取255,由上表可知N=263,而如果T为210,则约只有待
263*(210/255)^2 = 178 次循环,几乎减少了100次等。

    
那么同样可图像的实际的T值打开是什么独规模呢,使用专业的Lena图做了个测试,在不同的抽样半径下获得的结果如下表:

r

1

3

5

10

15

20

30

T

153

205

208

210

211

215

215

   
这说明当多景下T值确实小于255,即使取样半径比较充分。

   
这里虽然涉及到一个抵问题。计算实际的T值一般情况下会博得低于255之结果,这有利于减小N,从而降低程序的施行时间,但是这匡的进程自己也急需时刻,如果这日子过其带的利益,则是改进就是落后。幸好,在很久以前,关于指定半径内的极其充分值算法就早已生矣O(1)的高速算法, 其推行时一般如果低于进行相同次等本例中这种循环的流年。所以是改进是值得的。

     那么自己以探访小 σr时大N的问题,当σr较时,我们着眼其分布曲线,如下图:

 

      
              σr = [1 3 5 10
15]每每之曲线

    
由上图可以看来小σr常,曲线在着力线附近迅速衰减,理论表明这个离呢[-3σr,3σr],在是之外的价值好忽略不计,因此,那些针对终极结果莫呀贡献的巡回就净好放弃,这一部分底答辩推导可以详见论文
Acceleration of the shiftable O(1) algorithm for bilateral filtering and
non-local
means 。

     
我们领略,Non-Local算法在特别可怜程度是双方模糊的壮大,只是其值域的一般度函数更加错综复杂,不是大概的f(y)-(f(x)那么粗略了,而是和f(y)和f(x)之天地有关,因此一直的Non-Local实现理论及比较两头滤波还要耗时,上面介绍的这种优化措施在后就首论文里干也是可以用于Non-Local的,有趣味之情侣可以好失去研究下。

五:小结和展望

     
可以看到,本文的这种优化措施实在是运Cos函数去逼近高斯函数,在代码层次上,需要(N+1)*4斯高斯歪曲,而由于方相关表格可以看出,N的数值一般还当10之上,因此,至少要实行44次高斯模糊,这尚免包获取需要高斯模糊的数码有以及最终的滤波结果取得。即使高斯模糊再迅速,比如对于600*400之斑块图,5ms足也,那么执行双边模糊保守估计为只要400ms左右,因此这个算法说其实的效率要很。

     
这半篇稿子分别是2011年与2012年刊之,应该是象征正在眼前于进步的艺,我于网上经常看有人说双边滤波可是实时,实在是不懂得那些高人用的凡啊理论,抑或是呀超级机器。

     
同我里面的一律首博文被夹指数边缘平滑滤波器用于磨皮算法的品尝 关系的Beeps边缘保留算法相比,这里的进度就假设缓慢好多矣,而两端的效能比差不多差不多,所以其实非常纠结。

      希望发生再次好的法门用于该算法。

     
我之所以C编写了一个标准DLL,其C#调用示例可见:
http://files.cnblogs.com/Imageshop/BilateralFilterTest.rar

 

 

 

 

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

 

相关文章