前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >双边滤波算法的简易实现bilateralFilter

双边滤波算法的简易实现bilateralFilter

作者头像
cpuimage
发布2018-04-12 15:17:23
1.9K0
发布2018-04-12 15:17:23
举报
文章被收录于专栏:算法+算法+

没怎么看过双边滤波的具体思路,动手写一写,看看能不能突破一下。

最后,感觉算法还是要分开 水平 与 垂直 方向进行分别处理,才能把速度提上去。

没耐性写下去了,发上来,给大伙做个参考好了。

先上几张效果图。

半径参数为10.

见图,磨皮降噪效果还不错。

具体代码如下: 

void bilateralFilter(unsigned char* pSrc, unsigned char* pDest, int width, int height, int radius)
{
	float delta = 0.1f;
	float eDelta = 1.0f / (2 * delta * delta);

	int colorDistTable[256 * 256] = { 0 }; 
	for (int x = 0; x < 256; x++)
	{
		int  * colorDistTablePtr = colorDistTable + (x * 256);
		for (int y = 0; y < 256; y++)
		{
			int  mod = ((x - y) * (x - y))*(1.0f / 256.0f);
			colorDistTablePtr[y] = 256 * exp(-mod * eDelta);
		}
	} 
	for (int Y = 0; Y < height; Y++)
	{
		int Py = Y * width;
		unsigned char* LinePD = pDest + Py; 
		unsigned char* LinePS = pSrc + Py;
		for (int X = 0; X < width; X++)
		{
			int sumPix = 0;
			int sum = 0;
			int factor = 0;

			for (int i = -radius; i <= radius; i++)
			{
				unsigned char* pLine = pSrc + ((Y + i + height) % height)* width;
				int cPix = 0;
				int  * colorDistPtr = colorDistTable + LinePS[X] * 256;
				for (int j = -radius; j <= radius; j++)
				{
					cPix = pLine[ (X + j+width)%width];
					factor = colorDistPtr[cPix];
					sum += factor;
					sumPix += (factor *cPix);
				}
			}
			LinePD[X] = (sumPix / sum);
		}
	} 
}

 抛砖引玉一下,算法思路比较清晰。

懒得描述细节,代码很短,看代码吧。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档