opencv学习(二十二)之双边滤波bilateralFilter
来源:互联网 发布:一点通打印软件 编辑:程序博客网 时间:2024/06/11 14:09
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数。
双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,其公式如下:
权重系数w(i,j,k,l)取决于定义域核
和值域核
的乘积,也就是
通俗来讲就是双边滤波模板主要有两个模板生成,第一个是高斯模板,第二个是以灰度级的差值作为函数系数生成的模板,然后这两个模板点乘就得到了最终的双边滤波模板,第一个模板是全局模板,所以只需要生成以西,第二个模板需要对每个像素都计算一次。双边滤波器比高斯滤波器多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素,这样就能对边缘附近的像素值予以保存,但是由于保存过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤除。
opencv中提供了bilateralFilter()函数来实现双边滤波操作,其原型如下:
C++: void 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; } 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);}
程序运行结果如下:
- opencv学习(二十二)之双边滤波bilateralFilter
- OpenCV 双边滤波——bilateralFilter函数
- 用OpenCV的函数bilateralFilter做双边滤波~
- 双边滤波(BilateralFilter)原理
- opencv3.0 函数学习4——bilateralFilter双边滤波
- opencv学习之中值滤波和双边滤波
- Opencv双边滤波器-bilateralFilter函数
- opencv中常用的非线性滤波器--中值滤波medianBlur() 和 双边滤波bilateralFilter()
- opencv学习(二十三)之方框、均值、高斯、中值、双边滤波综合比较
- 学习【OpenCV入门教程之九】 非线性滤波专场:中值滤波、双边滤波---思维导图笔记
- 《PCL点云库学习&VS2010(X64)》Part 7 PCL双边滤波BilateralFilter
- OPENCV入门教程十五:bilateralFilter双边平滑
- Opencv学习:非线性滤波:中值滤波、双边滤波
- OpenCV之九 非线性滤波专场:中值滤波、双边滤波
- OpenCV学习笔记(十)双边滤波
- 双边滤波CUDA优化——BilateralFilter CUDA
- 双边滤波CUDA优化——BilateralFilter CUDA
- 双边滤波bilateralFilter函数的使用示例程序
- win7下安装金典指纹机服务的步骤
- springmvc配置文件配置说明
- 利用D3D抓取显存数据
- MySQL 小结(二)
- PAT乙级1061
- opencv学习(二十二)之双边滤波bilateralFilter
- 样式脚本本地化开发方法①【前端开发技巧】
- easyui-datagrid获取行和列数据
- deskclock
- HDU 1024 MAX SUM PLUS PLUS
- Windows平台下新版blast(2.2.24+)本地化构建+数据库下载+序列间的相似性检索
- gulp玩起来
- Git基础学习
- 二维指针的new和delete