双边过滤算法

     双边过滤算法作为一种改进的高斯过滤算法,在图像去噪,和均匀模糊(又称为磨皮),去锯齿效应上有不错的效果.双边过滤是采用Raised cosines函数来模拟高斯分布函数,

并实现逼近高斯值域.

      内容: 将两个相差较大的像素,通过过滤器变得接近.

    它的推到公式为:

其中f(x)是输入数据,h(x)是生成的数据,Kd则满足

其中Raised 函数定义为:

其中利用高斯定理c(b)

其实上面的光看这些公式以及英文文档,还是比较费劲的,然后去中文网站去看看相关的简化的公式,就好理解了

  1 /*对整张图片进行双边平滑处理就是去掉噪音,模糊图像*/
  2 
  3 /*
  4 *  buff        ->图片数据资源
  5 *  desbuff     ->处理之后的图片数据资源
  6 *  width       -> 图片宽度 
  7 *  height       -> 图片高度
  8 *  window_size -> 滑动窗口大小
  9 */
 10 
 11 double distance(double x1 ,double x2,double y1, double y2  ){
 12 
 13     return ((x1 -x2)*(x1 -x2) + (y1-y2)*(y1-y2));
 14 }
 15 
 16 
 17 void BiLateralFilter(wu_char* buff , wu_char* desbuff, 
 18     unsigned int width ,unsigned int height ,
 19     double cgmal , double sgmal ,int window_size 
 20     )
 21 {
 22 
 23     double * xydis = new double[window_size*window_size];   //各个像素点到中心像素点之间几何距离
 24     double * Rdis  = new double[window_size*window_size];   //RGB图像中R色素到中心R颜色的分量差
 25     double * Gdis  = new double[window_size*window_size];   //RGB图像中G色素到中心G颜色的分量差
 26     double * Bdis  = new double[window_size*window_size];   //RGB图像中B色素到中心B颜色的分量差
 27     int xpos, ypos ,i,j,k;
 28 
 29     double midxy =(window_size-1.0)/2;
 30 
 31     for(int i=0 ; i<window_size*window_size ; i++){
 32         
 33         xpos  = i/window_size;
 34         ypos  = i%window_size;
 35         xydis[i] = distance(xpos,midxy ,ypos ,midxy);
 36         xydis[i] = exp(-0.5*xydis[i]/cgmal/cgmal) ;  /*丁一个bug*/
 37     }
 38 
 39     double rvar,gvar,bvar;
 40     int nX,nY;
 41     for( i=1; i<2 ; i++){
 42         for( j=0;j<width ; j++){
 43             //RGB为基本单元,获取当前(x,y)坐标的(RGB单元)
 44             rvar = (int)buff[i][j*3];
 45             gvar = (int)buff[i][j*3+1];
 46             bvar = (int)buff[i][j*3+2];
 47 
 48             double  rdata =0,gdata=0,bdata=0;
 49             double  rtotal =0,gtotal=0,btotal=0; //平均均方根
 50 
 51             for(k=0; k<window_size*window_size  ; k++){
 52                 
 53                 ypos = k/window_size;
 54                 xpos = k%window_size;
 55               
 56                 nY= i - midxy+ypos;
 57                 nX= j - midxy+xpos;
 58                 
 59                 if((nY>=0)&&(nY<height)&&(nX>=0)&&(nX<width)){
 60                 
 61                 //防止越界
 62                  double rvar1 = (int)buff[nY][nX*3];
 63                   double gvar1 = (int)buff[nY][nX*3+1];
 64                  double bvar1 = (int)buff[nY][nX*3+2];
 65                 
 66                  //对颜色分量进行处理
 67                  Rdis[k] = fabs(rvar-rvar1);
 68                  Rdis[k] = exp(-0.5*Rdis[k]*Rdis[k]/sgmal/sgmal);
 69 
 70                  Gdis[k] = fabs(gvar-gvar1);
 71                  Gdis[k] = exp(-0.5*Gdis[k]*Gdis[k]/sgmal/sgmal);
 72 
 73                  Bdis[k] = fabs(bvar-bvar1);
 74                  Bdis[k] = exp(-0.5*Bdis[k]*Bdis[k]/sgmal/sgmal);
 75                 
 76                  if(k!=4){
 77                      rdata +=  rvar1*Rdis[k]*xydis[k]; //c、s参数综合
 78                      rtotal += Rdis[k]*xydis[k]; //加权系数求和,并进行归一化
 79                     
 80                      gdata +=  gvar1*Gdis[k]*xydis[k]; //c、s参数综合
 81                      gtotal += Gdis[k]*xydis[k]; //加权系数求和,并进行归一化
 82                      
 83                      bdata +=  bvar1*Bdis[k]*xydis[k]; //c、s参数综合
 84                      btotal += Bdis[k]*xydis[k]; //加权系数求和,并进行归一化
 85                  }
 86                 }
 87             }
 88                rdata/=rtotal;
 89                gdata/=gtotal;
 90                bdata/=btotal;
 91                desbuff[i][j*3]=dealOver((int)(rdata));
 92                desbuff[i][j*3+1]=dealOver((int)(gdata));
 93                desbuff[i][j*3+2]=dealOver((int)(bdata));
 94         }
 95     }
 96 
 97     delete [] xydis ;
 98     delete [] Rdis  ; 
 99     delete [] Gdis  ;
100     delete [] Bdis  ;
101 }
102 
103 
104 /*此处因为不是压缩图片,不需要进行DCT离散余弦卷积化,
105     单纯的对16个数据(4*4)数据进行中和之后超过255进行处理*/
106 
107 unsigned int dealOver(long color){
108 
109     if(color<0)return 0;            /*黑色*/
110     if(color>255) return 255;        /*无色*/
111     /*0-255属于合理范围*/
112     return color;
113 }

效果图:

参考文献【注】

http://blog.csdn.net/bugrunner/article/details/7170471

http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html#[1]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

一个模型搞定所有风格转换,直接在浏览器实现(demo+代码)

用一个模型就能实现所有类型的风格转换!一个名为Arbitrary Image Stylization in the Browser的项目最近火起来。

15820
来自专栏WD学习记录

K-means中K值的选取

以下博文转自:https://blog.csdn.net/qq_15738501/article/details/79036255  感谢

47520
来自专栏计算机视觉战队

AI都可以将文字轻松转成图像

夜晚是如此的安静,但是依然有很多挑灯夜战的你、他、她......无论在哪座城市,都会有忙碌的人在灯光下依然勤奋努力的工作,希望分享的这首小曲可以缓解夜间工作的疲...

14620
来自专栏和蔼的张星的图像处理专栏

暗通道去雾算法原理及实现

基本原理来源于何凯明大神的CVPR09的论文Single Image Haze Removal Using Dark Channel Prior

1.1K30
来自专栏大数据文摘

小白学数据神经网络第二弹:Google可视化体验平台Tensorflow Playground

21340
来自专栏新智元

一个模型搞定所有风格转换,直接在浏览器实现(demo+代码)

用一个模型就能实现所有类型的风格转换!一个名为Arbitrary Image Stylization in the Browser的项目最近火起来。

15520
来自专栏机器之心

业界 | 深度学习与XGBoost在小数据集上的测评,你怎么看?(附源码)

选自Github 作者:Max Brggen 机器之心编译 参与:蒋思源 近来,部分机器学习从业者对深度学习不能训练小数据集这一观点表示怀疑,他们普遍认为如果深...

37570
来自专栏机器之心

打开黑箱重要一步,MIT提出TbD-net,弥合视觉推理模型的性能与可解释性鸿沟

选自arXiv 作者:David Mascharka等 机器之心编译 参与:路雪、黄小天 近日,MIT 林肯实验室和 Planck Aerosystems 联合...

29080
来自专栏wym

OpenCV-3计算机视觉(Canny边缘检测)

函数原型:edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2g...

14440
来自专栏我是攻城师

计算机图形处理的一些知识

353110

扫码关注云+社区

领取腾讯云代金券