双边滤波总结 包括代码与注释
点云双标滤波降噪matlab代码

点云双标滤波降噪是数字图像处理领域的一个重要研究方向,它在三维重建、机器人感知、激光雷达数据处理等领域有着广泛的应用。
本文将结合matlab代码,介绍点云双标滤波降噪的原理与实现方法。
一、点云双标滤波降噪原理1. 点云数据模型点云是由大量离散的三维点组成的数据集,常用于描述三维物体的形状和表面特征。
在点云中,每个点都包括位置坐标和可能的其他属性,如颜色、法向量等。
2. 双边滤波原理双边滤波是一种非线性滤波方法,它考虑了像素之间的空间距离和像素值之间的相似性,从而在保持边缘清晰的同时对图像进行平滑处理。
在点云处理中,双边滤波可以有效地降低噪音,并且保持点云的细节和边缘特征。
3. 点云双边滤波原理点云双边滤波是在传统双边滤波的基础上,针对点云数据进行了改进和优化。
它不仅考虑了空间距离和属性值之间的相似性,还考虑了点云之间的拓扑结构和局部特征,从而更适用于点云的降噪处理。
二、点云双标滤波降噪matlab代码实现1. 环境准备在matlab环境中,我们首先需要导入点云数据,并确保安装了点云处理工具包。
2. 读取点云数据使用matlab自带的点云处理工具包,可以方便地读取和可视化点云数据。
可以使用以下代码读取点云数据:```matlabptCloud = pcread('pointCloud.ply');```3. 点云双标滤波接下来,我们将使用matlab提供的点云滤波函数进行双标滤波处理。
具体代码如下:```matlabpc = pcdenoise(ptCloud, 'Threshold', 1);```在这段代码中,'Threshold'参数可以调节滤波的敏感度,根据实际情况进行调整。
4. 可视化处理结果我们可以使用matlab的plot函数对处理后的点云数据进行可视化,以便直观地观察降噪效果。
```matlabpcshow(pc);```三、实例应用与效果评估1. 三维重建点云双标滤波可以在三维重建中去除噪音,提高重建的精度和稳定性。
cv2 bilateralfilter 使用方法

cv2 bilateralfilter 使用方法(原创实用版3篇)目录(篇1)1.OpenCV 中双边滤波器的概念2.cv2.bilateralFilter() 函数的使用方法3.函数参数及作用4.应用实例正文(篇1)1.OpenCV 中双边滤波器的概念双边滤波器是一种非线性滤波器,主要用于降低图像噪声,同时保留图像的边缘信息。
与传统的线性滤波器如高斯滤波器和双极滤波器相比,双边滤波器在保留图像细节方面表现得更好。
在 OpenCV 库中,双边滤波器可以通过 cv2.bilateralFilter() 函数实现。
2.cv2.bilateralFilter() 函数的使用方法cv2.bilateralFilter() 函数接收两个参数,分别是输入图像(要求为 8 位或浮点数)和滤波器参数。
函数的返回值为滤波后的图像。
函数原型为:cv2.bilateralFilter(src, dp)其中:- src:输入图像,必须是 8 位或浮点数的 NumPy 数组或 Python 列表。
- dp:滤波器参数,是一个包含两个元素的元组,分别表示空间滤波器标准差和高斯滤波器标准差。
例如,dp=(5, 5) 表示使用一个具有 5 像素空间标准差和 5 像素高斯标准差的双边滤波器。
3.函数参数及作用- src:输入图像,决定了滤波操作的输入。
- dp:滤波器参数,决定了滤波操作的方式。
包括两个元素:- space:空间滤波器标准差,控制空间域滤波器的强度。
值越大,滤波器作用越强,图像越平滑,但细节损失也越严重。
- diameter:高斯滤波器标准差,控制高斯核的宽度。
值越大,滤波器作用越强,图像越平滑,但细节损失也越严重。
4.应用实例下面是一个使用 cv2.bilateralFilter() 函数的 Python 示例:```pythonimport cv2import numpy as np# 创建一个包含噪声的图像img = np.random.randint(0, 256, (256, 256, 3), dtype=np.uint8) # 使用双边滤波器降噪filtered_img = cv2.bilateralFilter(img, (5, 5))# 显示原始图像和滤波后的图像cv2.imshow("Original Image", img)cv2.imshow("Filtered Image", filtered_img)cv2.waitKey(0)cv2.destroyAllWindows()```这个示例首先创建了一个包含噪声的图像,然后使用cv2.bilateralFilter() 函数进行滤波,最后显示原始图像和滤波后的图像。
双边滤波算法的原理

双边滤波算法的原理、流程、实现及效果2013-11-07 15:17 1969人阅读评论(1) 收藏举报MATALB图像处理双边滤波一、引言双边滤波在图像处理领域中有着广泛的应用,比如去噪、去马赛克、光流估计等等,最近,比较流行的Non-Local算法也可以看成是双边滤波的一种扩展。
自从Tomasi et al等人提出该算法那一天起,如何快速的实现他,一直是人们讨论和研究的焦点之一,在2011年及2012年Kunal N. Chaudhury等人发表的相关论文中,提出了基于三角函数关系的值域核算法,能有效而又准确的实现高效双边算法。
本文主要对此论文提出的方法加以阐述。
双边滤波的边缘保持特性主要是通过在卷积的过程中组合空域函数和值域核函数来实现的,典型的核函数为高斯分布函数,如下所示:(1)其中:(2)为归一化的作用。
σs为空域高斯函数的标准差,σr为值域高斯函数的标准差,Ω表示卷积的定义域。
可见,在图像的平坦区域,f(y)-f(x)的值变化很小,对应的值域权重接近于1,此时空域权重起主要作用,相当于直接对此区域进行高斯模糊,在边缘区域,f(y)-f(x)会有较大的差异,此时值域系数会下降,从而导致此处整个核函数的分布的下降,而保持了边缘的细节信息。
直接的编码实现上述过程是相当耗时的,其时间复杂度为O(σs2),因此严重的限制住了该算法的推广和实际使用。
不断有学者提出了解决的办法,其中Porikli基于一些假定对此过程进行了优化,比如我就实现过其中一种:空域函数为均值函数,值域为任何其他函数,此时可以用直方图技术进行处理,可减少计算量,但我的实践表明该算法那速度还是慢,并且效果也不好。
在2011的论文《Fast O(1) bilateral filtering using trigonometric range kernels》中,作者提出了用Raised cosines函数来逼近高斯值域函数,并利用一些特性把值域函数分解为一些列函数的叠加,从而实现函数的加速。
双边滤波原理_HLS实现Bilateral Filtering双边滤波器

双边滤波原理_HLS实现Bilateral Filtering双边滤波器双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。
之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。
一个函数是由几何空间距离决定滤波器系数。
另一个由像素差值决定滤波器系数。
双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,权重系数w(i,j,k,l)取决于定义域核和值域核的乘积,同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。
双边滤波原理(Bilateral Filtering)基本思路双边滤波(bilateral filtering)的基本思路是同时考虑将要被滤波的像素点的空域信息(domain)和值域信息(range)。
因此是一种combined 滤波方式,因此叫做bilateral ,即同时考虑两方面的信息。
首先,对于图像滤波来说,一个通常的intuition是:(自然)图像在空间中变化缓慢,因此相邻的像素点会更相近。
但是这个假设在图像的边缘处变得不成立。
如果在边缘处也用这种思路来进行滤波的话,即认为相邻相近,则得到的结果必然会模糊掉边缘,这是不吼的,因此考虑再利用像素点的值的大小进行补充,因为边缘两侧的点的像素值差别很大,因此会使得其加权的时候权重具有很大的差别,从而使得只考虑自己所属的一边的邻域。
可以理解成先根据像素值对要用来进行滤波的邻域做一个分割或分类,再给该点所属的类别相对较高的权重,然后进行邻域加权求和,得到最终结果。
实现原理在bilateral filtering 中,两个要素即:closeness 和similarity ,或者说domain 和range ,或者geometric 和photometric ,其数学表达方式相近,如下:其中积分号前面为归一化因子,这里考虑对所有的像素点进行加权,c 和s 是closeness 和similarity 函数,x 代表要求的点,f (x)代表该点的像素值。
简述双边滤波的原理及应用

简述双边滤波的原理及应用1. 原理双边滤波是一种非线性的图像滤波算法,能够在去除图像噪声的同时保持边缘信息。
它的原理是通过结合图像的空间距离和像素值相似度来进行滤波。
算法的核心思想是通过一个窗口在图像中滑动,对每个像素进行滤波处理。
在窗口内,通过计算空间距离的权重和像素值相似度的权重得到最终的滤波结果。
具体的计算公式如下:$$ I^{\\text{filtered}}(x, y) =\\frac{1}{W_p}\\sum_{(i,j)\\in\\Omega}{G_{\\sigma_s}(d_{ij})G_{\\sigma_r}(I(x,y) -I(i,j))I(i,j)} $$其中, - $I^{\\text{filtered}}(x, y)$表示滤波后的像素值, - I(x,y)表示当前像素的值, - (i,j)表示窗口内的像素位置, - $\\Omega$表示窗口内的像素集合, - d ij表示当前像素与窗口内像素位置的空间距离, - $G_{\\sigma_s}(d_{ij})$表示空间距离的权重, - $\\sigma_s$控制空间距离的衰减速度, - $G_{\\sigma_r}(I(x,y)-I(i,j))$表示像素值相似度的权重, - $\\sigma_r$控制像素值相似度的衰减速度, - W p表示归一化的权重和。
双边滤波通过调整$\\sigma_s$和$\\sigma_r$来控制滤波效果,两个参数的取值会直接影响滤波的平滑程度和边缘保持效果。
2. 应用双边滤波算法在图像处理中有广泛的应用,主要包括以下几个方面:2.1 图像去噪双边滤波算法能够有效地去除图像中的噪声,包括高斯噪声、椒盐噪声等。
相比于传统的线性滤波算法,双边滤波能够保持图像的边缘信息,避免了因平滑操作而导致的边缘模糊问题。
2.2 图像增强由于双边滤波算法能够保持图像的细节信息,因此可以用于图像增强的应用。
通过调整滤波参数,可以增强图像的纹理、边缘、细节等特点,使图像更加清晰、鲜明。
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波

【OpenCV】邻域滤波:方框、高斯、中值、双边滤波2012-07-26 10:52 30236人阅读评论(35) 收藏举报分类:【图像处理】(43)作者同类文章X版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]邻域滤波卷积方框滤波代码实验结果高斯滤波代码实验结果非线性滤波中值滤波代码中值滤波实验双边滤波双边滤波源码双边滤波调用双边滤波实验参考文献转载请注明出处httpblogcsdnnetxiaowei_cquarticledetails7785365邻域滤波(卷积)邻域算子值利用给定像素周围像素的值决定此像素的最终输出。
如图左边图像与中间图像卷积禅城右边图像。
目标图像中绿色的像素由原图像中蓝色标记的像素计算得到。
通用线性邻域滤波是一种常用的邻域算子,输入像素加权得到输出像素:其中权重核为“滤波系数”。
上面的式子可以简记为:【方框滤波】最简单的线性滤波是移动平均或方框滤波,用窗口中的像素值平均后输出,核函数其实等价于图像与全部元素值为1的核函数进行卷积再进行尺度缩放。
代码OpenCV中的blur函数是进行标准方框滤波:[cpp] view plaincopyprint?void cv::blur( InputArray src, OutputArray dst,Size ksize, Point anchor, int borderType ){boxFilter( src, dst, -1, ksize, anchor, true, borderType );}void cv::blur( InputArray src, OutputArray dst,Size ksize, Point anchor, int borderType ){boxFilter( src, dst, -1, ksize, anchor, true, borderType );}而boxFilter函数源码如下:[cpp] view plaincopyprint?cv::Ptr<cv::FilterEngine> cv::createBoxFilter( int srcType, int dstType, Size ksize, Point anchor, bool normalize, int borderType )int sdepth = CV_MAT_DEPTH(srcType);int cn = CV_MAT_CN(srcType), sumType = CV_64F;if( sdepth <= CV_32S && (!normalize ||ksize.width*ksize.height <= (sdepth == CV_8U ? (1<<23) :sdepth == CV_16U ? (1 << 15) : (1 << 16))) )sumType = CV_32S;sumType = CV_MAKETYPE( sumType, cn );Ptr<BaseRowFilter> rowFilter = getRowSumFilter(srcType, sumType, ksize.width, anc hor.x );Ptr<BaseColumnFilter> columnFilter = getColumnSumFilter(sumType,dstType, ksize.height, anchor.y, normalize ? 1./(ksize.width*ksize.height) : 1);return Ptr<FilterEngine>(new FilterEngine(Ptr<BaseFilter>(0), rowFilter, columnFilter, srcType, dstType, sumType, borderType ));}cv::Ptr<cv::FilterEngine> cv::createBoxFilter( int srcType, int dstType, Size ksize,Point anchor, bool normalize, int borderType ){int sdepth = CV_MAT_DEPTH(srcType);int cn = CV_MAT_CN(srcType), sumType = CV_64F;if( sdepth <= CV_32S && (!normalize ||ksize.width*ksize.height <= (sdepth == CV_8U ? (1<<23) :sdepth == CV_16U ? (1 << 15) : (1 << 16))) )sumType = CV_32S;sumType = CV_MAKETYPE( sumType, cn );Ptr<BaseRowFilter> rowFilter = getRowSumFilter(srcType, sumType, ksize.width, anchor.x );Ptr<BaseColumnFilter> columnFilter = getColumnSumFilter(sumType,dstType, ksize.height, anchor.y, normalize ? 1./(ksize.width*ksize.height) : 1);return Ptr<FilterEngine>(new FilterEngine(Ptr<BaseFilter>(0), rowFilter, columnFilter, srcType, dstType, sumType, borderType ));}这里blur 和boxFilter 的区别是,blur是标准化后的boxFilter,即boxFilter的核函数:其中,[cpp] view plaincopyprint?blur( src, dst, Size( 1, 1 ), Point(-1,-1));blur( src, dst, Size( 4, 4 ), Point(-1,-1));blur( src, dst, Size( 8, 8 ), Point(-1,-1));blur( src, dst, Size( 16, 16 ), Point(-1,-1));blur( src, dst, Size( 1, 1 ), Point(-1,-1));blur( src, dst, Size( 4, 4 ), Point(-1,-1));blur( src, dst, Size( 8, 8 ), Point(-1,-1));blur( src, dst, Size( 16, 16 ), Point(-1,-1));实验结果下图是对一幅图像分别用1*1,4*4,8*8,16*16标准方框滤波后的图像:【高斯滤波】高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。
cv2.bilateralfilter参数
cv2.bilateralfilter参数(最新版)目录1.cv2.bilateralfilter 函数的作用2.cv2.bilateralfilter 函数的参数3.参数的使用方法和注意事项4.示例代码正文一、cv2.bilateralfilter 函数的作用cv2.bilateralfilter 是 OpenCV 库中的一个函数,主要用于对图像进行双边滤波处理。
双边滤波是一种非线性滤波方法,它能够在保持图像边缘清晰的同时,对图像进行平滑处理。
这使得双边滤波在处理包含噪声的图像时,具有很好的去噪效果,同时又能保留图像的细节。
二、cv2.bilateralfilter 函数的参数cv2.bilateralfilter 函数的参数主要有以下几个:1.src:输入图像,即需要进行双边滤波处理的图像。
2.d:直径,表示邻域的尺寸,即在计算滤波核时,考虑的像素点范围。
3.sigmaX:表示空间域的尺度参数,控制滤波核在空间方向上的宽度。
sigmaX 越大,滤波核越宽,去噪效果越强,但图像细节可能会受到影响。
4.sigmaY:表示频域的尺度参数,控制滤波核在频域方向上的宽度。
sigmaY 越大,滤波核越宽,滤波效果越强,但可能会导致图像边缘模糊。
5.param1:表示空间域的权重参数,控制空间方向上的滤波强度。
param1 的取值范围是 (0, 1),当 param1 接近 1 时,滤波效果更强,但图像细节可能会受到影响。
6.param2:表示频域的权重参数,控制频域方向上的滤波强度。
param2 的取值范围是 (0, 1),当 param2 接近 1 时,滤波效果更强,但可能会导致图像边缘模糊。
三、参数的使用方法和注意事项在使用 cv2.bilateralfilter 函数时,需要根据实际需求和图像特点合理设置参数。
一般来说,对于噪声较大的图像,可以适当增大 d、sigmaX 和 sigmaY,以提高去噪效果;对于边缘较模糊的图像,可以适当减小 d、sigmaX 和 sigmaY,以保留图像边缘。
matlab双边滤波函数调用
matlab双边滤波函数调用Matlab是一种非常强大的工具,它提供了许多图像处理和滤波函数,包括双边滤波函数。
双边滤波是一种在图像处理中广泛应用的滤波方法,它能够保留图像的边缘信息的同时对图像进行平滑处理。
在本篇文章中,我将介绍如何使用Matlab中的双边滤波函数进行图像处理。
一、什么是双边滤波?双边滤波是一种非线性滤波方法,它不仅考虑了像素之间的空间距离,还考虑了像素之间的灰度差异。
该滤波器通过计算像素之间的空间距离和灰度差异,来决定像素的权重。
这样,双边滤波能够有效地保留图像的细节信息,同时去除噪声和平滑图像。
二、如何调用Matlab中的双边滤波函数?在Matlab中,可以使用“bfilter2”函数来实现双边滤波。
该函数的基本语法为:outputImage = bfilter2(inputImage, sigma_spatial, sigma_range)其中,inputImage是输入图像,可以是灰度图像或彩色图像;sigma_spatial是空间域的标准差,它控制了像素之间的空间距离权重;sigma_range是灰度域的标准差,它控制了像素之间的灰度差异权重。
三、如何使用双边滤波函数进行图像处理?下面通过一个简单的例子来演示如何使用双边滤波函数进行图像处理。
我们需要加载一张图像。
假设我们加载了一张名为inputImage的图像。
```matlabinputImage = imread('input.jpg');```我们可以调用双边滤波函数对图像进行滤波处理。
```matlaboutputImage = bfilter2(inputImage, 3, 0.1);```在这个例子中,我们将sigma_spatial设置为3,sigma_range设置为0.1。
你可以根据具体的需求来调整这两个参数。
我们可以显示输入图像和输出图像,并进行比较。
```matlabsubplot(1, 2, 1); imshow(inputImage); title('Input Image');subplot(1, 2, 2); imshow(outputImage); title('Output Image');```通过这段代码,我们可以看到输入图像和经过双边滤波处理后的输出图像。
快速双边滤波综述
快速双边滤波综述快滤双边滤波⼀、关于双边滤波(BLF)C.Tomasi 和R.Manduchi 提出了⼀种⾮迭代的简单策略,⽤于边缘保持滤波,称之为双边滤波。
双边滤波的内在想法是:在图像的值域(range )上做传统滤波器在空域(domain )上做的⼯作。
空域滤波对空间上邻近的点进⾏加权平均,加权系数随着距离的增加⽽减少;值域滤波则是对像素值相近的点进⾏加权平均,加权系数随着值差的增⼤⽽减少。
低通空域滤波器定义如下,f(x)为输⼊图像,h(x)为输出图像:1()()()(,)d x k c d ξξξ∞∞--∞-∞=??h x f x在上式中,(,)c ξx 度量了邻域中⼼点x 与邻近点ξ的⼏何邻近度,d k 为归⼀化参数,其值与图像的内容⽆关,在相同的⼏何位置其值恒定。
同理,值域滤波可定义如下:1()()()((),())r x k s d ξξξ∞∞--∞-∞=??h x f f f x((),())s ξf f x 度量了邻域中⼼点x 与邻近点ξ像素的光度相似性,r k 为归⼀化参数,与d k 不同,r k 的值依赖于图像f 。
单单应⽤值域滤波是没有意义的,它仅仅改变了图像的颜⾊映射,因为在空间上远离领域中⼼x 的点的取值不应该对x 的最终值有所影响。
恰当的做法是结合空域与值域滤波,也即同时考虑⼏何位置与光度⼤⼩。
组合后的滤波即为双边滤波器:1()()()(,)((),())x k c s d ξξξξ∞∞--∞-∞=??h x f x f f x这种结合后的滤波器称之为双边滤波器。
它⽤与x 点空间邻近且光度相似的点的像素值平均来取代x 点上原来的像素值。
在平滑的区域,双边滤波器表现为标准的⽹域滤波器,通过平均过滤掉噪声。
如图2(a )所⽰,存在⼀条锐利的分界线将图像分为暗和明的区域两个区域,当双边滤波器被定位在明区域上的⼀个像素点时,相似函数s 对同⼀侧的像素值取近似于1的值,对暗区域的像素点取近似于0的值,如图2(b )所⽰。
数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波)
数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤
波与⾼斯滤波)
⾼斯滤波就是对整幅图像进⾏加权平均的过程。
每个像素点的值,都由其本⾝和邻域内的其它像素值经过加权平均后得到。
⾼斯滤波的详细操作是:⽤⼀个模板(或称卷积、掩模)扫描图像中的每个像素。
⽤模板确定的邻域内像素的加权平均灰度值去替代模板中⼼像素点的值。
#滤波去噪
lbimg=cv2.GaussianBlur(newimg,(3,3),1.8)
cv2.imshow('src',newimg)
cv2.imshow('dst',lbimg)
cv2.waitKey()
cv2.destroyAllWindows()
双边滤波器的优点是能够做边缘保存(edge preserving),⼀般过去⽤的维纳滤波或者⾼斯滤波去降噪。
都会较明显地模糊边缘,对于⾼频细节的保护效果并不明显。
双边滤波器顾名思义⽐⾼斯滤波多了⼀个⾼斯⽅差sigma-d,它是基于空间分布的⾼斯滤波函数。
所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。
#滤波去噪
lbimg=cv2.bilateralFilter(newimg,3,140,140)
cv2.imshow('src',newimg)
cv2.imshow('dst',lbimg)
cv2.waitKey()
cv2.destroyAllWindows()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
双边滤波器: 图像滤波,记载尽量保留图像细节特征的条件下对目标图像的噪声进行抑制。 双边滤波是一种可以保边去噪的滤波器。它的原理是因为滤波器由两个函数构成,一个函数是有几何空间距离决定滤波器系数,另一个有像素差值决定滤波器系数。 function B = bfilter2(A,w,sigma)
% Verify that the input image exists and is valid. if ~exist('A','var') || isempty(A) error('Input image A is undefined or invalid.'); end if ~isfloat(A) || ~sum([1,3] == size(A,3)) || ... min(A(:)) < 0 || max(A(:)) > 1 error(['Input image A must be a double precision ',... 'matrix of size NxMx1 or NxMx3 on the closed ',... 'interval [0,1].']); end
% Verify bilateral filter window size. if ~exist('w','var') || isempty(w) || ... numel(w) ~= 1 || w < 1 w = 5; end w = ceil(w);
% Verify bilateral filter standard deviations. if ~exist('sigma','var') || isempty(sigma) || ... numel(sigma) ~= 2 || sigma(1) <= 0 || sigma(2) <= 0 sigma = [3 0.1]; end
% Apply either grayscale or color bilateral filtering. if size(A,3) == 1 B = bfltGray(A,w,sigma(1),sigma(2)); else B = bfltColor(A,w,sigma(1),sigma(2)); end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Implements bilateral filtering for grayscale images. function B = bfltGray(A,w,sigma_d,sigma_r)
% Pre-compute Gaussian distance weights. [X,Y] = meshgrid(-w:w,-w:w); G = exp(-(X.^2+Y.^2)/(2*sigma_d^2)); % Create waitbar. h = waitbar(0,'Applying bilateral filter...'); set(h,'Name','Bilateral Filter Progress');
% Apply bilateral filter. dim = size(A); B = zeros(dim); for i = 1:dim(1) for j = 1:dim(2)
% Extract local region. iMin = max(i-w,1); iMax = min(i+w,dim(1)); jMin = max(j-w,1); jMax = min(j+w,dim(2)); I = A(iMin:iMax,jMin:jMax);
% Compute Gaussian intensity weights. H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));
% Calculate bilateral filter response. F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1); B(i,j) = sum(F(:).*I(:))/sum(F(:));
end waitbar(i/dim(1)); end
% Close waitbar. close(h);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Implements bilateral filter for color images. function B = bfltColor(A,w,sigma_d,sigma_r)
% Convert input sRGB image to CIELab color space. if exist('applycform','file') A = applycform(A,makecform('srgb2lab')); else A = colorspace('Lab<-RGB',A); end % Pre-compute Gaussian domain weights. [X,Y] = meshgrid(-w:w,-w:w); G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
% Rescale range variance (using maximum luminance). sigma_r = 100*sigma_r;
% Create waitbar. h = waitbar(0,'Applying bilateral filter...'); set(h,'Name','Bilateral Filter Progress');
% Apply bilateral filter. dim = size(A); B = zeros(dim); for i = 1:dim(1) for j = 1:dim(2)
% Extract local region. iMin = max(i-w,1); iMax = min(i+w,dim(1)); jMin = max(j-w,1); jMax = min(j+w,dim(2)); I = A(iMin:iMax,jMin:jMax,:);
% Compute Gaussian range weights. dL = I(:,:,1)-A(i,j,1); da = I(:,:,2)-A(i,j,2); db = I(:,:,3)-A(i,j,3); H = exp(-(dL.^2+da.^2+db.^2)/(2*sigma_r^2));
% Calculate bilateral filter response. F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1); norm_F = sum(F(:)); B(i,j,1) = sum(sum(F.*I(:,:,1)))/norm_F; B(i,j,2) = sum(sum(F.*I(:,:,2)))/norm_F; B(i,j,3) = sum(sum(F.*I(:,:,3)))/norm_F;
end waitbar(i/dim(1)); end
% Convert filtered image back to sRGB color space. if exist('applycform','file') B = applycform(B,makecform('lab2srgb')); else B = colorspace('RGB<-Lab',B); end
% Close waitbar. close(h);
调用方法 img1 = double(imread('1.jpg'))/255; %将图像归一化到[0,1]的矩阵
w = 5; 或者10 % bilateral filter half-width
sigma = [3 0.1]; % 定义域方差d
记为SIGMA(1),值域方差r记
为SIGMA(2) % Apply bilateral filter to each image. bflt_img1 = bfilter2(img1,w,sigma); imshow(bflt_img1);
sigma[1]=空间 space sigma[2]=亮度 r 双边滤波对空间方差的取值更敏感 空间方差越小,图像的边缘和细节越清楚,空间方差越大,图像越模糊 在平滑区域,亮度方差越大能更好地平滑噪声。在边缘和存在纹理的区域,亮度方差越小,能保留更多的边缘特征。
滤波器由两个函数构成,一个是由空间距离决定的滤波器系数。一个是由像素差值决定滤波器的系数。
,,(,)(,)(,)(,)(,)(,)xyxyijSijSijgijfxyij
式中,xyS表示中心点(,)xy的(21)x(21)NN大小的邻域。
(,)gij是处理前图像
(,)fxy是滤波后的图像