码迷,mamicode.com
首页 > 其他好文 > 详细

双边滤波器的实现

时间:2015-03-16 17:57:12      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:图像处理   双边滤波器   

普通的高斯滤波会将图像的边缘模糊掉,而双边滤波器具有保边特性。

#define  MAX_IMAGE_SIZE 1024
double d[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE];//d[i][j]表示入图像,fi][j]表示出图像。
double f[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE];
void CImageColorProcess::Bilateral(LPBYTE lpSrc, LPBYTE lpDst, int nSrcCount, int nW, int nH)
{
	int i, j, k, l;
	int p = 5;//p决定模板大小。当p=1时,模板为3*3;当p=2时,模板为5*5;当p=n时,模板为(2n+1)*(2n+1)。
	short m, n;
	double a1 = 0.02, b1 = 0.002;
	double aa1, bb1;//aa1,bb1为滤波模板中的各权重。
	//gguiyi高斯滤波的归一化系数,bguiyi双边滤波的归一化系数,gsum高斯滤波像素的加权和,bsum双边滤波像素的加权和。
	double gguiyi = 0.0, bguiyi = 0.0, gsum = 0.0, bsum = 0.0;
	int x_size2 = nW;//x_size1;
	int y_size2 = nH;//y_size1;
	LPBYTE lpSrc1 = new byte[nW*nH];
	RGB2Gray(lpSrc, lpSrc1, 24, nW, nH);
	//将读取的噪声图像赋给入力图像
	for (i = 0; i < nH; i++)
	{
		for (j = 0; j < nW; j++)
		{
			d[i][j] = lpSrc1[i*nW + j];
		}
	}
	//高斯滤波,双边滤波处理噪声图像
	for (i = 0; i < nH; i++)
	{
		for (j = 0; j < nW; j++)
		{
			for (k = -p; k <= p; k++)
			{
				for (l = -p; l <= p; l++)
				{
					m = i + k; n = j + l;
					//abs()返回指定数字的绝对值
					if (m<0)  { m = abs(i + k) - 1; }   	   
<span style="font-size: 12px;">                                        </span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"> if (m>nH - 1) { m = 2 * nH - i - k - 1; }</span>
					if (n<0)  { n = abs(j + l) - 1; }	  if (n>nW - 1) { n = 2 * nW - j - l - 1; }
					aa1 = exp(-a1*(l*l + k*k));
					bb1 = exp(-b1*(d[i][j] - d[m][n])*(d[i][j] - d[m][n]));
					bsum += aa1*bb1*d[m][n];
					bguiyi += aa1*bb1;
				}
			}
			f[i][j] = bsum / bguiyi;
			gguiyi = 0.0, bguiyi = 0.0, gsum = 0.0, bsum = 0.0;
		}
	}
	//将滤波后的像素赋给新的图像
	for (i = 0; i < nH; i++)
	{
		for (j = 0; j < nW; j++)
		{
			lpDst[i*nW + j] = (unsigned char)(f[i][j] + 0.5);
		}
	}

}


双边滤波器的实现

标签:图像处理   双边滤波器   

原文地址:http://blog.csdn.net/u014568921/article/details/44307199

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!