彼此滤波的边缘保持特色主要是透过当卷积的长河遭到成空域函数和值域核函数来兑现之。Filtering的舆论。经过平滑滤波后的出口 g(x

 一、引言    

  研究两岸滤波有异常丰富一段时间了,最近关押了平首Real-Time
O(1) Bilateral
Filtering的舆论,标题非常吸引人口,就研读了扳平外来,经过几上之读书,基本已了解其构思,现将这等同历程做相同简便的下结论。

OpenCV 之 图像平滑

1  图像平滑

  图像平滑,可用来对图像进行去噪 (noise reduction) 或 模糊化处理
(blurring),实际上图像平滑仍然属于图像空间滤波的一模一样种 (低通滤波)

  既然是滤波,则图像中任一点 (x, y),经过平滑滤波后的出口 g(x, y) 如下:

g(x,y)=∑s=−aa∑t=−bbw(s,t)f(x+s,y+t)g(x,y)=∑s=−aa∑t=−bbw(s,t)f(x+s,y+t)

  因 3X3 的滤波器为例 (即 a=b=1),则矩阵 Mx 和
Mf 对应的因素乘积之和,就是 g(x, y)

  其中,Mx=⎡⎣⎢w(−1,−1)w(0,−1)w(1,−1)w(−1,0)w(0,0)w(1,0)w(−1,1)w(1,1)w(1,1)⎤⎦⎥Mf=⎡⎣⎢f(x−1,y−1)f(x,y−1)f(x+1,y−1)f(x−1,y)f(x,y)f(x+1,y)f(x−1,y+1)f(x+1,y+1)f(x+1,y+1)⎤⎦⎥Mx=[w(−1,−1)w(−1,0)w(−1,1)w(0,−1)w(0,0)w(1,1)w(1,−1)w(1,0)w(1,1)]Mf=[f(x−1,y−1)f(x−1,y)f(x−1,y+1)f(x,y−1)f(x,y)f(x+1,y+1)f(x+1,y−1)f(x+1,y)f(x+1,y+1)]

2  OpenCV 函数

  OpenCV 中最主要有四单函数涉及到图像平滑,分别是盒式滤波 (box),高斯滤波
(Gaussian),中值滤波 (median),双边滤波 (bilateral)

2.1  盒式滤波

  输出图像的管一像素灰度值,等于其二有邻域像素灰度值的平均值

  模糊化核为,K=α⎡⎣⎢⎢⎢111111…………111111⎤⎦⎥⎥⎥K=α[11…1111…11…11…11] 
其中,α={1ksize.weidth∗ksize.height1when normalize = trueotherwiseα={1ksize.weidth∗ksize.heightwhen normalize
= true1otherwise

710官方网站 1

void cv::boxFilter (     
    InputArray   src, // 输入图像
    OutputArray  dst, // 输出图像
    int    ddepth,      // 输出图像深度,-1 表示等于 src.depth()
    Size   ksize,       // 模糊化核 (kernel) 的大小
    Point  anchor = Point(-1,-1),       // 锚点位置,缺省值表示 anchor 位于模糊核的正中心
    bool   normalize = true,            // 是否归一化处理
    int    borderType = BORDER_DEFAULT  // 边界模式
)

710官方网站 2

  取 ddepth = 1,normalize = true,尽管可以抱模糊化函数 (blur)

boxFilter( src, dst, -1, ksize, anchor, true, borderType );

  模糊化函数 (blur),本质上是一个输入和出口图像深度 (ddepth)
相同,并且做归一化处理的盒式滤波器

710官方网站 3

void cv::blur (    
    InputArray  src,  
    OutputArray dst,      
    Size ksize,      
    Point anchor = Point(-1,-1),    
    int borderType = BORDER_DEFAULT  
)  

710官方网站 4

2.2  中值滤波

  未遭值滤波最为简练,常用来打消椒盐噪声

  输出图像中 (x, y) 点处的例如素值,等于输入图像以 (x, y)
为中心点的邻域像素 (ksize x ksize) 平均值

void cv::medianBlur ( 
    InputArray   src,
    OutputArray  dst,
    int  ksize   // 滤波器孔径大小,一般为奇数且大于 1,比如 3, 5, 7, ...
)     

2.3  高斯滤波

 
高斯滤波最为可行,它是基于目前像素和邻域像素之间,空间距离的异,计算得出一个高斯核
(邻域像从的加权系数),

 
然后,高斯核从左至右、从上到下遍历输入图像,与输入图像的诸如素值求卷积和,得到输出图像的顺序像素值

  G0(x,y)=Ae−(x−μx)22σ2x+−(y−μy)22σ2yG0(x,y)=Ae−(x−μx)22σx2+−(y−μy)22σy2

  无须理会公式的复杂,只待牢记一点即可:邻域像从距离时如素越远
(saptial space),则该对应的加权系数越小

  为了好直观了解,可拘留下面这一维高斯核,推而广之将 G(x) 曲线以 x=0
这条轴为基本线,旋转360度可想象那个二维高斯核

    710官方网站 5

710官方网站 6

void cv::GaussianBlur ( 
    InputArray   src, 
    OutputArray  dst,
    Size    ksize,       // 高斯核的大小
    double  sigmaX,      // 高斯核在x方向的标准差
    double  sigmaY = 0,  // 高斯核在y方向的标准差,缺省为 0,表示 sigmaY = sigmaX
    int     borderType = BORDER_DEFAULT 
)  

710官方网站 7

  小心: 高斯核的轻重 Size(width, height),w 和
二者不必千篇一律只是得还是奇数,若都如为 0,则由 sigma 自动计算得出

2.4  双边滤波

 
上面三栽艺术还是亚通滤波,因此在拔除噪声的又,也常会用边缘信息模糊化。双边滤波和高斯滤波类似,但是它们用邻域像从的加权系数分为两片,

 
第一部分和高斯滤波的完全相同,第二有些则设想当下像素和邻域像素之间灰度值的出入,从而以去掉噪声的基本功及,也比好之保存了图像的边缘信息

710官方网站 8

void cv::bilateralFilter (
    InputArray    src,
    OutputArray   dst,
    int     d,    // 像素邻域直径,若为非正值,则从 sigmaSpace 自动计算得出
    double  sigmaColor,  // 颜色空间的标注方差
    double  sigmaSpace,  // 坐标空间的标准方差
    int     borderType = BORDER_DEFAULT 
)

710官方网站 9

   注意 1) 
双边滤波相比上述三种滤波方法,其处理速度很缓慢,因此,一般建议取 d=5
用于实时图像处理
,d=9 适合为非实时之图像领域

   注意 2)  sigmaColor 和 sigmaSpace 可取相同值,一般在 10 ~ 150
之间
,小于 10,则没什么效果,大于
150,则力量最明朗,看起肯定“卡通化”

 

3  代码示例

3.1 OpenCV

  OpenCV 中之以身作则,通过慢慢增大如从邻域的轻重 Size(w,
h),将上述滤波过程动态化,非常像之亮了邻域大小对滤波效果的熏陶

  代码摘抄:

710官方网站 10 View Code

3.2  滤波对比

  实际被,可径直调用以上四个滤波函数,代码如下:

710官方网站 11

 1 #include "opencv2/imgproc/imgproc.hpp"
 2 #include "opencv2/highgui/highgui.hpp"
 3 
 4 using namespace std;
 5 using namespace cv;
 6 
 7 int main()
 8 {
 9     Mat src = imread("E:/smooth/bird.jpg");
10     if(src.empty())    return -1;
11 
12     namedWindow("original", CV_WINDOW_AUTOSIZE);
13     namedWindow("blur", CV_WINDOW_AUTOSIZE);
14     namedWindow("GaussianBlur", CV_WINDOW_AUTOSIZE);
15     namedWindow("medianBlur", CV_WINDOW_AUTOSIZE);
16     namedWindow("bilateralFilter", CV_WINDOW_AUTOSIZE);
17 
18     imshow("original", src);
19 
20     Mat dst;
21 
22     blur(src, dst, Size(3,3));
23     imshow("blur", dst);
24     
25     medianBlur(src,dst,3);
26     imshow("medianBlur",dst);
27     
28     GaussianBlur(src,dst,Size(3,3),0);
29     imshow("GaussianBlur",dst);
30 
31     bilateralFilter(src,dst,9,50,50);
32     imshow("bilateralFilter",dst);
33 
34     waitKey(0);
35     return 0;
36 }

710官方网站 12

  四种滤波方法的效益图,如下所示:

  710官方网站 13

参考资料

 <Digital Image Processing_3rd> chapter 3

 <Learning OpenCV_2nd>

 <OpenCV Tutorials> imgproc module – Smoothing Images

 

 

 

 

     双边滤波在图像处理领域中保有广大的采取,比如失去叫、去马赛克、光流估计等等,最近,比较流行的Non-Local算法也得看成是二者滤波的一样栽扩大。自从Tomasi
et
al等人口提出该算法那无异龙从,如何高效的实现他,一直是众人讨论与钻研的纽带之一,在2011年和2012年Kunal
N.
Chaudhury等人口上之相干论文被,提出了因三角函数关系之值域核算法,能立竿见影设还要准确之兑现迅速双边算法。本文主要对斯论文提出的法加以阐述。

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

    
双边滤波的边缘保持特色主要是经过当卷积的经过遭到组成空域函数和值域核函数来促成之,典型的核函数为高斯分布函数,如下所示:

     首先,先为来一个自己要好的定论:这篇稿子无什么新意,主要的算法思想都源于于另外一首论文,Fast
Bilateral Filtering for the Display of High-Dynamic-Range
Images,而且文中的一部分实验结果自己觉得存在于生之水分,但是,其中涉嫌的算法还是于快的。

           
710官方网站 14                    
(1)

    
论文中针对彼此模糊的优化思路大致是这般的:

    其中:

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

           
710官方网站 15              (2)

      
710官方网站 16

    为归一化的企图。

    
f(s)是空手核函数,f(r)是值域核函数,  难以直接优化上式的原委是 f(r)的有。  

   
σs啊空高斯函数的专业不一,σr否值域高斯函数的正规不一,Ω表示卷积的定义域。
可见,在图像的平缓区域,f(y)-f(x)的价变化很粗,对应的值域权重接近被1,此时空域权重从重点作用,相当给直接针对这区域展开高斯歪曲,在边缘区域,f(y)-f(x)会产生比较生之反差,此时值域系数会跌,从而造成这里整个核函数的分布的下滑,而保持了边缘的细节信息。

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

    
直接的编码实现上述过程是相当耗时的,其日复杂度为O(σs2) ,因此严重的限量住了该算法的加大与实际运用。不断有大家提出了缓解之方法,其中Porikli基于有些如对这过程进行了优化,比如我哪怕落实了里面同样种:空域函数为都值函数,值域为另外其它函数,此时得据此直方图技术进行拍卖,可减掉计算量,但自己的执行表明该算法那速度还是缓,并且职能也不好。

    
算法的关键贡献呢就在此间,而之想法是从Fast Bilateral Filtering for
the Display of High-Dynamic-Range
Images一样中和被取得的,并且以此文中尚论及了拓展subsampleing进行更进一步的优化,即这些抽样卷积可以当原图的小图中开展,然后最后的结果在原图中通过双线性插值获取。

     在2011之舆论《Fast O(1) bilateral
filtering using trigonometric range kernels》中,作者提出了用Raised
cosines函数来逼高斯值域函数,并动用部分特征将值域函数分解为一些列函数的附加,从而实现函数的增速。下面我们主要描述下该过程。

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

二、推导

      下面为那个重要性的实现代码:

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

 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)
Cos函数在[-Pi/2,Pi/2]里吧非负、对如、在半周期内单调递增以及且有峰值的函数;

   我此针对中间的代码进行简要的描述:

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

     
1、第13、14执行是赢得图像的动态范围,即具备最老亮度和最小亮度的比如说素值。

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

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

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

     
3、第32到第40实行直接的这些代码其实是以节约内存的,因为要是取样点吧5,那么就算待5*2加倍原图大小内存的空中来存储取样点的卷积值,但是只要自己以取样点的大小顺序计算,那么每计算一个取样点后(第一个除外,这即是70履之判断),就得管原图中夹于之取样点和这个取样点之前十分取样数量里的像素的结果值通过两者之间的线性插值获取。这种方案就是可只待2*2加倍原图大小的内存。但是这种方案就干到插值的各个,32顶40虽是拍卖这样的经过的,实际的写法你可生多栽,上面的代码写的良烂的。

     2、一些管用的论证

     
4、52到61里的代码是圈空域你是为此什么类型的卷积函数,这里可以应用任意的外的卷积函数,而关于的卷积函数也得不时任意的,这个得参考代码中的color_weighted_table_update函数内之代码。

     (1) 对于式子:

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

            
  710官方网站 17                                                                      
(3)

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

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

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

           
710官方网站 18               
(4)

710官方网站 19  710官方网站 20 
710官方网站 21710官方网站 22 
710官方网站 23 
710官方网站 24

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

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

          
710官方网站 25                (5)

  上述的抽样数是遵照第22行的m_nr_scale设置的,可见,视觉上似两者之间没有什么异样。

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

     按照m_nr_scale的测算办法,如果SigmaR比较粗,m_nr_scale值也会见较充分,对于有些工采取,往往SigmaR就是要获得比较小之价才能够维护已边缘。因此,我们尝试修改m_nr_scale的价,实际的测试表明,将m_nr_scale的价更欠多少一半,也能够取得好呢理想的效用,而速度确实可以增进一倍增。

           710官方网站 26       (6)

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

      
同样,上面树的标准化为得产生:

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

          
710官方网站 27

    
论文被增强的下采样技术拓展速度的晋升,我之眼光看事态择。我要好也拓展了编程,得出的下结论是:

       当γs的值在[-Pi/2,Pi/2]时常,因此就待710官方网站 28
即可,此时要求
710官方网站 29

    
1、下采样的系数越小,结果和准确值偏差越怪,并且这因为生采样造成高斯滤波或者都值滤波的增速已在漫天耗时里占有的比例不死了,此时着重的矛盾是最后的双线性插值以及线性插值了,因此,总体时间及管强烈提升。因此,我建议采样倍数不要过3,即采样图的大大小小最小也原图的1/9。

         式6中,最右部分就是为高斯函数,此时证实,可以为此 Raised
cosines函数来仿佛之仿高斯函数,我们因而同一截matlab函数来证明该结果:

    
2、为快跟效能综合考虑,可以使下采样系数为2,这是双料线程插值其实是请求四单相互邻像素的平均值,因此好生较充分之优化空间。

 

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

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

    
在Real-Time O(1) Bilateral Filtering一和被生瞬间几乎段落话:

    
710官方网站 30

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

     
从左图的曲线分布可见,N=2(绿色),N=3(红色)两漫漫曲线一览无遗不切合我们的定义域的要 求,分别出现了非单调递增和负值得场面。之后就N的持续叠加,曲线更接近高斯分布曲线(蓝色曲线)。 这自实际上的角度说明了公式6底不错。

     我对是速度表示沉痛怀疑,第一论文被说道他的算法占用内存数是大概4倍增图像大小,那多就是是用地方代码类似之流程,这个流程发生只沉痛的名堂便是个别独取样点的计量必须按照大小的逐一进行,那是互动就是只难题。另外,我们懂得,8个PBFICs的历程就是包括16单均值模糊或高斯模糊的进程(1MB高低的图像,就是1024*1024分寸的灰度图),就随便此进程在3.5还是15ms能执行了的机器或许还大少见吧。GPU有能耐?抑或是作者运用的是超级计算机,不晓诸位大神同意为?

  3、推导

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

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

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

    
     710官方网站 31      (7)

     710官方网站 32

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

 

   710官方网站 33 (8)

 

其中:

 

            
710官方网站 34

 

    
式(8)的老三实施使用了前面基础理论中之老三漫漫:分配率。注意式中之积分是本着y积分,因此好管f(x)相关部分提取到积分符号的外围。

   

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

 

       710官方网站 35        
(9)

 

    
注意(8)和(9)两式中后的继半有的,比如710官方网站 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)
去除噪音

   
710官方网站 37  
710官方网站 38

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

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

  
710官方网站 39 
710官方网站 40

            
带有噪音的红粉图1                                 使用σs=10、σr=35两头滤波后底结果   

 

710官方网站 41 710官方网站 42 710官方网站 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值打开是什么独规模呢,使用专业的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正如小时,我们着眼那遍布曲线,如下图:

  710官方网站 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左右,因此这算法说其实的效率要十分。

     
这有限首文章分别是2011年跟2012年登载的,应该是象征在即较进步的技艺,我在网上经常看看有人说双边滤波可是实时,实在是休懂得那些高人用的凡什么理论,抑或是啊超级机器。

     
同自己里面的一样首博文中双指数边缘平滑滤波器用于磨皮算法的品尝 提到的Beeps边缘保留算法相比,这里的进度就使慢好多了,而两边的力量相比多差不多,所以其实很纠结。

      希望发生更好的章程用于该算法。

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

  710官方网站 45

 

 710官方网站 46

 

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

 

相关文章