from:http://www.mamicode.com/info-detail-449413.html

开篇废话

废话开始,话说昨天写博客写完了,发表以后居然刷出来的是空白,顿时很生气,因为写了一上午的东西瞬间就没了,于是在微博上吐槽了csdn,于是csdn的官方微博和客服微博都跟我进行了沟通和道歉,感觉态度还是不错的,作为用户没有付给他们钱,但还是受到了不小的重视,感觉还是不错。学习是一个被分享之后经过自己加工后再分享的过程,一个分享的平台是很重要的选择,好的平台能够学到知识,并能分享知识,和别人讨论知识,收集资源分享资源。希望大家共同进步。

图像增强,平滑第二天,虽然说是第二天,但要学习和研究包括写程序,都不是一天完成的。上一篇写的是线性滤波模板,此类模板我们可以叫他们静态模板,因为其只依赖于我们的选择,我们一旦选择完成,模板就唯一确定,不会在卷积的过程中产生变换,所以这类模板具有线性性质,但缺点是不灵活,不能根据不同灰度变化情况来实时的调整权重,双边滤波就是一种非线性模板,能够根据像素位置和灰度差值的不同产生不同的模板,得到不同的滤波结果。

基本思路

      双边滤波器是针对高斯平滑的提升版本,高斯平滑根据像素邻域的距离决定权重,生成权重的函数为高斯函数,所以叫高斯平滑或者高斯滤波,效果是使图像模糊,并一定程度上的保存边缘,双边滤波的改进是增加了灰度值的影响,也就是邻域的像素灰度值如果和中心像素的灰度值越接近,那么权值在高斯权值的基础上在加上一个相对较大的权值,相反,如果灰度差很大,将会给已生成的高斯模板对应的位置加上一个小的权值,以此类推,并将模板系数归一化(和为1,其目的是完全平滑的图像结果不变),因此模板的系数不再单纯的依赖位置关系,更依赖于灰度关系,因此边缘将能够被有效的保存。

数学基础

      数学开始,数学公式可能看的比较难懂,但是懂了以后就会彻底理解整个算法,上面的描述只需要几个公式就能准确的表示出来。
       来看基础版本的公式,这个公式通用均值滤波和高斯滤波:
       上式中:将上式中的积分脑补成求和,求和范围是模板覆盖的范围,就代表模板的坐标位置(x,y),X就可以表示参数,比如高斯里的标准差参数。1/kd(x)为归一化参数,保证绝对平滑的位置灰度值不变,c的选择比较灵活,如果选择高斯函数,那么就产生了高斯滤波模板。
上面是只利用位置(距离)产生模板系数的公式。下面我看一下只利用灰度信息产生一个模板(非线性):
f表示灰度分布,也就是模板内被覆盖的灰度值,x(向量)代表原点位置,向量代表当前求和位置,同样积分改成求和,求和区间为模板覆盖的区间,同样1/kr(x)是归一化参数,保证平滑图片的不变性。
       根据上面的描述,函数c只根据位置来平滑,平滑效果好,但边缘保存弱,函数s只根据灰度差值产生模板,边缘保存效果好,平滑效果差。
       为了得到一个边缘保持性好,同时平滑能力强的方法,我们决定将他们合体:
      这个公式总和了上面两种处理方法,同时根据距离和灰度差值产生模板系数,产生了一种新的非线性模板,归一化的k计算如下:
       对于图像,脑补成求和而不是积分,这个就是Bilateral Filter的形式,也就是说,c和s并没有规定为高斯函数,如果你有更好的,可以自己开发,当然最一般的情况下,c和s我们选择高斯函数:
       其中d表示距离,这里用欧氏距离来计算(欧氏距离就是初中学的最简单的那个): 
       deta_d为距离的标准差,由我们手动决定,但要注意的是,标准差对于一个高斯函数来说,决定的是它的“胖瘦”,也就是图形是宽还是窄,如果过窄,其中心权重接近1,其他权重会很小,极限情况下退化成冲击,则只有中心位置元素,如果标准差选择过大,高斯函数会过胖,也就是趋于一条直线,这时高斯平滑接近于均值,每个位置权重过于接近,并且,距离超过3倍的deta,那么权重也会很小,所以这个性质在我们选择参数和后面观察结果也是很有用的参考。
       同理我们选择高斯函数作为s函数:
        式子中灰度差为:
       也就是模板内不同位置的灰度与中心灰度的差。
       观察下处理结果,英文不难,不再翻译:
       来看原始论文的效果:
 主要观察点在猫咪的胡须,看到即使右下角特别模糊的情况下,猫咪的胡须还是可以识别出来的。

代码

     与前面文章同样,代码未经过优化,知识原始公式的翻译,如果应用于工程,需要使用快速算法或将算法进行优化:
//高斯函数
double gaussian(double x,double deta){return exp(-0.5*(x*x)/(deta*deta));
}
//计算当前模板系数
double BilateralWindow(double *window,int width,int height,double deta_d,double deta_r){double *mask=(double *)malloc(sizeof(double)*width*height);if(mask==NULL){printf("bilateral window malloc wrong\n");exit(0);}GaussianMask(mask,width,height,deta_d);double detavalue=0.0;double center_value=window[height/2*width+width/2];double k=0.0;double result=0.0;for(int j=0;j<height;j++){for(int i=0;i<width;i++){detavalue=center_value-window[j*width+i];mask[j*width+i]*=gaussian(detavalue,deta_r);k+=mask[j*width+i];}}for(int i=0;i<width*height;i++){result+=mask[i]*window[i];}free(mask);return result/k;
}
//双边滤波
void BilateralFilter(IplImage *src,IplImage *dst,int width,int height,double deta_d,double deta_r){double *window=(double *)malloc(sizeof(double)*width*height);for(int j=height/2;j<src->height-height/2;j++){for(int i=width/2;i<src->width-width/2;i++){for(int m=-height/2;m<height/2+1;m++){for(int n=-width/2;n<width/2+1;n++)window[(m+height/2)*width+n+width/2]=cvGetReal2D(src, j+m, i+n);}double value=BilateralWindow(window,width,height,deta_d,deta_r);cvSetReal2D(dst, j, i, value);}}free(window);
}

观察效果

     下面来观察我们的效果,具体参数已经标在了图像上:
       观察结论:deta_d(距离标准差)越大会导致图像更加模糊,因为使用高斯函数,deta_r(灰度标准差)越大会导致细节变得更模糊,所以可以根据3倍deta原则来选取合适的模板大小和deta大小,灰度差范围-255到255,距离差范围根据模板大小确定。

总结

    双边滤波,可以很好的保存边缘并产生平滑效果,比高斯滤波和均值滤波效果更好,但计算量也更大
参考论文:

灰度图像--图像增强 双边滤波 Bilateral Filtering相关推荐

  1. 三种经典图像滤波方法介绍——双边滤波(Bilateral filter)、导向滤波(Guided Fliter)、滚动导向滤波(RollingGuidedFilter)

    文章目录 一.前言 二.双边滤波(Bilateral filter) 2.1 双边滤波的理论介绍及公式推导 2.2 双边滤波的matlab程序实现 三.导向滤波(Guided Fliter) 3.1 ...

  2. (十五)双边滤波Bilateral Filter

    文章目录 mathjax: true 1.高斯滤波 1.1 理论 1.2 示例 2.双边滤波(Bilateral Filter) 2.1 理论基础 2.2 OpenCV bilateralFilter ...

  3. 双边滤波(bilateral filter)以及联合双边滤波(joint bilateral filter)

    文章目录 双边滤波 理论公式 代码(C++) 数学辅助理解 联合双边滤波(joint bilateral filter) 参考链接 写在最后 双边滤波 自用备忘,若侵则删. 理论公式 利用二维高斯函数 ...

  4. 双边滤波(Bilateral filter)原理介绍及matlab程序实现

    双边滤波 1.原理介绍 双边滤波由C. Tomasi在1998年提出,是一种经典的非线性空间滤波方法.在滤波器稀疏的制定上,双边滤波同时考虑到了输出像素与邻域内其它像素的欧氏距离和取值的差异,即:同时 ...

  5. matlab双边收敛,双边滤波(bilateral filter)快速算法 matlab实现代码

    本算法参考自论文"Paris S, Durand F. A fast approximation of the bilateral filter using a signal process ...

  6. 双边滤波(bilateral filter)彩色图 matlab实现代码

    https://blog.csdn.net/weixin_38285131/article/details/77719199 https://blog.csdn.net/majinlei121/art ...

  7. matlab实现双边滤波_【他山之石】pytorch 实现双边滤波

    "他山之石,可以攻玉",站在巨人的肩膀才能看得更高,走得更远.在科研的道路上,更需借助东风才能更快前行.为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟& ...

  8. 图像滤波(Image Filtering)

    在具体写图像滤波方法之前,先给出图像滤波的一般性目标阐述和经典应用.图像通常有一个直观(intuition)特征: 图像往往由多块组成,各块内像素相似且过渡缓慢,块与块相邻部分称作边缘(Edge). ...

  9. c语言双边滤波算法,浅析bilateral filter双边滤波器的理解

    图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等.但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显.相比较而言,bilateral filter双边滤波器可以很好的边缘保护, ...

最新文章

  1. 学python看什么书好1002无标题-如何使用pandas读取txt文件中指定的列(有无标题)
  2. Xilinx IP解析之Processor System Reset v5.0
  3. jzoj3338-[NOI2013模拟]法法塔的奖励【权值线段树,线段树合并】
  4. bitmap 转 drawable
  5. jquery截取字符串中的数字
  6. python dict遍历_Python教程:Python数据类型之字典(附学习教程)
  7. 单链表的读取、插入与删除
  8. 如何修改WampServer服务器上传文件的大小?
  9. 【Vegas原创】VMWare下,Linux挂载、卸载新硬盘的方法
  10. 国内DDOS防御的专业防火墙技术
  11. 【答粉丝问】前公司挽留涨薪,已经接到下一家公司的offer,是走还是留?
  12. 软考高级 真题 2016年下半年 信息系统项目管理师 案例分析
  13. 项目经验之Kafka压力测试以及kafka机器数量计算
  14. 多传感器融合感知 --传感器外参标定及在线标定学习
  15. Android使用Fragment打造万能页面切换框架(一)
  16. 私服上传出现Failed to transfer file ...... 400错误
  17. python设置win10壁纸
  18. 闭上眼睛时,会感触到那清风拂过脸颊的柔
  19. JavaScript入门经典(第5版)pdf
  20. [内附完整源码和文档] 基于.Net实现的线上医疗咨询系统

热门文章

  1. access 一亿条数据_循环运算数据溢出
  2. arm开发板上电设置静态ip_与X86/Arm三分天下,RISCV还需几步?
  3. vue保存内容到本地_Vue两个版本区别
  4. c语言程序段的流程图怎么画,大家帮我看看这个程序的流程图怎么画,谢了
  5. Spring Boot(一) 自动装配--约定大于配置
  6. Binder 驱动详解(下)
  7. ELK系统之logstash问题:retrying failed action with response code: 429
  8. Linux防火墙详解(二)
  9. 安装配置 flannel - 每天5分钟玩转 Docker 容器技术(59)
  10. ICC_lab总结——ICC_lab4:时钟树综合