双边滤波器的实现

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

#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);
		}
	}

}
时间: 2024-11-08 01:46:25

双边滤波器的实现的相关文章

双边滤波器以及中值滤波器记录

香港中文大学研究成果 Rolling Guidance Filter http://www.cse.cuhk.edu.hk/~leojia/projects/rollguidance/ 100+ Times Faster Weighted Median Filter http://www.cse.cuhk.edu.hk/~leojia/projects/fastwmedian/index.html

vs2015+opencv3.3.1 实现 c++ 双边滤波器

#include <opencv2\highgui\highgui.hpp> #include <iostream> #include<vector> using namespace cv; using namespace std; void GetGaussianKernel(double*& gaus_1, const int size, const double sigma_s); void gaussianFilter2(const vector<

数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波 )

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. #滤波去噪 lbimg=cv2.GaussianBlur(newimg,(3,3),1.8) cv2.imshow('src',newimg) cv2.imshow('dst',lbimg) cv2.waitKey() cv2.destroyAllW

OpenCL双边滤波实现美颜功能

OpenCL是一个并行异构计算的框架,包括intel,AMD,英伟达等等许多厂家都有对它的支持,不过英伟达只到1.2版本,主要发展自己的CUDA去了.虽然没有用过CUDA,但个人感觉CUDA比OpenCL更好一点,但OpenCL支持面更管,CPU,GPU,DSP,FPGA等多种芯片都能支持OpenCL.OpenCL与D3D中的像素着色器非常相似. 1.双边滤波原理 双边滤波器的原理参考女神Rachel-Zhang的博客 双边滤波器的原理及实现. 引自Rachel-Zhang的博客,原理如下: 双

Atitit &#160;&#160;图像处理&#160;平滑&#160;也称&#160;模糊,&#160;归一化块滤波、高斯滤波、中值滤波、双边滤波)

Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: 归一化块滤波器 (Normalized Box Filter) § 最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等) § 高斯滤波器 (Gaussian Filter) § 最有用的滤波器 (尽管不是最快的). 高斯滤波是将输入数组的每一个像素点与 高斯

数字图像处理(三):高斯滤波和双边滤波

1.高斯滤波 clear all;clc;close all %% 彩色to灰度 img=imread('Fig0631(a)(strawberries_coffee_full_color).jpg'); gray=rgb2gray(img); %把彩色图片转化成灰度图片 figure(1),imshow(gray),title('彩色原始图像转灰色图像)'); %显示原始图像 gray=imnoise(gray,'gaussian',0,0.001); %加入均值为0,方差为0.001的高斯噪

OpenCV笔记(十二)—自定义线性滤波器

在<OpenCV笔记(七)>中,写了四种线性滤波的方法:箱式滤波器.高斯滤波器.中值滤波器和双边滤波器. 在OpenCV中,我们可以使用filter2D函数自定义kernel进行线性滤波. void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1, -1), double delta=0, int borderType=BORDER_DEFAULT) 参

双边滤波原理与C++实现

一.原理 双边滤波(Bilateral filter)是一种可以去噪保边的滤波器.之所以可以达到此效果,是因为滤波器是由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个由像素差值决定滤波器系数. 原理示意图如下: 双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合, 权重系数w(i,j,k,l)取决于定义域核 和值域核 的乘积 二.C++实现 2.1 OpenCV调用方法: cvSmooth(m_iplImg, dstImg, CV_BILATERAL, 2 * r + 1, 0

双边滤波和引导滤波的原理

双边滤波很有名,使用广泛,简单的说就是一种同时考虑了像素空间差异与强度差异的滤波器,因此具有保持图像边缘的特性. 先看看我们熟悉的高斯滤波器 其中W是权重,i和j是像素索引,K是归一化常量.公式中可以看出,权重只和像素之间的空间距离有关系,无论图像的内容是什么,都有相同的滤波效果. 再来看看双边滤波器,它只是在原有高斯函数的基础上加了一项,如下 其中 I 是像素的强度值,所以在强度差距大的地方(边缘),权重会减小,滤波效应也就变小.总体而言,在像素强度变换不大的区域,双边滤波有类似于高斯滤波的效