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

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

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

(1)空间域核:由像素位置欧式距离决定的模板权值

为模板窗口的其他系数的坐标;其中

为模板窗口的中心坐标点;

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

在一些博客和教程里,这个权值

称为定义域核,也称为空间系数,或空间域(spatial domain S)。显示由

的计算公式可知,它是计算临近点

到中心点

临近程度,因此定义域核

是用于衡量空间临近的程度。

(2)值域核:由像素值的差值决定的模板权值

其中,

为模板窗口的其他系数的坐标,

表示图像在点

处的像素值;

为模板窗口的中心坐标点,对应的像素值为

为高斯函数的标准差。

一般将权值

称为值域核,或像素值域(range domain R),不管是值域核

还是空间域核

,其大小都在[0 1]之间

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

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

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

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

2.1 空域权重

和值域权重

的意义:

空域权重

衡量的是

两点之间的距离,距离越远权重越低;

值域权重

衡量的是

两点之间的像素值相似程度,越相似权重越大

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

在平坦区域,临近像素的像素值的差值较小,对应值域权重

接近于1,此时空域权重

起主要作用,相当于直接对此区域进行高斯模糊。因此,平坦区域相当于进行高斯模糊。

在边缘区域,临近像素的像素值的差值较大,对应值域权重

接近于0,导致此处核函数下降(因

),当前像素受到的影响就越小,从而保持了原始图像的边缘的细节信息。

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值,这个参数的值月大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 (这个参数可以理解为值域核

)

double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace. (这个参数可以理解为空间域核

)

int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。

对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通。

示例代码:

#include

#include

#include

#include

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);

}

【尊重原创,转载请注明出处】: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语言双边滤波算法,浅析bilateral filter双边滤波器的理解相关推荐

  1. 双边滤波(bilateral filter)以及联合双边滤波(joint bilateral filter)

    文章目录 双边滤波 理论公式 代码(C++) 数学辅助理解 联合双边滤波(joint bilateral filter) 参考链接 写在最后 双边滤波 自用备忘,若侵则删. 理论公式 利用二维高斯函数 ...

  2. 图像处理:双边滤波算法

    今天主要是回顾一下双边滤波,我曾经在这篇--图像处理:推导五种滤波算法中推导过它,其中包含了我自己写的草稿图. 目录 双边滤波算法原理 (1)空间域核 (2)值域核 理解双边滤波 空域权重​编辑和值域 ...

  3. 【机器视觉学习笔记】双边滤波算法(C++)

    目录 源码 滤波器 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自双边滤波(bilateral fil ...

  4. c语言双边滤波算法,快速双边滤波 附完整C代码

    很早之前写过<双边滤波算法的简易实现bilateralFilter>. 当时学习参考的代码来自cuda的样例. 相关代码可以参阅: https://github.com/johng12/c ...

  5. Bilateral Filters(双边滤波算法)原理及实现(一)

    双边滤波算法原理 双边滤波是一种非线性滤波器,它可以达到保持边缘.降噪平滑的效果.和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高 ...

  6. python:实现Bilateral Filter双边滤波器算法(附完整源码)

    python:实现Bilateral Filter双边滤波器算法 import math import sys import cv2 import numpy as np def vec_gaussi ...

  7. Bilateral Filters(双边滤波算法)的超简单原理,学不会你打我。

    摘要: 双边滤波(Bilateral Filters)是非常常用的一种滤波,它可以达到保持边缘.降噪平滑的效果.和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像 ...

  8. bilateral filter双边滤波器的通俗理解

    bilateral filter双边滤波器的通俗理解 图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等.但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显.相比较而言,bila ...

  9. java 滤波算法_双边滤波算法

    1.原理 高斯滤波是以距离为权重,设计滤波模板作为滤波系数,只考虑了像素间的空间位置上的关系,因此滤波的结果会丢失边缘的信息. 高斯滤波的缺陷如下图所示:平坦区域正常滤波,图像细节没有变化,而在突变的 ...

最新文章

  1. tensor和模型 保存与加载 PyTorch
  2. linux 内核头文件 linux kernel header
  3. Spring SpEL表达式
  4. nasm汇编:段的申明、$$、$
  5. scrollwidth ,clientwidth ,offsetwidth 三者的区别
  6. Python熊猫– GroupBy
  7. python 性能测试_python 写一个性能测试工具(一)
  8. e0266 cout 不明确_荐书 | 不正义的时代,识别不正义的多重面孔
  9. day14 Python函数
  10. UML--实现图(组件图、配置图)
  11. CCNode作为容器实现显示区域剪裁
  12. 无线通讯射频测试软件,ISIS射频工具(专业射频测试软件)V2.03 正式版
  13. Louvain 算法原理 及设计实现
  14. 【5年Android从零复盘系列之三十四】Android存储(9):腾讯MMKV 高性能键值存储组件详解
  15. 硬盘IDE和AHCI模式的区别
  16. 惯性系统常用坐标系_惯性技术常用坐标系
  17. kotlin 如何输入箭头符号->
  18. ThingsBoard-Windows安装(包括zip方式和源码方式)
  19. uboot usb设备驱动
  20. 让一切都停下来——Unschedule

热门文章

  1. 游戏辅助原理与制作02-植物大战僵尸01-阳光基址
  2. vue过滤器如何使用
  3. 期货价格和点价(期货 点价)
  4. 菜鸡自学 Python 笔记(二)
  5. 树冠点云投影面积计算(AlphaShape算法)
  6. 蓝牙是局域物联网最佳方案?「桂花网」获千万美元B+轮融资
  7. 赵丽5500 第二节课
  8. mysql_08_ yum(dnf)安装
  9. 安装mgltools报错:Error:Error in action ExecuteScript……
  10. 看透设计模式-实践与总结