1.概述
双边滤波器的好处是可以做边缘保存edge preserving,一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显的模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。
其中的c即为基于空间距离的高斯权重,而 用来对结果进行单位化。
高斯滤波在低通滤波算法中有不错的表现,但是其却有另外一个问题,那就是只考虑了像素间的空间位置上的关系,因此滤波的结果会丢失边缘的信息。这里的边缘主要是指图像中主要的不同颜色区域(比如蓝色的天空,黑色的头发等),而Bilateral就是在Gaussian blur中加入了另外的一个权重分部来解决这一问题。Bilateral滤波中对于边缘的保持通过下述表达式来实现:
其中的s为基于像素间相似程度的高斯权重, 同样用来对结果进行单位化。对两者进行结合即可以得到基于空间距离、相似程度综合考量的Bilateral滤波:
上式中的单位化分部 综合了两种高斯权重于一起而得到,其中的c与s计算可以详细描述如下:
2 调试
2.1 matlab调试结果及代码
窗口选择较大时,可以看出相对于高斯模糊处理,图像经双边滤波处理后,边缘保持较好,但是窗口较大,处理速度会大大延长。而窗口较小时,滤波不明显。
窗口大小:10*10
窗口大小3*3
窗口大小:3*3
MATLAB代码
I=imread('D:\\Administrator\\My Pictures\\Lenagray.bmp');
I=double(I)/255;
w
sigma = [3 0.1]; % bilateral filter standard deviations
I1=bfltGray(I,w,sigma(1),sigma(2));
subplot(1,2,1);
imshow(I);
subplot(1,2,2);
imshow(I1)
% bilateral filtering for grayscale images.
function B = bfltGray(A,w,sigma_d,sigma_r)
[X,Y] = meshgrid(-w:w,-w:w);
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));
% Create waitbar.
h = waitbar(0,'Applying bilateral filter...');
set(h,'Name','Bilateral Filter Progress');
% Apply bilateral filter.
dim = size(A);
B = zeros(dim);
for i = 1:dim(1)
end
% Close waitbar.
close(h);
2.2 ccs调试结果及代码
2.2.1 双边滤波
CCS代码:
#include
#include
#define IMAGEWIDTH
#define IMAGEHEIGHT 256
#define Uint8
void ReadImage(char *cFileName);
void bmpDataPart(FILE* fpbmp);
void BilateralFilter(double dSigma1, double dSigma2, int nWin);
unsigned char grey[IMAGEHEIGHT][IMAGEWIDTH];
void main()
{
}
void ReadImage(char *cFileName)
{
}
void bmpDataPart(FILE* fpbmp)
{
}
void BilateralFilter(double dSigma1, double dSigma2, int nWin)
{
}