Opencv中处理图像平滑的手段主要有4种:箱式滤波器、高斯滤波器、中值滤波器、双边滤波器。
1. 箱式滤波器 Normalized Box Filter
箱式滤波器将当前像素的值替换为所有kernel范围内像素的值的平均值。公式如下:
如果是3x3的核,则它对应的核是1/9 * [1, 1, 1; 1, 1, 1; 1, 1, 1]
OpenCV中的函数为:
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1, -1), int borderType=BORDER_DEFAULT)
参数ksize就是kernel的尺寸。
anchor默认为Point(-1, -1),意味着以kernel的中心点为基准点进行滤波。在这里意义不大。
2. 高斯滤波器 Gaussian Filter
在高斯滤波器中,kernel范围内的像素所占的权重是高斯分布的值。kernel中心点的权重为高斯分布的中点的值。其余的像素所占的权重与它离中心点的距离成反比。
举个例子,对于一维高斯分布,G(x) = Ae-x^2/(2σ^2) ,在[-4, 4]的范围内,如果sigma=0.5,则一维高斯滤波器的系数为:[0.0 0.0 0.00026 0.10645 0.78645 0.10645 0.00026 0.0 0.0]
这个系数也比较好理解,因为在均值+3倍sigma之外的地方,高斯分布的概率基本为0。
当sigma=1.5时,系数为[0.00761 0.036075 0.10959 0.21345 0.26666 0.21345 0.10959 0.03608 0.00761]
而二维的高斯滤波器,可以对图像的行应用一维高斯滤波器,接着对图像的列应用相同的一维滤波器。这利用的是高斯滤波器的可分离特性。(此处参考《OpenCV2 计算机视觉编程手册》)
OpenCV中的函数为:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
参数ksize就是kernel的尺寸。
sigmaX是高斯分布在X方向上的标准差。
sigmaY默认为0,则与sigmaX相等。如果sigmaX和sigmaY均为零,则他们自动由getGaussianKernel()算出。
3. 中值滤波器 Median Filter
中值滤波器比较简单,就是在kernel的范围内,以中值点作为中心点的值。
OpenCV中的函数为:
void medianBlur(InputArray src, OutputArray dst, int ksize)
4. 双边滤波器 Bilateral Filter
双边滤波器的详细解释见:http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html#Index
该滤波器的优点就是能够保留边缘的信息。缺点是速度较慢。
OpenCV中的函数为:
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)
不知为不知,等看懂了再来解释~