服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 浅析bilateral filter双边滤波器的理解

浅析bilateral filter双边滤波器的理解

2021-10-26 13:27pan_jinquan C/C++

这篇文章主要介绍了bilateral filter双边滤波器的通俗理解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

浅析bilateral filter双边滤波器的理解浅析bilateral filter双边滤波器的理解浅析bilateral filter双边滤波器的理解图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等。但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显。相比较而言,bilateral filter双边滤波器可以很好的边缘保护,即可以在去噪的同时,保护图像的边缘特性。双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度像素值相似度的一种折衷处理,同时考虑空域信息灰度相似性,达到保边去噪的目的(不理解这几个概念没关系,后面会慢慢解释)。


1. 双边滤波(Bilateral filter)的原理

双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:空间域核和值域核

(1)空间域核:由像素位置欧式距离决定的模板权值浅析bilateral filter双边滤波器的理解

浅析bilateral filter双边滤波器的理解

浅析bilateral filter双边滤波器的理解为模板窗口的其他系数的坐标;其中浅析bilateral filter双边滤波器的理解

为模板窗口的中心坐标点;浅析bilateral filter双边滤波器的理解浅析bilateral filter双边滤波器的理解

为高斯函数的标准差。 使用该公式生成的滤波器模板和高斯滤波器使用的模板是没有区别的。

在一些博客和教程里,这个权值浅析bilateral filter双边滤波器的理解称为定义域核,也称为空间系数,或空间域(spatial domain S)。显示由浅析bilateral filter双边滤波器的理解的计算公式可知,它是计算临近点浅析bilateral filter双边滤波器的理解到中心点浅析bilateral filter双边滤波器的理解临近程度,因此定义域核浅析bilateral filter双边滤波器的理解是用于衡量空间临近的程度。

(2)值域核:由像素值的差值决定的模板权值浅析bilateral filter双边滤波器的理解

浅析bilateral filter双边滤波器的理解

其中,浅析bilateral filter双边滤波器的理解为模板窗口的其他系数的坐标,浅析bilateral filter双边滤波器的理解表示图像在点浅析bilateral filter双边滤波器的理解处的像素值;浅析bilateral filter双边滤波器的理解为模板窗口的中心坐标点,对应的像素值为浅析bilateral filter双边滤波器的理解浅析bilateral filter双边滤波器的理解浅析bilateral filter双边滤波器的理解为高斯函数的标准差。

一般将权值浅析bilateral filter双边滤波器的理解称为值域核,像素值域(range domain R),不管是值域核浅析bilateral filter双边滤波器的理解还是空间域核浅析bilateral filter双边滤波器的理解,其大小都在[0 1]之间

(3)将上述两个模板相乘就得到了双边滤波器的模板权值:

浅析bilateral filter双边滤波器的理解

因此,双边滤波器的数据公式可以表示如下:

浅析bilateral filter双边滤波器的理解

2. 双边滤波(Bilateral filter)理解

双边滤波(Bilateral filter)其综合了高斯滤波器(Gaussian Filter)和α-截尾均值滤波器(Alpha-Trimmed mean Filter)的特点,同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。高斯滤波器只考虑像素间的欧式距离,其使用的模板系数随着和窗口中心的距离增大而减小;α-截尾均值滤波器则只考虑了像素灰度值之间的差值,去掉α%的最小值和最大值后再计算均值。

2.1 空域权重浅析bilateral filter双边滤波器的理解和值域权重浅析bilateral filter双边滤波器的理解的意义:

空域权重浅析bilateral filter双边滤波器的理解衡量的是 浅析bilateral filter双边滤波器的理解两点之间的距离,距离越远权重越低;

值域权重浅析bilateral filter双边滤波器的理解衡量的是浅析bilateral filter双边滤波器的理解两点之间的像素值相似程度,越相似权重越大

这里从图像的平坦区域边缘区域定性分析双边滤波的降噪效果

  • 在平坦区域,临近像素的像素值的差值较小,对应值域权重浅析bilateral filter双边滤波器的理解接近于1,此时空域权重浅析bilateral filter双边滤波器的理解起主要作用,相当于直接对此区域进行高斯模糊。因此,平坦区域相当于进行高斯模糊。
  • 在边缘区域,临近像素的像素值的差值较大,对应值域权重浅析bilateral filter双边滤波器的理解接近于0,导致此处核函数下降(因浅析bilateral filter双边滤波器的理解),当前像素受到的影响就越小,从而保持了原始图像的边缘的细节信息。

3. Opencv双边滤波函数:

opencv中提供了bilateralFilter()函数来实现双边滤波操作,其原型如下:

void cv::bilateralFilter(InputArray src,
OutputArray 	dst,
int 	d,
double 	sigmaColor,
double 	sigmaSpace,
int 	borderType = BORDER_DEFAULT 
)		

InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。

  • OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
  • int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
  • double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 (这个参数可以理解为值域核浅析bilateral filter双边滤波器的理解浅析bilateral filter双边滤波器的理解
  • double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace. (这个参数可以理解为空间域核浅析bilateral filter双边滤波器的理解浅析bilateral filter双边滤波器的理解
  • int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。
对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通。

示例代码:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
 
using namespace std;
using namespace cv;
 
//定义全局变量
const int g_ndMaxValue = 100;
const int g_nsigmaColorMaxValue = 200;
const int g_nsigmaSpaceMaxValue = 200;
int g_ndValue;
int g_nsigmaColorValue;
int g_nsigmaSpaceValue;
 
Mat g_srcImage;
Mat g_dstImage;
 
//定义回调函数
void on_bilateralFilterTrackbar(int, void*);
 
int main()
{
 g_srcImage = imread("lena.jpg");
 
 //判断图像是否加载成功
 if(g_srcImage.empty())
 {
 cout << "图像加载失败!" << endl;
 return -1;
 }
 else
 cout << "图像加载成功!" << endl << endl;
 
 namedWindow("原图像", WINDOW_AUTOSIZE);
 imshow("原图像", g_srcImage);
 
 //定义输出图像窗口属性和轨迹条属性
 namedWindow("双边滤波图像", WINDOW_AUTOSIZE);
 g_ndValue = 10;
 g_nsigmaColorValue = 10;
 g_nsigmaSpaceValue = 10;
 
 char dName[20];
 sprintf(dName, "邻域直径 %d", g_ndMaxValue);
 
 char sigmaColorName[20];
 sprintf(sigmaColorName, "sigmaColor %d", g_nsigmaColorMaxValue);
 
 char sigmaSpaceName[20];
 sprintf(sigmaSpaceName, "sigmaSpace %d", g_nsigmaSpaceMaxValue);
 
 //创建轨迹条
 createTrackbar(dName, "双边滤波图像", &g_ndValue, g_ndMaxValue, on_bilateralFilterTrackbar);
 on_bilateralFilterTrackbar(g_ndValue, 0);
 
 createTrackbar(sigmaColorName, "双边滤波图像", &g_nsigmaColorValue,
   g_nsigmaColorMaxValue, on_bilateralFilterTrackbar);
 on_bilateralFilterTrackbar(g_nsigmaColorValue, 0);
 
 createTrackbar(sigmaSpaceName, "双边滤波图像", &g_nsigmaSpaceValue,
   g_nsigmaSpaceMaxValue, on_bilateralFilterTrackbar);
 on_bilateralFilterTrackbar(g_nsigmaSpaceValue, 0);
 
 waitKey(0);
 
 return 0;
}
 
void on_bilateralFilterTrackbar(int, void*)
{
 bilateralFilter(g_srcImage, g_dstImage, g_ndValue, g_nsigmaColorValue, g_nsigmaSpaceValue);
 imshow("双边滤波图像", g_dstImage);
}

浅析bilateral filter双边滤波器的理解

【尊重原创,转载请注明出处】:https://blog.csdn.net/guyuealian/article/details/82660826

参考资料:

【1】https://www.cnblogs.com/wangguchangqing/p/6416401.html

【2】https://blog.csdn.net/MoFMan/article/details/77482794

到此这篇关于bilateral filter双边滤波器的通俗理解的文章就介绍到这了,更多相关bilateral filter双边滤波器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

延伸 · 阅读

精彩推荐
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12