失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 双边滤波与高斯滤波

双边滤波与高斯滤波

时间:2021-02-13 20:27:20

相关推荐

双边滤波与高斯滤波

高斯滤波原理

在数字图像中的高斯噪声主要来源出现在采集期间。由于不良照明或高温引起的传感器噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。高斯噪声就是它的概率密度函数服从高斯分布(即正态分布)的一类噪声。高斯分布公式为:

其中,μ是x的均值,σ是x的标准差。由于每次计算都以当前计算点为原点,所以μ等于0。于是公式进一步简化为:

在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。

计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。σ的大小决定了高斯函数的宽度,如下图所示:

高斯分布的二维方程是:

参考自:/fangyan90617/article/details/100516889

高斯滤波过程

高斯滤波也是一个非常典型的图像卷积例子,本质上,高斯滤波就是将(灰度)图像 和一个高斯核进行卷积操作,具体的方式和上面的两个滤波方法相似,只是卷积核存在差别。理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。在实际的计算过程中,卷积核是固定大小的,只需要将待计算的“中心点”作为原点,将周围的点按照正态分布函数分配权重,计算加权平均值,得到最终的值,这个过程就是二维高斯核的卷积过程。

具体过程如下图所示,假定中心点坐标为(0,0),当设定卷积核为3时,只需计算距离它最近的8个点,如图中的第一个矩阵所示。以此矩阵中的坐标,带入到公式2-14中,并且取σ=1.5,则半径为1的权重矩阵如图中第二个矩阵所示。因为需要利用该权重矩阵做加权平均,故需要对原始的矩阵做归一化。具体操作方式是求出第二个矩阵的总和为0.4783,然后再将该矩阵的9个值分别除以0.4783,得到最终的卷积核(权重矩阵)。

通过上述步骤计算出高斯核,基于该高斯核便可进行高斯滤波操作。假设现有9个像素点,灰度值(0-255)如下图中第一个卷积核所示,计算图中中心点的滤波后的值。每个像素点乘以相对应的权重值,得到最终的分布值。将这9个像素的值相加得到的结果,就是中心位置图像滤波后的值。对所有点重复这个过程,就得到了高斯滤波后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯滤波。

参考自:/qlmx/143.html

高斯滤波目的

1.图像为什么要滤波?

答:a.消除图像在数字化过程中产生或者混入的噪声。

b.提取图片对象的特征作为图像识别的特征模式。

2.滤波器该如何去理解?

答:滤波器可以想象成一个包含加权系数的窗口或者说一个镜片,当使用滤波器去平滑处理图像的时候,就是把通过这个窗口或者镜片去看这个图像。

参考自:/p/73e6ccbd8f3f

双边滤波原理

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:

一个函数由像素欧式距离决定滤波器模板的系数另一个函数由像素的灰度差值决定滤波器的系数

双边滤波其实很简单,它只是比高斯滤波多了一种掩膜而已。两种掩膜都是套用高斯分布公式得出来的,只是其中的代表的含义不同而已。求第一个掩膜所用的高斯分布中,代表掩膜中每一个点的位置,其中为掩膜中心的位置;求第二个掩膜所用的高斯分布中,代表掩膜中每一个点的像素亮度值,其中为掩膜中心的像素亮度值;(这里有一个是需要注意的:第二个掩膜是需要每次都求取的,因为像素的亮度值无法预先确定,不是维持一个固定不变的pattern)。对于高斯滤波,仅用空间距离的权值系数核与图像卷积后,确定中心点的灰度值。即认为离中心点越近的点,其权重系数越大。双边滤波中加入了对灰度信息的权重,即在邻域内,灰度值越接近中心点灰度值的点的权重更大,灰度值相差大的点权重越小。此权重大小,则由值域高斯函数确定。两者权重系数相乘,得到最终的卷积模板。由于双边滤波需要每个中心点邻域的灰度信息来确定其系数,所以其速度与比一般的滤波慢很多,而且计算量增长速度为核大小的平方。这就是双边滤波,不光考虑了像素在空间中位置远近程度的影响,还考虑了像素亮度相近程度的影响。

双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,

接下来我们来讨论最关键的w(i, j, k, l)

ws为空间临近高斯函数,wr为像素值相似度高斯函数

可以看到,w是ws和wr的乘积。对于ws来说,这就是普通的高斯滤波函数,其代入的坐标,sigmas是程序输入值,该函数是在空间临近度上计算的。而wr是计算像素值相似度(颜色空间),注意,这就是高斯函数代入坐标值,2sigmar^2的上方是范数,在这里的值为 |f(i,j)-f(k,l)|^2。也就是两个点像素值差值的绝对值的平方。双边滤波器的加权系数是这两部分因子的非线性组合,空间邻近度因子Ws和亮度相似度因子Wr的乘积。前者随着像素点与中心点之间欧几里德距离的增加而减小,后者随着两像素亮度值之差的增大而减小。在图像变化平缓的区域,邻域内像素亮度值相差不大,双边滤波转化为高斯低通滤波器;在图像变化剧烈的区域,滤波器利用边缘点附近亮度值相近的像素点的亮度值平均代替原亮度值。因此,双边滤波器既平滑滤波了图像,又保持了图像的边缘。双边滤波器受3个参数的控制:滤波器半宽N、参数δs和δr。N越大,平滑作用越强;δs和δr分别控制着空间邻近度因子Ws和亮度像似度因子Wr的衰减程度。

参数选择:

空间域sigma选取:其中核大小通常为sigma的6*sigma + 1。因为离中心点3*sigma大小之外的系数与中点的系数只比非常小,可以认为此之外的点与中心点没有任何联系,及权重系数为0.OpenCV中默认的计算公式也是如此,OpenCV参考文档内容如下:“对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,n=param2对应垂直核.”

值域sigma选取:另灰度差△g = abs(gray(xi,yi)- gray(xc,yc)),忽略常数的影响,因此其函数可以简化为:

已知 0≤△g≤255;

1)假设sigma = 255,当△g = 255时,系数为exp(-1) = 0.3679,当△g = 0时,系数为exp(-0)= 1.灰度最大点的系数与相差最小的灰度值系数之比为 0.3679.

2)假设sigma = 122.5,当△g = 255时,系数为exp(-4) = 0.0183,当△g = 0时,系数为exp(-0)= 1.灰度差最大点的系数与相差最小的灰度值系数之比为 0.0183.

结论

当simga较大时,灰度差最大值与最小值的系数在很小的一个范围之内,其比值较大。及灰度差较大的点,对于中心点也会有相应的较大的权值,此与双边滤波的保留边缘的初衷相违背。

当sigma较小时,灰度差最大值与最小值的系数在较大的一个范围之内,其比值很小,及灰度差较大的点,对应中心点仅有很小的权重。

综上分析可知:

Sigma越大,边缘越模糊,极限情况为simga无穷大,值域系数近似相等(忽略常数时,将近为exp(0)= 1),与高斯模板(空间域模板)相乘后可认为等效于高斯滤波。

Sigma越小,边缘越清晰,极限情况为simga无限接近0,值域系数近似相等(接近exp(-∞) = 0),与高斯模板(空间域模板)相乘后,可近似为系数皆相等,等效于源图像。

代码实现

摘自:https://qianmo./article/details/23184547

//-----------------------------------【程序说明】----------------------------------------------// 程序名称::《【OpenCV入门教程之九】非线性滤波专场:中值滤波、双边滤波 》 博文配套源码// 开发所用IDE版本:Visual Studio //开发所用OpenCV版本: 2.4.8// 4月8日 Create by 浅墨//------------------------------------------------------------------------------------------------//-----------------------------------【头文件包含部分】---------------------------------------// 描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include <opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>#include <iostream>//-----------------------------------【命名空间声明部分】---------------------------------------// 描述:包含程序所使用的命名空间//----------------------------------------------------------------------------------------------- using namespace std;using namespace cv;//-----------------------------------【全局变量声明部分】--------------------------------------// 描述:全局变量声明//-----------------------------------------------------------------------------------------------Mat g_srcImage,g_dstImage1,g_dstImage2,g_dstImage3,g_dstImage4,g_dstImage5;int g_nBoxFilterValue=6; //方框滤波内核值int g_nMeanBlurValue=10; //均值滤波内核值int g_nGaussianBlurValue=6; //高斯滤波内核值int g_nMedianBlurValue=10; //中值滤波参数值int g_nBilateralFilterValue=10; //双边滤波参数值//-----------------------------------【全局函数声明部分】--------------------------------------// 描述:全局函数声明//-----------------------------------------------------------------------------------------------//轨迹条回调函数static void on_BoxFilter(int, void *); //方框滤波static void on_MeanBlur(int, void *); //均值块滤波器static void on_GaussianBlur(int, void *);//高斯滤波器static void on_MedianBlur(int, void *);//中值滤波器static void on_BilateralFilter(int, void*);//双边滤波器//-----------------------------------【main( )函数】--------------------------------------------// 描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){system("color 5E"); //载入原图g_srcImage= imread( "1.jpg", 1 );if(!g_srcImage.data ) { printf("Oh,no,读取srcImage错误~!\n"); return false; }//克隆原图到四个Mat类型中g_dstImage1= g_srcImage.clone( );g_dstImage2= g_srcImage.clone( );g_dstImage3= g_srcImage.clone( );g_dstImage4= g_srcImage.clone( );g_dstImage5= g_srcImage.clone( );//显示原图namedWindow("【<0>原图窗口】", 1);imshow("【<0>原图窗口】",g_srcImage);//=================【<1>方框滤波】=========================//创建窗口namedWindow("【<1>方框滤波】", 1);//创建轨迹条createTrackbar("内核值:", "【<1>方框滤波】",&g_nBoxFilterValue, 50,on_BoxFilter );on_MeanBlur(g_nBoxFilterValue,0);imshow("【<1>方框滤波】", g_dstImage1);//=====================================================//=================【<2>均值滤波】==========================//创建窗口namedWindow("【<2>均值滤波】", 1);//创建轨迹条createTrackbar("内核值:", "【<2>均值滤波】",&g_nMeanBlurValue, 50,on_MeanBlur );on_MeanBlur(g_nMeanBlurValue,0);//======================================================//=================【<3>高斯滤波】===========================//创建窗口namedWindow("【<3>高斯滤波】", 1);//创建轨迹条createTrackbar("内核值:", "【<3>高斯滤波】",&g_nGaussianBlurValue, 50,on_GaussianBlur );on_GaussianBlur(g_nGaussianBlurValue,0);//=======================================================//=================【<4>中值滤波】===========================//创建窗口namedWindow("【<4>中值滤波】", 1);//创建轨迹条createTrackbar("参数值:", "【<4>中值滤波】",&g_nMedianBlurValue, 50,on_MedianBlur );on_MedianBlur(g_nMedianBlurValue,0);//=======================================================//=================【<5>双边滤波】===========================//创建窗口namedWindow("【<5>双边滤波】", 1);//创建轨迹条createTrackbar("参数值:", "【<5>双边滤波】",&g_nBilateralFilterValue, 50,on_BilateralFilter);on_BilateralFilter(g_nBilateralFilterValue,0);//=======================================================//输出一些帮助信息cout<<endl<<"\t嗯。好了,请调整滚动条观察图像效果~\n\n"<<"\t按下“q”键时,程序退出~!\n"<<"\n\n\t\t\t\tby浅墨";while(char(waitKey(1))!= 'q') {}return 0;}//-----------------------------【on_BoxFilter( )函数】------------------------------------// 描述:方框滤波操作的回调函数//-----------------------------------------------------------------------------------------------static void on_BoxFilter(int, void *){//方框滤波操作boxFilter(g_srcImage, g_dstImage1, -1,Size( g_nBoxFilterValue+1, g_nBoxFilterValue+1));//显示窗口imshow("【<1>方框滤波】", g_dstImage1);}//-----------------------------【on_MeanBlur( )函数】------------------------------------// 描述:均值滤波操作的回调函数//-----------------------------------------------------------------------------------------------static void on_MeanBlur(int, void *){blur(g_srcImage, g_dstImage2, Size( g_nMeanBlurValue+1, g_nMeanBlurValue+1),Point(-1,-1));imshow("【<2>均值滤波】", g_dstImage2);}//-----------------------------【on_GaussianBlur( )函数】------------------------------------// 描述:高斯滤波操作的回调函数//-----------------------------------------------------------------------------------------------static void on_GaussianBlur(int, void *){GaussianBlur(g_srcImage, g_dstImage3, Size( g_nGaussianBlurValue*2+1,g_nGaussianBlurValue*2+1 ), 0, 0);imshow("【<3>高斯滤波】", g_dstImage3);}//-----------------------------【on_MedianBlur( )函数】------------------------------------// 描述:中值滤波操作的回调函数//-----------------------------------------------------------------------------------------------static void on_MedianBlur(int, void *){medianBlur( g_srcImage, g_dstImage4, g_nMedianBlurValue*2+1 );imshow("【<4>中值滤波】", g_dstImage4);}//-----------------------------【on_BilateralFilter( )函数】------------------------------------// 描述:双边滤波操作的回调函数//-----------------------------------------------------------------------------------------------static void on_BilateralFilter(int, void *){bilateralFilter( g_srcImage, g_dstImage5, g_nBilateralFilterValue, g_nBilateralFilterValue*2,g_nBilateralFilterValue/2 );imshow("【<5>双边滤波】", g_dstImage5);}

/abcjennifer/article/details/7616663

/walccott/p/4957108.html

/Jfuck/article/details/8932978

如果觉得《双边滤波与高斯滤波》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。