双边滤波--OpenCV实现
来源:互联网 发布:红色法拉利 知乎 编辑:程序博客网 时间:2024/05/22 18:51
双边滤波器的定义双边滤波,Bilateral filter。是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。 双边滤波器的好处是可以做边缘保存edge preserving,一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显的模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。 但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波,因此我们对于双边滤波器进行了改进,由于小波分解可以把信号分解为高频和低频部分,我们对于不同频率段进行不同的滤波。首先将彩色图像RGB模式转为CIE-LAB模式,然后做一次离散二维小波变换dwt2,对于高频的HH,LH,HL部分我们用Bayes shrink的阈值做了软门限soft thresholding,对于低频部分我们把它再进行分解,然后对高频做小波阈值,对低频采用双边滤波。
一,原理
双边滤波和各项异性扩散滤波有点类似,经常把他们俩放在一起讨论。
通俗点说,就是用一个mask, mask中心点(OpenCV中叫anchor)对准当前要处理的点,双边滤波不仅要把当前点与mask覆盖点的值产生关系,还要与mask中点与当前点的距离产生关系,二者关系乘积作为mask权值,然后然后把mask覆盖的像素值和权值相乘,加在一起然后除以权值之和。
具体的公式请参考大神妹子博客,要想深究原理去看作者paper吧!
二,代码
- #include <opencv2\core\core.hpp>
- ///**********************************************
- //*by 垚
- //*Windows7 +Visual studio 2010
- //*功能 -- 双边滤波
- //*input_img -- 【输入】
- //*output_img -- 【输出】
- //*sigmaR -- 【输入】拉普拉斯方差
- //*sigmaS -- 【输入】高斯方差
- //*d -- 【输入】半径
- //***********************************************/
- void bilateralBlur(cv::Mat &input_img, cv::Mat &output_img, float sigmaS, float sigmaR,int length)
- {
- // Create Gaussian/Bilateral filter --- mask ---
- int i, j, x, y;
- int radius = (int)length/2;//半径
- int m_width = input_img.rows ;
- int m_height= input_img.cols ;
- std::vector<float> mask(length*length);
- //定义域核
- for(i = 0; i < length; i++)
- {
- for (j = 0; j < length; j++)
- {
- mask[i*length + j] = exp(-(i*i + j*j)/(2 * sigmaS*sigmaS));
- }
- }
- float sum = 0.0f, k = 0.0f;
- for(x = 0; x < m_width; x++)
- {
- unsigned char *pin = input_img.ptr<unsigned char>(x);
- unsigned char *pout = output_img.ptr<unsigned char>(x);
- for(y = 0; y < m_height; y++)
- {
- int centerPix = y;
- for(i = -radius; i <= radius; i++)
- {
- for(j = -radius; j <= radius; j++)
- {
- int m = x+i, n = y+j;
- if(x+i > -1&& y+j > -1 && x+i < m_width && y+j < m_height)
- {
- unsigned char value = input_img.at<unsigned char>(m, n);
- //spatial diff
- float euklidDiff = mask[(i+radius)*length + (j + radius)];
- float intens = pin[centerPix]-value;//值域核
- float factor = (float)exp(-0.5 * intens/(2*sigmaR*sigmaR)) * euklidDiff;
- sum += factor * value;
- k += factor;
- }
- }
- }
- pout[y] = sum/k;
- sum=0.0f;
- k=0.0f;
- }
- }
- }
三,实验结果
四,参考
1,Matlab代码
2,双边滤波器的原理及实现
3,雙邊濾波器 (Bilateral Filter)
参考:http://blog.csdn.net/ubunfans/article/details/40181565
0 0
- 双边滤波--OpenCV实现
- 双边滤波--OpenCV实现
- opencv实现双边滤波 + 锐化
- OpenCV双边滤波测试
- 6.5OpenCV双边滤波
- opencv中值滤波-双边滤波
- 方框滤波,高斯滤波,中值滤波,双边滤波,opencv实现
- C/C++ OpenCV中值滤波&双边滤波
- 双边滤波JAVA代码实现
- 双边滤波以及代码实现
- Opencv学习:非线性滤波:中值滤波、双边滤波
- OpenCV之九 非线性滤波专场:中值滤波、双边滤波
- Opencv cvSmooth 双边滤波 参数设置未解决问题
- OpenCV 高斯、中值、均值、双边滤波
- OpenCV 双边滤波——bilateralFilter函数
- OpenCV学习笔记(十)双边滤波
- 图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现
- opencv----滤波函数:方框滤波、均值滤波、高斯滤波、中值滤波、双边滤波
- python 6-4 如何构建xml文档使用标准库中的xml.etree.ElementTree 构建ElementTree,使用write方法写入文档
- spring中AspectJ
- 虚拟机中的Linux安装VMware Tools的方法
- 奋斗的小蜗牛
- python 6-5 如何读写excel文件 使用第三方库xlrd 和 xlwt,这两个库分别用于excel读和写
- 双边滤波--OpenCV实现
- PLSQL Package
- wikioi1231 最优布线问题
- 开心的金明-洛谷 1060
- 168. Excel Sheet Column Title
- sublime text 3 java安装和配置
- UEFI boot: how does that actually work, then?
- 蓝桥杯单片机设计与开发之蜂鸣器继电器
- 算法之AVL树