双边滤波与高斯滤波

高斯滤波原理

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

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

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

高斯分布的二维方程是:

参考自:https://blog.csdn.net/fangyan90617/article/details/100516889

高斯滤波过程

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

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

高斯滤波原理及python实现

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

高斯滤波原理及python实现

参考自:https://www.growai.cn/qlmx/143.html

高斯滤波目的

1.图像为什么要滤波?
答:a.消除图像在数字化过程中产生或者混入的噪声。
b.提取图片对象的特征作为图像识别的特征模式。
2.滤波器该如何去理解?
答:滤波器可以想象成一个包含加权系数的窗口或者说一个镜片,当使用滤波器去平滑处理图像的时候,就是把通过这个窗口或者镜片去看这个图像。
参考自:https://www.jianshu.com/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.blog.csdn.net/article/details/23184547

//-----------------------------------【程序说明】----------------------------------------------
//            程序名称::《【OpenCV入门教程之九】非线性滤波专场:中值滤波、双边滤波  》 博文配套源码
//            开发所用IDE版本:Visual Studio 2010
//          开发所用OpenCV版本: 2.4.8
//            2014年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);
}

https://blog.csdn.net/abcjennifer/article/details/7616663

https://www.cnblogs.com/walccott/p/4957108.html

https://blog.csdn.net/Jfuck/article/details/8932978


  • 28
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: matlab中的双边滤波器是一种有效的滤波方法,该方法可以处理高斯噪声,在保持图像细节的同时降低噪声的影响。 双边滤波器的原理是基于像素的空间距离和灰度值的相似性来进行滤波。其滤波结果是通过对每个像素周围的邻域进行加权平均得到的。 在matlab中,可以使用"bilateralFilter"函数来实现双边滤波处理。该函数具有以下语法格式:outputImage = bilateralFilter(inputImage, sigma_d, sigma_r)。 其中,inputImage是待处理的图像,sigma_d是控制空间距离权重的参数,sigma_r是控制灰度值相似性权重的参数。较大的sigma_d和sigma_r值会降低滤波效果,而较小的值会增加滤波效果。 在实际应用中,可以根据具体情况调整sigma_d和sigma_r的值,以及进行多次滤波来获得更好的滤波效果。双边滤波器可以有效地降低高斯噪声的影响,并保持图像的细节信息,使图像更加清晰。 ### 回答2: Matlab中的双边滤波算法可以用来处理高斯噪声。双边滤波是一种非线性的滤波方法,它可以在保持图像边缘信息的同时,降低图像中的噪声。 在Matlab中,可以使用built-in函数"imbilatfilt"实现双边滤波。该函数采用图像和滤波器参数作为输入,返回经过双边滤波处理后的图像。 首先,我们需要将图像载入到Matlab中。可以使用"imread"函数来读取图像文件,如下所示: image = imread('image.jpg'); 接下来,我们可以调用"imbilatfilt"函数进行双边滤波处理。该函数有几个可选参数,其中最重要的是滤波器半径和滤波器的标准差。这些参数可以根据具体情况进行调整。 filtered_image = imbilatfilt(image, 'Radius', radius_value, 'FilterSize', filter_size_value, 'SigmaColor', sigma_color_value, 'SigmaSpace', sigma_space_value); 其中,'Radius'参数表示滤波器的半径大小;'FilterSize'参数表示滤波器的大小;'SigmaColor'参数表示滤波器在颜色空间中的标准差;'SigmaSpace'参数表示滤波器在距离空间中的标准差。 经过双边滤波处理后,可以将图像显示出来,以便观察效果: imshow(filtered_image); 通过调整滤波器参数,可以得到不同强度和质量的双边滤波结果。通常情况下,合适的滤波器半径和标准差可以有效地减小高斯噪声并保持图像细节。 在实际应用中,可以通过尝试不同的滤波器参数值,以及与其他滤波方法的组合,来获得更好的图像滤波效果。 ### 回答3: 双边滤波是一种常用于去除高斯噪声的图像处理方法。在MATLAB中,可以使用双边滤波函数对图像进行处理。 双边滤波是一种非线性的滤波方法,它不仅考虑了空间域的相似性,还考虑了像素的灰度差异。这样可以在去除噪声的同时保留图像的细节信息。 在MATLAB中,可以使用bilateralFilter函数进行双边滤波处理。该函数需要输入原始图像和相应的参数,如滤波器的半径和颜色空间的标准差。 例如,假设我们有一个带有高斯噪声的灰度图像img,我们可以使用以下代码进行双边滤波处理: ```matlab % 添加高斯噪声 noisy_img = imnoise(img, 'gaussian', 0, 0.02); % 设置滤波器参数 radius = 3; % 滤波器半径 sigma = 1.5; % 颜色空间标准差 % 双边滤波处理 filtered_img = bilateralFilter(noisy_img, radius, sigma); % 显示结果 figure; subplot(1, 2, 1); imshow(noisy_img); title('带有高斯噪声的图像'); subplot(1, 2, 2); imshow(filtered_img); title('双边滤波处理后的图像'); ``` 以上代码中,首先使用imnoise函数给原始图像添加高斯噪声,并生成一个带有噪声的图像noisy_img。然后,设置滤波器的半径和颜色空间的标准差。最后,使用bilateralFilter函数对带有噪声的图像进行双边滤波处理,得到处理后的图像filtered_img。最后,通过subplot和imshow函数将原始图像和处理后的图像进行对比显示。 通过双边滤波处理,可以有效地去除高斯噪声,并保留图像的细节信息,使图像更清晰和自然。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值