双边滤波--OpenCV实现

一,原理

双边滤波和各项异性扩散滤波有点类似,经常把他们俩放在一起讨论。

通俗点说,就是用一个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)

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值