bilateral filter双边滤波器的通俗理解
bilateral filter双边滤波器的通俗理解
图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等。但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显。相比较而言,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 <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;}elsecout << "图像加载成功!" << 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双边滤波器的通俗理解相关推荐
- c语言双边滤波算法,浅析bilateral filter双边滤波器的理解
图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等.但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显.相比较而言,bilateral filter双边滤波器可以很好的边缘保护, ...
- python:实现Bilateral Filter双边滤波器算法(附完整源码)
python:实现Bilateral Filter双边滤波器算法 import math import sys import cv2 import numpy as np def vec_gaussi ...
- Bilateral Filter双边滤波器
双边滤波器是一种边缘保护的非线性滤波器. 1.像高斯滤波器一样,它的权值取决于到中心像素的空间距离 原理:附近的像素(在空间中)应该比远处的像素有更大的影响 高斯滤波器:距离中心像素i (x, y)的 ...
- 联合双边滤波器(joint bilateral filter)
原文地址: 联合双边滤波器(joint bilateral filter) 作者: pplong 前面介绍了双边滤波器(bilateral filter,LBF),然而BF的权值是不稳定的,因此在边缘 ...
- OpenCV图像处理学习九,双边滤波器 (Bilateral Filter)和中位数滤波器 (Median Filter)
均值模糊无法克服边缘像素信息丢失缺陷,原因是均值滤波是基于平均权重,赋予图像内的像素与图像边缘像素一样的比值权重,图像处理是会使得边缘部分图像部分像素信息丢失: 高斯模糊部分克服了该缺陷,但是无法完全 ...
- 交叉双边滤波器 cross bilateral filter
首先强调一下,cross bilateral filter 也就是 joint bilateral filter.仅有几篇论文用cross bilateral filter来表示这种滤波技术. 与双边 ...
- 三种经典图像滤波方法介绍——双边滤波(Bilateral filter)、导向滤波(Guided Fliter)、滚动导向滤波(RollingGuidedFilter)
文章目录 一.前言 二.双边滤波(Bilateral filter) 2.1 双边滤波的理论介绍及公式推导 2.2 双边滤波的matlab程序实现 三.导向滤波(Guided Fliter) 3.1 ...
- 双边滤波(bilateral filter)以及联合双边滤波(joint bilateral filter)
文章目录 双边滤波 理论公式 代码(C++) 数学辅助理解 联合双边滤波(joint bilateral filter) 参考链接 写在最后 双边滤波 自用备忘,若侵则删. 理论公式 利用二维高斯函数 ...
- 双边滤波(Bilateral filter)
双边滤波器(Bilateral filter)是一种可以保边去噪的滤波器.可以滤除图像数据中的噪声,且还会保留住图像的边缘.纹理等(因噪声是高频信号,边缘.纹理也是高频信息,高斯滤波会在滤除噪声的同时 ...
最新文章
- UI设计培训:UI设计师离不开的基本版式设计
- 使用docker搭建一个elasticsearch(5.4)的基础环境
- 【多线程】Java线程面试题 Top 50(转载)
- 虚拟机磁盘模式的转换
- TextBox和DataGridView控件的事件发生顺序
- 作者:胡卫生,博士,上海交通大学教授、博士生导师。
- 《十天学会单片机和C语言编程》
- 高通CEO:已向美国申请向华为出售芯片 但尚未有回应
- 微型计算机原理与接口电子教案,《微型计算机原理与接口技术》电子教案研讨.ppt...
- shell中shift作用
- 月经贴:当落魄的.NET基佬遇上不可一世的JAVA派 developer
- 最大流问题(超详细!!!)
- 二分类图片标签从0-1改为0-255——将图片位深度从1改为8
- 【【运维】9个网络故障排除经典案例,你都得会吗?】
- uipath sequence传递参数_湘西单向滑动球铰支座设计参数深化,期待合作
- js判断android手机浏览器,【笔记】js判断移动端系统及浏览器
- jdk几个好用的性能调优工具
- hmmer 使用(转载)
- 更新或卸载VisualSVN时出现0x8004401e错误,或完全卸载VisualSVN
- php 直接调用ffmpeg 中加水印,如何使用ffmpeg在视频中心添加透明水印?