最主要的算法思想都出自于此外一篇杂谈,al等人指出该算法那一天起

  研讨两岸滤波有很长一段时间了,目前看了一篇Real-提姆e
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算法也足以当作是双方滤波的一种增添。自从汤姆asi
et
al等人提议该算法那一天起,怎样急速的落实他,平素是人们谈论和研究的点子之一,在二〇一一年及二零一二年Kunal
N.
Chaudhury等人发布的连锁杂文中,提议了按照三角函数关系的值域核算法,能立见作用而又准确的落成急迅双边算法。本文主要对此杂文提议的不二法门加以演说。

     首先,先交给一个自己自己的定论:那篇作品无甚新意,首要的算法思想都来源于于其余一篇诗歌,Fast
Bilateral Filtering for the Display of High-Dynamic-Range
Images
,而且文中的片段实验结果自己认为存在较大的水分,不过,其中涉嫌的算法如故比较快的。

2.1.三头滤波器

       
首先介绍一下怎么着是二者滤波器,那里引用一些客人的下结论博客:二者滤波算法原理

       
不难地说,双边滤波器是一种高斯滤波器的恢弘。传统的高斯滤波器有一个高斯核,通过对空中相邻的像素点以高斯函数位权值取均值,达成对图像的坦荡。由于传统高斯滤波器只考虑了空荡荡的音信,即使它能达成对图像的管用平滑,但与此同时也搅乱了边缘音信。双边滤波器的原理即在传统高斯滤波器的底子上添加了一个特色亮度差距的高斯核,即既考虑了空中的新闻,由考虑了值域的新闻。在灰度差距不大的范围,表征亮度高斯核的权值较大、接近于1,因而双方滤波退化为传统的高斯滤波器,已毕对图像的平缓;在边缘部分,就算相邻像素点的空间接近,空间距离小,但鉴于边缘部分,灰度差异较大,因而在值域上相差较大,所以参加的新高斯核使得在该部分不举行平滑处理,保留图像的边缘。所以说,双边滤波是一种非线性(五个高斯核的乘积)的滤波方法,是组成图像的上空邻近度和像素值相似度的一种折中处理,同时考虑空域新闻和灰度相似性,达到保边去噪的目的。

    
双边滤波的边缘保持特色紧如若经过在卷积的历程中组成空域函数和值域核函数来促成的,典型的核函数为高斯分布函数,如下所示:

    
随想中对互相模糊的优化思路大概是这么的:

2.2.高速近似

图片 1

双方互联网接近例子

       
作者首先将两端滤波器的统计公式写成了齐次坐标的花样(关于齐次坐标的精晓,可以参考关于齐次坐标的知情(经典)):

图片 2

双方滤波齐次表示

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

图片 3

引入δ函数

        小编引入一些函数来表示上式中的一些操作:

图片 4

高斯核

图片 5

δ函数

        最后,将双方滤波器的公式改写为:

图片 6

相互滤波的线性格局

图片 7

校对后的两岸滤波进度

       
作者提议,由于采样定理,可以透过对图像下采样做卷积处理,再上采样恢复生机原式分辨率,达到疾速的目的。

图片 8

局部标号的辨证

           
图片 9                    
(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.上采样回高分辨率图像,对于未知的数据点,使用三线性差值。

图片 10

双方近似伪代码

    其中:

      
图片 11

3.两岸网格

       
有专家总计了两边滤波器的接近方法,使用一种3D数组的款式来表示那种在三维空间的两端滤波,提出了相互网格的论战(Real-time
edge-aware image processing with the bilateral
grid
)。

图片 12

两边网格的六头滤波器完结原理

       
有了眼前双边滤波近似的争执,再来通晓两者网格就突显容易得多了。考虑上图所示的1D输入图像。双边网格是在空间域和亮度域举行采样,划分成网格。双边的边也就是从那里来的,空间(space)和亮度(range)。离散后,每个点的坐标和亮度信息取整到相应的网格内。每个值域内的亮度值可由加权平均获得。通过在网格内开展滤波等拍卖,再由上采样方法插值出处理后的本来图像。

       
由此,营造一个两岸网格的不二法门是:首先,依据空域和值域,划分出网格结构,并初叶化所有网格的节点为0:

图片 13

开头化节点

       
对于高分辨率图像的坐标,分别除以空间采样间隔和亮度采样间隔并取整,再对应的节点处填入其原有的灰度值。考虑到取整函数会促成原图像的某一邻域内的像素点会下采样到同一个网格中,因而将灰度值写成齐次值(I(x,y),1)。并对在该网格内的保有齐次值叠加。那样,那个网格对应的终极灰度最可以写成这几个灰度值的平均值:(I(x1,y1)+…+I(xn,yn))/n。

图片 14

网格填充

       
那样,我们就将本来的图像数据转载为了一个3D的彼此网格。任何图像操作函数都足以功能在这一个双方网格上,即一定于将该双边网格左乘一个3D图像操作矩阵(例如,对于双方滤波器而言,这些函数是一个高斯卷积核,包括了空间的方差和亮度的方差),得到一个在低分辨率景况下拍卖的结果。最终经过上采样,并拓展插值,获得末了于高分辨率图像结果。上采样的规律是挑选一个参考图,对其擅自一个空间的像素举办空域和值域的采样,那里不开展取整操作,然后找到其在网格中的地点,由于尚未了取整,必要动用三线性插值的艺术,来完结未知范围的亮度值的计算,这些进度称作“slicing”。由插值上采样后,大家得到了最终的滤波结果。

           
图片 15              (2)

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

4.双面网格的上采样

        提议两岸网格的撰稿人接着又拓展了上下一心的双方网格,发布了Bilateral
Guided
Upsampling
,介绍了怎么着运用双边网格完成部分图像操作算子。算法的要旨绪想就是将一副高分辨率的图像通过下采样转换成一个三头网格,而在相互网格中,每个cell里提供一个图像变换算子,它的法则是在空间与值域相近的区域内,相似输入图像的亮度经算子变换后也相应是相似的,由此在每个cell里的操作算子可以用作是输入/输出的切近曲线,也即一个仿射模型,而对此分化的cell,作者通过给定输入和期待输出去操练那些两岸网格完成其仿射模型的全局分段平滑。再通过上采样,获得高分辨率的处理后的图像。

图片 16

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的舆论《法斯特 O(1) bilateral
filtering using trigonometric range kernels》中,笔者提议了用Raised
cosines函数来逼近高斯值域函数,并选拔一些特点把值域函数分解为一些列函数的增大,从而完毕函数的加速。上面我们任重(英文名:rèn zhòng)而道远描述下该进程。

      下边为其紧要性的兑现代码:

二、推导

 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

            
  图片 17                                                                      
(3)

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

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

图片 18  图片 19 
图片 20图片 21 
图片 22 
图片 23

           
图片 24               
(4)

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

       (2)
当N丰盛大时,有下式创制:

  上述的取样数是鲁人持竿第22行的m_nr_scale设置的,可知,视觉上就好像两者之间没有何样差异。

          
图片 25                (5)

     按照m_nr_scale的计量格局,若是SigmaR相比较小,m_nr_scale值也会相比大,对于部分工程采取,往往SigmaR就是要取相比较小的值才能维护住边缘。因而,大家品尝修改m_nr_scale的值,实际的测试申明,将m_nr_scale的值再该小一半,也能赢得很为杰出的效益,而速度确可以抓好一倍。

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

    
别的,上述代码还应对m_nr_scale的微乎其微值做个限制,m_nr_scale必须至少超过等于2的,否则不可以插值的。

           图片 26       (6)

     在速度上,使用这种形式丰硕一些任何的优化技术,SigmaR=30(SigmaS对速度没有影响)时,一副640*480的彩色图像,在I3的记录簿上耗时约为75ms(值域使用均值模糊)、125ms(值域使用高斯函数)。

      
同样,上边创设的条件也必须有:

    
随想中拉长的下采样技术拓展进度的升官,我的看法看状态采取。我自己也进展了编程,得出的下结论是:

          
图片 27

    
1、下采样的周到越小,结果和准确值偏差越大,并且此时因为下采样造成高斯滤波或者均值滤波的加速已经在整个耗时里占用的百分比不大了,此时重视的抵触是最终的双线性插值以及线性插值了,由此,总体时间上无强烈提高。由此,我指出采样倍数不要超过3,即采样图的深浅最小为原图的1/9。

       当γs的值在[-Pi/2,Pi/2]时,因而只要求图片 28
即可,此时须要
图片 29

    
2、为速度和效应综合考虑,可以拔取下采样周全为2,那是双线程插值其实是求八个相邻像素的平均值,由此得以有较大的优化空间。

         式6中,最左侧部分即为高斯函数,此时验证,可以用 Raised
cosines函数来就好像的模拟高斯函数,大家用一段matlab函数来表明该结果:

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

 

    
在Real-提姆e 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.

    
图片 30

     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 – 提姆e
是或不是值得说道呢?

  3、推导

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

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

     图片 31

    
     图片 32      (7)

 

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

 

   图片 33 (8)

 

其中:

 

            
图片 34

   

    
式(8)的第三行使用了面前基础理论中的第三条:分配率。注意式中的积分是对y积分,因而得以把f(x)相关部分提取到积分符号的外界。

 

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

 

       图片 35        
(9)

 

    
注意(8)和(9)两式中后的后半有的,比如图片 36 这几个,可以观看那一个实在就是对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)
去除噪音

   
图片 37  
图片 38

                        
 lena图扩大标准差为20的高斯噪音                                  
 使用σs=20、σr=40两端滤波后的结果

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

  
图片 39 
图片 40

            
带有噪音的淑女图1                                 使用σs=10、σr=35双边滤波后的结果   

 

图片 41 图片 42 图片 43

  
  带有噪音的名媛图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值打开是什么个范畴呢,使用标准的莉娜图做了个测试,在不一致的抽样半径下得到的结果如下表:

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相比时辰,大家着眼其遍布曲线,如下图:

  图片 44

      
              σ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左右,由此那个算法说实在的频率照旧格外。

     
那两篇文章分别是二〇一一年及二零一二年登载的,应该是意味着着脚下比较提升的技巧,我在网上时不时看看有人说双边滤波不过实时,实在是不知情这些高人用的是如何理论,抑或是怎样超级机器。

     
同我里面的一篇博文中双指数边缘平滑滤波器用于磨皮算法的尝尝 事关的Beeps边缘保留算法相比较,那里的快慢就要慢很多了,而互相的成效相比几乎差不多,所以其实很纠结。

      希望有更好的办法用于该算法。

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

  图片 45

 

 图片 46

 

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

 

相关文章