双边滤波--OpenCV实现
2014-10-17 10:22
351 查看
一,原理
双边滤波和各项异性扩散滤波有点类似,经常把他们俩放在一起讨论。
通俗点说,就是用一个mask, mask中心点(OpenCV中叫anchor)对准当前要处理的点,双边滤波不仅要把当前点与mask覆盖点的值产生关系,还要与mask中点与当前点的距离产生关系,二者关系乘积作为mask权值,然后然后把mask覆盖的像素值和权值相乘,加在一起然后除以权值之和。
具体的公式请参考大神妹子博客,要想深究原理去看作者paper吧!
二,代码
三,实验结果
四,参考
1,Matlab代码
2,双边滤波器的原理及实现
3,雙邊濾波器 (Bilateral Filter)
双边滤波和各项异性扩散滤波有点类似,经常把他们俩放在一起讨论。
通俗点说,就是用一个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)
相关文章推荐
- 图像平滑技术之核算子、均值滤波、中值滤波、高斯滤波、双边滤滤、导向滤波的原理概要及OpenCV代码实现
- opencv实现双边滤波 + 锐化
- 方框滤波,高斯滤波,中值滤波,双边滤波,opencv实现
- 双边滤波--OpenCV实现
- 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
- 【OpenCV入门教程之九】 非线性滤波专场:中值滤波、双边滤波
- 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
- OpenCV实现Gabor滤波
- Sobel滤波,Laplace滤波介绍与opencv实现
- Opencv学习:非线性滤波:中值滤波、双边滤波
- OpenCV实现Gabor滤波(2)
- [学习opencv]高斯、中值、均值、双边滤波
- 目标跟踪之粒子滤波---Opencv实现粒子滤波算法
- opencv 实现导向滤波
- 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
- opencv实现图像邻域均值滤波、中值滤波、高斯滤波
- 抛一个kalman滤波跟踪的封装类 c++版opencv实现
- opencv实现图像邻域均值滤波、中值滤波、高斯滤波
- 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
- 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波