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

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

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

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

先上几张效果图。

半径参数为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);
		}
	}
}

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

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

时间: 2024-10-11 17:29:28

双边滤波算法的简易实现bilateralFilter的相关文章

双边滤波算法原理及实现

双边滤波算法原理 双边滤波是一种非线性滤波器,它可以达到保持边缘.降噪平滑的效果.和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布[1].最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(例如卷积核中像素与中心像素之间相似程度.颜色强度,深度距离等),在计算中心像素的时候同时考虑这两个权重. 双边滤波的核函数是空间域核与像素范围域核的

Bilateral Filtering(双边滤波)算法研究

1. 简介 图像平滑是一个重要的操作,而且有多种成熟的算法.这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪.Bilateral blur相对于传统的高斯blur来说很重要的一个特性即可可以保持边缘(Edge Perseving),这个特点对于一些图像模糊来说很有用.一般的高斯模糊在进行采样时主要考虑了像素间的空间距离关系,但是却并没有考虑像素值之间的相似程度,因此这样我们得到的模糊结果通常是整张图片一团模

【OPENCV入门之六】非线性滤波(中值滤波、双边滤波)

参考网站: http://blog.csdn.net/poem_qianmo/article/details/23184547 在很多情况下,比如在噪声是散粒噪声而不是高斯噪声时(图像偶尔会出现很大的值的时候),在这种情况下,用高斯滤波器对图像进行模糊的话,噪声是不会被去除的,它们只是转换为更为柔和但仍然可见的散粒.而用非线性滤波会更好些. 1.中值滤波(Median filter)--medianBlur函数 该方法在去除脉冲噪声.斑点噪声(speckle noise).椒盐噪声(salt-a

双边滤波CUDA优化——BilateralFilter CUDA

=======双边滤波概述======= 双边滤波(Bilateral filter)是一种可以保边去噪的滤波器.之所以可以达到此去噪效果,是因为滤波器是由两个函数构成.一个函数是由几何空间距离决定滤波器系数.另一个由像素差值决定滤波器系数.可以与其相比较的两个filter:高斯低通滤波器(http://en.wikipedia.org/wiki/Gaussian_filter)和α-截尾均值滤波器(去掉百分率为α的最小值和最大之后剩下像素的均值作为滤波器). =======双边滤波公式====

数字图像处理之快速中值滤波算法

快速中值滤波算法 中值滤波算法: 在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪.中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声.这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能.观察窗口中的数值进行排序,位于观察窗中间的中值作为输出.然后,丢弃最早的值,取得新的采样,重复上面的计算过程.中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用.保存边缘的特性使它在不希

图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现

图像平滑是指直接对源图像的每个像素数据做邻域运算以达到平滑图像的目的.实质上主要就是通达卷积核算子实现的,卷积核算子的相关知识大家可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51691410 图像平滑也称为模糊或滤波,是图像处理中常用的技术之一,进行平滑处理时需要用到滤波器核(其实就是卷积核算子),根据滤波器核函数来实现不同的滤波技术.下面介绍几种 常用的图像平滑方法的大概原理及OpenCV下的实现代码. 一.盒滤波(均值滤波)

灰度图像--图像增强 双边滤波 Bilateral Filtering

学习DIP第31天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

OpenCv 026---高斯双边滤波

1 前备知识 此前的图像卷积处理无论是均值还是高斯都是属于模糊卷积,它们都有一个共同的特点就是模糊之后图像的边缘信息不复存在或者受到了破坏.而高斯双边滤波可以通过卷积处理实现图像模糊的同时减少图像边缘破坏,滤波之后的输出完整的保存了图像整体边缘(轮廓)信息,我们称这类滤波算法为边缘保留滤波算法(EPF).最常见的边缘保留滤波算法有以下几种: - 高斯双边模糊:高斯模糊是考虑图像空间位置对权重的影响,但是它没有考虑图像像素分布对图像卷积输出的影响,双边模糊考虑了像素值分布的影响,对像素值空间分布差

16.双边滤波

//双边滤波 int g_nBilateralValue; void on_ChangeBilateralValue(int,void*) { if(g_nBilateralValue>0) { bilateralFilter(g_srcImage_Contrast,g_dstImage_Contrast,g_nBilateralValue,g_nBilateralValue*2,g_nBilateralValue/2); imshow("双边滤波",g_dstImage_Con