双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
Bilateral Filtering for Gray and Color Images可以看看这里的解析,里面讲的很详细。
C++的函数原型:voidbilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)
C:
void
cvSmooth
(const CvArr*
src, CvArr*
dst, int
smoothtype=CV_GAUSSIAN, int
param1=3, int
param2=0, double
param3=0, double
param4=0
)
CV_BILATERAL bilateral filter with a square aperture, color sigma= param3 and spatial sigma= param4 . If param1=0 , the aperture square side is set to cvRound(param4*1.5)*2+1 .
这里面double sigmaColor, double sigmaSpace分别是像素值相似度和邻近相似度的方差,int d为滤波的直径。
//中值滤波
cvSmooth(pImg,pDst1,CV_BILATERAL,5,0,150,150);
cvSmooth(pImg,pDst2,CV_BILATERAL,12,0,150,150);
cvSmooth(pImg,pDst3,CV_BILATERAL,25,0,150,150);
滤波的结果:
原图:
square aperture=5结果
square aperture=12结果
square aperture=25