高斯滤波和双向滤波的区别与联系
OpenCV-图像平滑-卷积、平均、高斯模糊、中值模糊、双边滤波

OpenCV-图像平滑-卷积、平均、⾼斯模糊、中值模糊、双边滤波卷积 LPF(低通滤波)帮助我们去除噪⾳,模糊图像,降低图像的⾼频成分。
如 kernel = [[0, -1, 0], [-1, 5, -1], [0, -1, 0]] HPF (⾼通滤波)帮助我们找到图像的边缘,去除图像的低频成分。
如: kernel = [[0, -1, 0], [-1, 4, -1], [0, -1, 0]] 在低频区域(图像变化很⼩的区域),通过卷积,会将该点的灰度值变成接近0的值,⽽在⾼频区域(变化⼤的区域,边缘),通过卷积会保留下来(灰度值接近1)。
OpenCV 提供的函数 cv.filter2D() 可以让我们对⼀幅图像进⾏卷积操作(实际上并⾮卷积操作)。
代码:1import numpy as np2import cv23from matplotlib import pyplot as plt45 img = cv2.imread("../image/girl.jpg")6 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)78# ⽣成 5 X 5的平均滤波器核9 kernel = np.ones((5, 5), np.float32) / 251011 dst = cv2.filter2D(img, -1, kernel)1213 plt.subplot(121), plt.imshow(img), plt.title("Original")14 plt.subplot(122), plt.imshow(dst), plt.title("Avera")15 plt.show()结果:平均法 这是由⼀个归⼀化卷积框完成的。
他只是⽤卷积框覆盖区域所有像素的平均值来代替中⼼元素。
可以使⽤函数 cv2.blur() 和cv2.boxFilter() 来完这个任务。
说明几种滤波方法的处理效果

说明几种滤波方法的处理效果滤波是数字信号处理中的一种常见方法,用于去除信号中的噪声或其他干扰。
在实际应用中,不同的滤波方法具有不同的优缺点和适用场景。
本文将介绍几种常见的滤波方法及其处理效果。
1. 均值滤波均值滤波是一种简单有效的滤波方法,其基本思想是利用邻域像素点的平均值来代替当前像素点的值。
该方法适用于去除高斯噪声等随机噪声,但对于图像细节较多、边缘清晰的图像效果不佳。
2. 中值滤波中值滤波是一种非线性滤波方法,其基本思想是利用邻域像素点的中位数来代替当前像素点的值。
该方法适用于去除椒盐噪声等脉冲噪声,并且可以保留图像细节和边缘信息。
但对于连续性较强、变化较平缓的图像效果不佳。
3. 高斯滤波高斯滤波是一种线性平滑滤波方法,其基本思想是利用高斯函数对邻域像素点进行加权平均。
该方法适用于去除高斯噪声和椒盐噪声,并且可以保留图像细节和边缘信息。
但对于图像中存在较多纹理和细节的情况,会导致模糊效果。
4. 双边滤波双边滤波是一种非线性滤波方法,其基本思想是利用空间域和灰度值域两个方向上的高斯函数对邻域像素点进行加权平均。
该方法适用于去除高斯噪声、椒盐噪声和周期性噪声,并且可以保留图像细节和边缘信息。
但计算量较大,处理时间相对较长。
5. 小波变换小波变换是一种基于多尺度分析的信号处理方法,其基本思想是将信号分解成不同尺度的子带,并对每个子带进行滤波处理。
该方法适用于去除多种类型的噪声,并且可以保留图像细节和边缘信息。
但需要选择合适的小波基函数和分解层数,过高或过低的分解层数都会导致处理效果不佳。
综上所述,不同的滤波方法适用于不同的噪声类型和图像特征。
在实际应用中,需要根据具体情况选择合适的滤波方法,并进行参数调节和优化,以达到最佳的处理效果。
图像滤波之高斯滤波介绍

图像滤波之⾼斯滤波介绍1 ⾼斯滤波简介 了解⾼斯滤波之前,我们⾸先熟悉⼀下⾼斯噪声。
⾼斯噪声是指它的服从(即)的⼀类噪声。
如果⼀个噪声,它的幅度分布服从⾼斯分布,⽽它的⼜是均匀分布的,则称它为⾼斯⽩噪声。
⾼斯⽩噪声的⼆阶矩不相关,⼀阶矩为,是指先后信号在时间上的相关性,包括和。
⾼斯滤波器是⼀类根据⾼斯函数的形状来选择权值的线性平滑滤波器。
⾼斯平滑滤波器对于抑制服从正态分布的噪声⾮常有效。
⼀维零均值⾼斯函数为: g(x)=exp( -x^2/(2 sigma^2) 其中,⾼斯分布参数Sigma决定了⾼斯函数的宽度。
对于图像处理来说,常⽤⼆维零均值离散⾼斯函数作平滑滤波器,⾼斯函数的图形:2 ⾼斯滤波函数 对于图像来说,⾼斯滤波器是利⽤⾼斯核的⼀个2维的卷积算⼦,⽤于图像模糊化(去除细节和噪声)。
1) ⾼斯分布 ⼀维⾼斯分布: ⼆维⾼斯分布: 2) ⾼斯核 理论上,⾼斯分布在所有定义域上都有⾮负值,这就需要⼀个⽆限⼤的卷积核。
实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可。
如下图为⼀个标准差为1.0的整数值⾼斯核。
3 ⾼斯滤波性质 ⾼斯函数具有五个重要的性质,这些性质使得它在早期图像处理中特别有⽤.这些性质表明,⾼斯平滑滤波器⽆论在空间域还是在频率域都是⼗分有效的低通滤波器,且在实际图像处理中得到了⼯程⼈员的有效使⽤.⾼斯函数具有五个⼗分重要的性质,它们是: (1)⼆维⾼斯函数具有旋转对称性,即滤波器在各个⽅向上的平滑程度是相同的.⼀般来说,⼀幅图像的边缘⽅向是事先不知道的,因此,在滤波前是⽆法确定⼀个⽅向上⽐另⼀⽅向上需要更多的平滑.旋转对称性意味着⾼斯平滑滤波器在后续边缘检测中不会偏向任⼀⽅向. (2)⾼斯函数是单值函数.这表明,⾼斯滤波器⽤像素邻域的加权均值来代替该点的像素值,⽽每⼀邻域像素点权值是随该点与中⼼点的距离单调增减的.这⼀性质是很重要的,因为边缘是⼀种图像局部特征,如果平滑运算对离算⼦中⼼很远的像素点仍然有很⼤作⽤,则平滑运算会使图像失真. (3)⾼斯函数的傅⽴叶变换频谱是单瓣的.正如下⾯所⽰,这⼀性质是⾼斯函数付⽴叶变换等于⾼斯函数本⾝这⼀事实的直接推论.图像常被不希望的⾼频信号所污染(噪声和细纹理).⽽所希望的图像特征(如边缘),既含有低频分量,⼜含有⾼频分量.⾼斯函数付⽴叶变换的单瓣意味着平滑图像不会被不需要的⾼频信号所污染,同时保留了⼤部分所需信号. (4)⾼斯滤波器宽度(决定着平滑程度)是由参数σ表征的,⽽且σ和平滑程度的关系是⾮常简单的.σ越⼤,⾼斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数σ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(⽋平滑)之间取得折衷. (5)由于⾼斯函数的可分离性,较⼤尺⼨的⾼斯滤波器可以得以有效地实现.⼆维⾼斯函数卷积可以分两步来进⾏,⾸先将图像与⼀维⾼斯函数进⾏卷积,然后将卷积结果与⽅向垂直的相同⼀维⾼斯函数卷积.因此,⼆维⾼斯滤波的计算量随滤波模板宽度成线性增长⽽不是成平⽅增长.4 ⾼斯滤波应⽤ ⾼斯滤波后图像被平滑的程度取决于标准差。
介绍常见的图像处理算法及其应用

介绍常见的图像处理算法及其应用图像处理算法是计算机视觉领域的重要内容,它涵盖了许多不同的技术和方法。
本文将介绍一些常见的图像处理算法及其应用。
这些算法可以用于图像增强、图像分割、目标识别等领域,它们可以帮助我们更好地理解和处理图像数据。
一、图像滤波算法图像滤波是图像处理的基础算法之一,它通过对图像进行平滑处理来去除图像中的噪声或者增强图像的细节。
图像滤波算法有很多种,其中常见的有均值滤波、中值滤波和高斯滤波。
均值滤波是一种简单的滤波算法,它通过计算像素点周围领域像素的平均值来达到平滑图像的效果。
均值滤波对噪声有一定的去除效果,但是对于边缘和细节信息的保存能力较差。
中值滤波是一种非线性滤波算法,它通过对图像中的像素值进行排序,然后选择排序后的中间值作为当前像素的新值。
中值滤波对椒盐噪声有较好的去除效果,并且能够保持图像的边缘信息。
高斯滤波是一种基于高斯函数的线性滤波算法,它通过对图像中的像素进行加权平均来实现平滑效果。
高斯滤波对于去除高斯噪声以及其他类型的噪声都有较好的去除效果。
二、图像分割算法图像分割是将图像划分成具有语义信息的相互独立的区域的过程。
图像分割算法通常根据图像中的灰度值、颜色、纹理等特征将图像进行分割。
常见的图像分割算法有阈值分割、基于区域的分割和基于边缘的分割。
阈值分割是一种简单常用的分割算法,它将图像中的像素根据灰度值与阈值的关系进行分类。
通过调整阈值的大小,可以实现不同程度的图像分割。
基于区域的分割算法是根据像素之间的相似性将图像进行分割,使具有相似性质的像素聚合成为一个区域。
常见的基于区域的分割算法有K-means算法和基于区域的生长算法。
基于边缘的分割算法是根据图像中的边缘信息将图像进行分割。
边缘是图像中颜色、灰度值等发生突变的地方,基于边缘的分割算法通过检测图像中的边缘来实现分割。
三、图像特征提取算法图像特征提取是将图像中的信息转化为计算机可以理解和处理的形式的过程。
图像特征可以是图像的边缘、纹理、颜色等视觉特征,也可以是经过某种数学变换得到的特征。
opencv抗锯齿算法原理

opencv抗锯齿算法原理OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。
其中,抗锯齿算法是一种用于减少图像边缘锯齿的技术。
本文将介绍OpenCV中常用的两种抗锯齿算法:高斯模糊和双边滤波。
1. 高斯模糊高斯模糊是一种常见的图像模糊算法,也是抗锯齿算法中常用的一种。
其原理是通过对图像中的每个像素点进行加权平均,使得周围像素的值对当前像素的影响减小。
这样可以有效地减少图像中的高频噪声,从而达到抗锯齿的效果。
具体来说,高斯模糊算法先将图像中的每个像素点与一个高斯核进行卷积运算,得到一个模糊后的像素值。
高斯核是一个二维的正态分布函数,用来表示每个像素点与周围像素点的权重。
通过调整高斯核的大小和标准差,可以控制模糊的程度。
2. 双边滤波双边滤波是一种基于像素距离和像素值相似性的滤波算法。
与高斯模糊不同的是,双边滤波不仅考虑了像素点的空间位置,还考虑了像素值的相似性。
这样可以保留图像中的边缘信息,同时减少锯齿现象。
具体来说,双边滤波算法通过对图像中的每个像素点与周围像素点进行加权平均,得到一个滤波后的像素值。
权重的计算包括两个方面:空间距离权重和像素值相似性权重。
空间距离权重用来考虑像素点的空间位置关系,像素值相似性权重用来考虑像素点的像素值差异。
通过调整这两个权重的大小,可以控制滤波的效果。
在OpenCV中,可以使用cv2.GaussianBlur函数实现高斯模糊,使用cv2.bilateralFilter函数实现双边滤波。
这两个函数都提供了各种参数选项,可以根据实际需求进行调整。
除了高斯模糊和双边滤波,OpenCV还提供了其他一些抗锯齿算法,如均值迁移算法、频域滤波算法等。
这些算法各有特点和适用场景,可以根据实际需求选择合适的算法。
总结:本文介绍了OpenCV中常用的两种抗锯齿算法:高斯模糊和双边滤波。
高斯模糊通过加权平均来减少图像中的高频噪声,双边滤波通过考虑像素点的空间位置和像素值相似性来保留边缘信息。
双边滤波

双边滤波双边滤波,Bilateral filter。
是一种可以保边去噪的滤波器。
之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。
一个函数是由几何空间距离决定滤波器系数。
另一个由像素差值决定滤波器系数。
双边滤波器的好处是可以做边缘保存edge preserving,一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显的模糊边缘,对于高频细节的保护效果并不明显。
双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。
但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波,因此我们对于双边滤波器进行了改进,由于小波分解可以把信号分解为高频和低频部分,我们对于不同频率段进行不同的滤波。
首先将彩色图像RGB模式转为CIE-LAB模式,然后做一次离散二维小波变换dwt2,对于高频的HH,LH,HL部分我们用Bayes shrink的阈值做了软门限soft thresholding,对于低频部分我们把它再进行分解,然后对高频做小波阈值,对低频采用双边滤波。
这样取得的恢复图像,MSE减少了30%,色差误差ciede2000减少了50%,可证明更适于滤波和人类视觉系统。
原理及实现的问题双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。
之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。
一个函数是由几何空间距离决定滤波器系数。
另一个由像素差值决定滤波器系数。
可以与其相比较的两个filter:高斯低通滤波器(/wiki/Gaussian_filter)和α-截尾均值滤波器(去掉百分率为α的最小值和最大之后剩下像素的均值作为滤波器),后文中将结合公式做详细介绍。
双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,权重系数w(i,j,k,l)取决于定义域核和值域核的乘积同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。
高斯双边滤波算法

高斯双边滤波算法高斯双边滤波算法是一种常用的图像处理算法,通过结合空间域和灰度域信息,能够有效地去除图像噪声,保持图像的边缘信息,同时不引入模糊效果。
在传统的高斯滤波算法中,只考虑了像素之间的空间距离,通过加权平均的方式来去除噪声。
然而,这种方法会造成边缘信息的模糊,因为它无法区分边缘和纹理。
为了解决这个问题,高斯双边滤波算法引入了灰度域距离,通过考虑像素之间的灰度差异,有效地保留了边缘信息。
具体而言,高斯双边滤波算法将每个像素点周围的邻域像素按照空间距离和灰度差异进行加权计算,而不仅仅是根据空间距离。
这样,距离较近且灰度相似的像素点会得到较高的权重,而距离远或灰度差异大的像素点会得到较低的权重。
对于噪声点,由于其与周围像素的灰度差异较大,其权重会被降低,这样就能够抑制噪声。
在实际应用中,高斯双边滤波算法有着广泛的应用。
例如,在图像去噪中,它可以有效地去除高斯噪声、椒盐噪声等,同时保持图像的清晰度和细节。
此外,在计算机视觉和图像处理中,高斯双边滤波算法也用于图像增强、图像分割等领域。
它不仅可以提高图像质量和视觉效果,还可以提高算法的鲁棒性和稳定性。
在使用高斯双边滤波算法时,需要注意一些参数的选择。
首先是空间域标准差和灰度域标准差,它们决定了滤波器的大小和去噪的程度。
通常情况下,较大的标准差可以去除更多的噪声,但同时也会导致一定的模糊效果。
因此,在选择标准差时需要进行权衡。
另外,卷积模板的大小也需要根据图像的大小和去噪要求进行调整。
实践中,可以通过试验和比较不同参数的效果来选择最佳的参数组合。
总之,高斯双边滤波算法是一种强大而有效的图像处理算法。
它通过考虑像素之间的空间距离和灰度差异,能够去除噪声、保持图像边缘信息,有效地增强图像的质量和细节。
在实际应用中,合理选择参数,并结合其他图像处理技术,可以获得更好的图像处理效果。
高斯滤波器和2RC滤波器

第五章高斯滤波器5.1介绍高斯滤波器被广泛应用于表面轮廓分析。
美国标准(美国机械工程师协会2002)和国际标准(国际标准化组织1996)都对它进行了阐述。
高斯滤波器的权重函数(滤波器在时域和空间域的定义)如下:5.1式子中,x是权重函数距离原点的位置,是粗糙度中长波波长的截止频率。
通过对连续函数进行傅里叶变换可以得到函数的传递特性,变化如下:5.2从等式5.2,能够看出该正弦波振幅有衰减,其波长截止波长(λ=λc)是0.5,因此在截止处,滤波器传递了50%。
下面的例子展示了,在给定权重函数下,其高斯滤波器传递曲线的样子。
范例5.1 在给定空间域下,描绘高斯滤波器S。
其中让λc=0.8mm,采样间隔。
下面是MATLAB生成的代码,并且其所描述的图展示在(图5.1 a)。
图5.1 a绘制高斯滤波器;λc=0.8mm,b高斯滤波器传递特性lambdac=0.8 % in mmdx=0.001 % in mmx=(-lambdac:dx:lambdac)’;alpha=0.4697;S=(1/(alpha lambdac)). exp(-pi (x/(alpha lambdac)).^2);% generate the Gaussian filterS=S/sum(S); % normalize to unit sumplot(x,S);xlabel(’Distance (mm)’);ylabel(’Weighting function’);范例5.2 产生高斯滤波器S的振幅传输特性,并且评估正弦波的振幅传输特性,其截止波长(λc=0.8mm)。
高斯滤波器的传递特性能够同样获得,通过借助第四章4.4范例所示的矩形滤波器例程。
传递特性如图5.1b所示。
该正弦波由0.8mm波长组成,其振幅衰减为0.5(Sf的阵列元素有11个)。
因此高斯滤波器在截止频率处,传输量为50%。
注意在图5.1b所示的传递特性中,可以清楚的看到,在其截止频率处有一个坡度过程,并没有直上直下的锋利过渡。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 简介图像平滑是一个重要的操作,而且有多种成熟的算法。
这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪。
Bilateral blur相对于传统的高斯blur来说很重要的一个特性即可可以保持边缘(Edge Perseving),这个特点对于一些图像模糊来说很有用。
一般的高斯模糊在进行采样时主要考虑了像素间的空间距离关系,但是却并没有考虑像素值之间的相似程度,因此这样我们得到的模糊结果通常是整张图片一团模糊。
Bilateral blur的改进就在于在采样时不仅考虑像素在空间距离上的关系,同时加入了像素间的相似程度考虑,因而可以保持原始图像的大体分块进而保持边缘。
在于游戏引擎的post blur算法中,bilateral blur常常被用到,比如对SSAO的降噪。
2. 原理滤波算法中,目标点上的像素值通常是由其所在位置上的周围的一个小局部邻居像素的值所决定。
在2D高斯滤波中的具体实现就是对周围的一定范围内的像素值分别赋以不同的高斯权重值,并在加权平均后得到当前点的最终结果。
而这里的高斯权重因子是利用两个像素之间的空间距离(在图像中为2D)关系来生成。
通过高斯分布的曲线可以发现,离目标像素越近的点对最终结果的贡献越大,反之则越小。
其公式化的描述一般如下所述:其中的c即为基于空间距离的高斯权重,而用来对结果进行单位化。
高斯滤波在低通滤波算法中有不错的表现,但是其却有另外一个问题,那就是只考虑了像素间的空间位置上的关系,因此滤波的结果会丢失边缘的信息。
这里的边缘主要是指图像中主要的不同颜色区域(比如蓝色的天空,黑色的头发等),而Bilateral就是在Gaussian blur中加入了另外的一个权重分部来解决这一问题。
Bilateral滤波中对于边缘的保持通过下述表达式来实现:其中的s为基于像素间相似程度的高斯权重,同样用来对结果进行单位化。
对两者进行结合即可以得到基于空间距离、相似程度综合考量的Bilateral滤波:上式中的单位化分部综合了两种高斯权重于一起而得到,其中的c与s计算可以详细描述如下:且有且有上述给出的表达式均是在空间上的无限积分,而在像素化的图像中当然无法这么做,而且也没必要如此做,因而在使用前需要对其进行离散化。
而且也不需要对于每个局部像素从整张图像上进行加权操作,距离超过一定程度的像素实际上对当前的目标像素影响很小,可以忽略的。
限定局部子区域后的离散化公就可以简化为如下形式:上述理论公式就构成了Bilateral滤波实现的基础。
为了直观地了解高斯滤波与双边滤波的区别,我们可以从下列图示中看出依据。
假设目标源图像为下述左右区域分明的带有噪声的图像(由程序自动生成),蓝色框的中心即为目标像素所在的位置,那么当前像素处所对应的高斯权重与双边权重因子3D可视化后的形状如后边两图所示:左图为原始的噪声图像;中间为高斯采样的权重;右图为Bilateral采样的权重。
从图中可以看出Bilateral加入了相似程度分部以后可以将源图像左侧那些跟当前像素差值过大的点给滤去,这样就很好地保持了边缘。
为了更加形象地观察两者间的区别,使用Matlab将该图在两种不同方式下的高度图3D绘制出来,如下:上述三图从左到右依次为:双边滤波,原始图像,高斯滤波。
从高度图中可以明显看出Bilateral和Gaussian两种方法的区别,前者较好地保持了边缘处的梯度,而在高斯滤波中,由于其在边缘处的变化是线性的,因而就使用连累的梯度呈现出渐变的状态,而这表现在图像中的话就是边界的丢失(图像的示例可见于后述)。
3. 代码实现有了上述理论以后实现Bilateral Filter就比较简单了,其实它也与普通的Gaussian Blur没有太大的区别。
这里主要包括3部分的操作: 基于空间距离的权重因子生成;基于相似度的权重因子的生成;最终filter颜色的计算。
3.1 Spatial Weight这就是通常的Gaussian Blur中使用的计算高斯权重的方法,其主要通过两个pixel之间的距离并使用如下公式计算而来:其中的就表示两个像素间的距离,比如当前像素与其右边紧邻的一个像素之间的距离我们就可以用来计算,也即两个二维向量{0 , 0}以及{0 , 1}之间的欧氏距离。
直接计算一个区域上的高斯权重并单位化后就可以进行高斯模糊了。
3.2 Similarity Weight与基于距离的高斯权重计算类似,只不过此处不再根据两个pixel之间的空间距离,而是根据其相似程度(或者两个pixel的值之间的距离)。
其中的表示两个像素值之间的距离,可以直接使用其灰度值之间的差值或者RGB向量之间的欧氏距离。
3.3 Color Filtering有了上述两部分所必需的权重因子之后,那么具体的双边滤波的实现即与普通的高斯滤波无异。
主要部分代码如下述:[cpp]view plaincopy1.UCHAR3 BBColor(int posX , int posY)2.{3.int centerItemIndex = posY * picWidth4 + posX * 3 , neighbourItemIndex;4.int weightIndex;5.double gsAccumWeight = 0;6.double accumColor = 0;7.8.// 计算各个采样点处的Gaussian权重,包括closeness,similarity9.for(int i = -number ; i <= number ; ++i)10. {11.for(int j = -number ; j <= number ; ++j)12. {13. weightIndex = (i + number) * (number * 2 + 1) + (j + number);14. neighbourItemIndex = min(noiseImageHeight -1 , max(0 , posY + j * radius)) * picWidth4 +15. min(noiseImageWidth -1 , max(0 , posX + i * radius)) * 3;16.17. pCSWeight[weightIndex] = LookupGSWeightTable(pSrcDataBuffer[neighbourItemIndex] , pSrcDataBuffer[centerItemIndex]);18. pCSWeight[weightIndex] = pGSWeight[weightIndex] * pGCWeight[weightIndex];19. gsAccumWeight += pCSWeight[weightIndex];20. }21. }22.23.// 单位化权重因子24. gsAccumWeight = 1 / gsAccumWeight;25.for(int i = -number ; i <= number ; ++i)26. {27.for(int j = -number ; j <= number ; ++j)28. {29. weightIndex = (i + number) * (number * 2 + 1) + (j + number);30. pCSWeight[weightIndex] *= gsAccumWeight;31. }32. }33.34.// 计算最终的颜色并返回35.for(int i = -number ; i <= number ; ++i)36. {37.for(int j = -number ; j <= number ; ++j)38. {39. weightIndex = (i + number) * (number * 2 + 1) + (j + number);40. neighbourItemIndex = min(noiseImageHeight -1 , max(0 , posY + j * radius)) * picWidth4 +41. min(noiseImageWidth -1 , max(0 , posX + i * radius)) * 3;42. accumColor += pSrcDataBuffer[neighbourItemIndex + 0] * pCSWeight[weightIndex];43. }44. }45.46.return UCHAR3(accumColor , accumColor , accumColor);47.}其中的相似度分部的权重s主要根据两个Pixel之间的颜色差值计算面来。
对于灰度图而言,这个差值的范围是可以预知的,即[-255, 255],因而为了提高计算的效率我们可以将该部分权重因子预计算生成并存表,在使用时快速查询即可。
使用上述实现的算法对几张带有噪声的图像进行滤波后的结果如下所示:上图从左到右分别为:双边滤波;原始图像;高斯滤波。
从图片中可以较为明显地看出两种算法的区别,最直观的感受差别就是使用高斯算法后整张图片都是一团模糊的状态;而双边滤波则可以较好地保持原始图像中的区域信息,看起来仍然嘴是嘴、眼是眼(特别是在第一张美女图像上的效果!看来PS 是灰常重要啊~~^o^)。
4. 在SSAO 中的使用在上述实现中的边缘判定函数主要是通过两个像素值之间的差异来决定,这也是我们观察普通图片的一种普遍感知方式。
当然,也可以根据使用的需求情况来使用其它的方式判断其它定义下的边缘,比如使用场景的depth 或是normal 。
比如在对SSAO 进行滤波时可以直接使用Depth 值来行边缘判断。
首先,设置一个深度的阈值,在作边缘检测时比较两点间的depth 差值,如果差值大于阈值,则认为其属于不同的区域,则此处就应为边界。
使用此方法得到的效果可见于下图所示:高斯滤波双边滤波在得到滤波之后的SSAO图像之后,与原始图像进行直接的整合就可以得到最终的渲染效果,如下图所示:SSAO关闭SSAO开启。