基本思路

高斯滤波是一种常用而且简单的降噪算法。但其缺点也很明显,就是会不加区分地将噪声与图像边缘等细节一起平滑处理。

而双边滤波是基于高斯滤波进行改进的方法。在高斯滤波的基础上,双边滤波引入了像素值相似性的权值,使得滤波的结果不仅能够平滑图像,还能保留边缘。

对一幅图像,在平坦的地方像素变化程度较小,用高斯滤波降噪可以取得不错的效果。但是在边缘处,往往会出现剧烈的像素值变化,这时候考虑到边缘两侧的像素值应该是有很大不同的,所以引入像素值相似性权重。即,在一个区域S内,一条边缘将S划分为两部分A和B,A和B的像素值整体差距较大。在做降噪处理时,则把更多的权重倾斜到与中心点相似的区域。如果中心点在AB交界处,但是在A内,则A内的像素点会更多贡献给该点像素值的计算。而B内的像素点则贡献较小。

综上可知,与高斯滤波一样,其基本思想就是通过权值来控制某一个点周边像素值对该点像素值的贡献值。在双边滤波中,考虑了两项权值:距离和相似性。距离即是像素点与中心点的欧式距离,而相似性则是像素点值与中心点值的差值。基于以上思想,得到如下公式:
I‾(p)=1Wp∑q∈SGc(∣∣p−q∣∣)Gs(∣I(p)−I(q)∣)I(q)\overline I(p)=\frac{1}{W_p}\sum_{q\in S}G_c(||p-q||)G_s(|I(p)-I(q)|)I(q) I(p)=Wp​1​q∈S∑​Gc​(∣∣p−q∣∣)Gs​(∣I(p)−I(q)∣)I(q)
其中:
Wp=∑q∈SGc(∣∣p−q∣∣)Gs(∣I(p)−I(q)∣)W_p=\sum_{q\in S}G_c(||p-q||)G_s(|I(p)-I(q)|) Wp​=q∈S∑​Gc​(∣∣p−q∣∣)Gs​(∣I(p)−I(q)∣)
p为需要计算像素值的中心点,S为卷积核覆盖的区域,I‾(p)\overline I(p)I(p)为计算出的像素值,I(p)I(p)I(p)为中心点原始像素值,I(q)I(q)I(q)为区域内某个点的像素值,GcG_cGc​和GsG_sGs​分别代表距离权值和相似权值。如果我们用(x, y)表示p的坐标,(i, j)表示q的坐标,基于二维高斯函数,则有:
Gc=e(−(x−i)2+(y−j)22σc2)Gs=e(−(I(p)−I(q))22σs2)G_c=e^{(-\frac{(x-i)^2+(y-j)^2}{2\sigma_c^2})}\\ G_s=e^{(-\frac{(I(p)-I(q))^2}{2\sigma_s^2})}\\ Gc​=e(−2σc2​(x−i)2+(y−j)2​)Gs​=e(−2σs2​(I(p)−I(q))2​)
σc\sigma_cσc​和σs\sigma_sσs​则分别代表两个标准差。

值得注意的是,在高斯滤波中,相比于标准差小的时候,标准差增大会使得距离中心远的点的权重增加,这一性质由高斯函数决定:当标准差减小时,高斯函数的图像会变得更加平坦。而在双边滤波中,不论是空间标准差还是相似标准差,其增大时,同样在空间域或者值域上体现出相似效果,即标准差越大,与中心点距离远(不相似)的点的权重越大。

同时,方差越大,说明权重差别越小,因此表示不强调这一因素的影响,反之,则表示更强调这一因素导致的权重的不均衡。因此两个方面的某个的方差相对变小 表示这一方面相对较重要,得到强调。如σc\sigma_cσc​变小,表示更多采用近邻的值作平滑,说明图像的空间信息更重要,即相近相似。如σr\sigma_rσr​变小,表示和自己同一类的条件变得苛刻,从而强调值域的相似性。而如果σr\sigma_rσr​趋向无限大,则双边滤波近似退化为高斯滤波。

代码实现

基于以上思想,我尝试使用matlab实现双边滤波

function out=bifilter(ksize,sigmac,sigmas,in)
% 三个参数分别指定kernel size、空间域的标准差、值域的标准差和原始图像[h,w,d]=size(in);
% 获取输入图像三个维度的大小,用于之后的处理及判断[X,Y]=meshgrid(1:ksize,1:ksize);
dist=(X-ceil(ksize/2)).^2+(Y-ceil(ksize/2)).^2;
Gc=exp(-dist/2/sigmac^2);
% 根据kernel size直接算出空间域的距离矩阵,即空间权值,方便之后调用,省去重复计算if d==1
% 判断图像是rgb图像还是灰度图像
% 灰度图像直接处理即可,rgb图像需要分三次处理im=in;padim=padarray(im,[floor(ksize/2),floor(ksize/2)],0,'both');% 根据kernel size对图像边界做扩展,补零for i=1:hfor j=1:wtemp=double(padim(i:i+4,j:j+4));% 取出要处理的块Gs=exp(-(temp-temp(ceil(ksize/2),ceil(ksize/2))).^2/2/sigmas^2);% 计算相似权值Wp=sum(sum(Gc.*Gs));% 计算总权值,用于归一化out(i,j)=sum(sum(Gc.*Gs.*temp))/Wp;% 计算输出像素值endendelse
% 以下与之前内容相似,分三次分别处理三个通道的图像即可for k=1:dim=in(:,:,k);padim=padarray(im,[floor(ksize/2),floor(ksize/2)],0,'both');for i=1:hfor j=1:wtemp=double(padim(i:i+ksize-1,j:j+ksize-1));Gs=exp(-(temp-temp(ceil(ksize/2),ceil(ksize/2))).^2/2/sigmas^2);Wp=sum(sum(Gc.*Gs));out(i,j,k)=sum(sum(Gc.*Gs.*temp))/Wp;endendend
endout=uint8(out);
% 类型转换
end

效果演示

空间域效果

原图整体偏暗,所以我先对原图用gamma函数进行处理

在对比度处理的基础上,我先使用matlab自带的高斯滤波和双边滤波进行了处理。

可以看到高斯滤波后的图像较为模糊,而双边滤波后的图像整体更加清晰,同时有一定的降噪效果。

对比我自己实现的双边滤波与matlab自带的双边滤波,都实现了减少噪点且保留细节的目标。因为我自己的函数,输入的标准差比matlab默认的更大,所以相对而言平滑的效果更加明显。

同时我也实现了高斯滤波,与自己实现的双边滤波对比,整体较为模糊,还是双边滤波效果比较理想。

频域效果

原始图像频谱取对数后如下(以下所有频谱都是对数处理后的频谱)

可以看到高斯滤波类似于一个低通滤波器,将高频成分大部分滤除,主要保留低频成分

双边滤波则并不是简单把高频滤除保留低频,滤波后的频谱图与保留着与原始频谱相似的特征,但也滤去了一些成分,其中既有高频也有低频。


参考以下文章,帮助我理解了很多
Bilateral Filters(双边滤波算法)的超简单原理,学不会你打我。_一蓑烟雨任平生~的博客-CSDN博客_双边滤波

双边滤波——原理及matlab实现_l_eop的博客-CSDN博客_双边滤波matlab

双边滤波原理(Bilateral Filtering) - 知乎 (zhihu.com)

简明扼要高斯函数 - 知乎 (zhihu.com)

双边滤波原理与参数的理解+双边滤波matlab实现相关推荐

  1. 晶振工作原理及参数的理解

    文章目录 一.晶振工作原理 二.晶振的主要参数 三.晶振的等效电路和阻抗频率特性 四.晶振的分类 一.晶振工作原理   晶振具有压电效应,即在晶片两极外加电压后晶体会产生变形,反过来如外力使晶片变形, ...

  2. 《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  3. 双边滤波原理(Bilateral Filtering)

    双边滤波原理(Bilateral Filtering) 基本思路 双边滤波(bilateral filtering)的基本思路是同时考虑将要被滤波的像素点的空域信息(domain)和值域信息(rang ...

  4. 高斯滤波与双边滤波原理、MATLAB实现及结果对照

    本文详细介绍高斯滤波和双边滤波的原理并给出MATLAB实现,最后对照高斯滤波与双边滤波的效果. 目录 一.滤波原理 1.1 一维高斯分布 1.2 二维高斯分布 1.3 高斯滤波总结 二.双边滤波 1. ...

  5. 基于双边滤波(BF)和加权最小二乘滤波(WLS)的RGB-NIR图像融合细节增强

    基于双边滤波(BF)和加权最小二乘滤波(WLS)的RGB-NIR图像融合细节增强 简介 实现 结果 下载 原文:RGB-NIR Image Enhancement by Fusing Bilatera ...

  6. 详解图像滤波原理及实现!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:姚童,Datawhale优秀学习者 图像的实质是一种二维信号,滤波 ...

  7. 均值滤波器类型_详解图像滤波原理及实现!

    图像的实质是一种二维信号,滤波是信号处理中的一个重要概念.在图像处理中,滤波是一常见的技术,它们的原理非常简单,但是其思想却十分值得借鉴,滤波是很多图像算法的前置步骤或基础,掌握图像滤波对理解卷积神经 ...

  8. 详解非局部均值滤波原理以及用MATLAB源码实现

    详解非局部均值滤波原理以及用MATLAB源码实现 序言 均值滤波.中值滤波.高斯滤波在滤除噪声的过程中,无可避免的使图像的边缘细节和纹理信息所被滤除.针对此问题,Buades[1]等人提出了非局部均值 ...

  9. 高斯图像滤波原理及其编程离散化实现方法

    本文主要根据作者的理解整理而来,有什么错误之处,请大家共同讨论指出. 1.图像滤波 在三维计算机视觉领域,通常对于二维图像的特征抽取是很关键的第一步,这主要包括抽取二维图像上的边缘.角点.纹理等.通常 ...

最新文章

  1. 蓝桥杯第九届决赛-交换次数-java
  2. phpstorm 关闭多余变量提示
  3. Java EE 7 / JAX-RS 2.0 – REST上的CORS
  4. python从入门到实践答案第四章_python从入门到实践课后习题第四章
  5. 那天,我无意间瞟了眼程序员的桌面……
  6. orcad元件封装制作
  7. OverFeat(译)
  8. 计算机id dns知识,智能DNS解析知识集锦
  9. 电脑中病毒所有html文件,文件夹全部变成exe文件该怎么办?电脑中了kiss病毒的两种解决办法...
  10. 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si 注意,每个字的拼音之间有一个空格
  11. 三维欧几里德空间中两个向量叉积的问题
  12. 如何安装xampp(linux版)
  13. 统一调度平台V2.0
  14. Ubuntu搭建Http服务器用于下载Ubuntu文件
  15. 如何快速学习STAR-CCM+软件解决工程实际问题
  16. 一个好用的脚本生成工具
  17. golang 区块链:默克尔树(Merkle Tree)
  18. 什么是 Fat/Shade/Shadow Jar
  19. Assignment HDU - 2853(二分图匹配 KM)
  20. Python+selenium 模拟wap端页面操作

热门文章

  1. C语言查看大小端(纯代码)
  2. python数据分析书单排行_Python数据分析学习日志(1. 书单)
  3. 悟空学Linux专栏----第19篇
  4. iOS本地音频播放、截取的实现,播放时带有动画效果
  5. Android用户登录注册界面
  6. plsql auto 常用语法
  7. java 网络通讯_JAVA编程实现TCP网络通讯的方法示例
  8. MVC easyui-switchbutton 和 checkbox 、radio 使用和赋值 JQ select 取值
  9. 为何“迷你本”退货率很高?
  10. CentOS 7 最小化安装