一、图像滤波简介
滤波实际上是信号处理的一个概念,图像可以看成一个二维信号,其中像素点灰度值的高低代表信号的强弱:
高频:图像中变化剧烈的部分
低频:图像中变化缓慢,平坦的部分
根据图像高低频特性,设置高通和低通滤波器。
高通滤波可以检测图像中尖锐、变化明显的地方,低通滤波可以让图像变得平滑,消除噪声干扰。
图像滤波是OpenCV图像处理的重要部分,在图像预处理方面应用广泛,图像滤波的好坏决定着后续处理的结果好坏。
以下主要介绍低通滤波部分(图像平滑去噪),主要介绍的图像滤波函数方法:
线性滤波:方框滤波、均值滤波、高斯滤波。
二、
邻域算子:利用给定像素周围的像素值决定此像素的最终输出值的一种算子。
线性滤波:一种常用的邻域算子,像素输出取决于输入像素的加权和,如下图所示:
线性滤波器输出像素g(i, j)是输入像素f(i+k, j+I)的加权和,其中h(k, l)我们称之为核,是滤波器的加权系数。
方框滤波用到的核:
当normalize为true时,方框滤波也就成了均值滤波。也就是说均值滤波是方框滤波归一化后的特殊情况。归一化就是将要处理的量缩放到一定范围,比如(0, 1)。
函数原型:
CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
Size ksize, Point anchor=Point(-1,-1),
bool normalize=true,
int borderType=BORDER_DEFAULT );
ddepth: 输出图像的深度, -1代表使用原图像深度,即src.depth();
ksize: Size类型表示内核大小,一般用Size(w,h)表示内核大小, Size(3,3)表示3x3的核大小;
anchor: 表示锚点(即被平滑的那个点), 默认值;
Point(-1, -1),表示锚点在核中心;
normalize: 默认值true, 标识符, 表示内核是否被归一化;
borderType: 图像像素边界模式,一般用默认值即可;
(二)、均值滤波---blur()
均值滤波用到的核:
均值滤波即方框滤波归一化特例,就是用邻域内像素均值来代替该点像素值,均值滤波在去噪的同时也破坏了图像细节部分。
函数原型:
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor=Point(-1,-1),
int borderType=BORDER_DEFAULT );
ksize: Size类型表示内核大小,一般用Size(w,h)表示内核大小, Size(3,3)表示3x3的核大小;
anchor: 表示锚点(即被平滑的那个点), 默认值Point(-1, -1),表示锚点在核中心;
borderType: 图像像素边界模式,一般用默认值即可;
(三)、高斯滤波---blurGaussianBlur()
高斯滤波器被称为最有用的滤波器,每个像素点都是由本身和邻域内的其他像素值经过加权平均后得到的, 加权系数越靠近中心越大, 越远离中心越小, 能够很好的滤除噪声。
函数原型:
CV_EXPORTS_W void GaussianBlur( InputArray src,
OutputArray dst, Size ksize,
double sigmaX, double sigmaY=0,
int borderType=BORDER_DEFAULT );
ksize: 高斯内核大小,一般用Size(w,h)表示内核大小, w, h可以不同, 但是必须为正奇数或者0, 由sigma计算得来;
sigmaX: 表示高斯函数在X方向上的标准偏差;
sigmaY: 表示高斯函数在Y方向上的标准偏差, 若sigmaY=0, 就将它设置为sigmaX;
若sigmaY=0 && sigmaX=0则由ksize.width和ksize.height计算出来;
borderType: 图像像素边界模式,一般用默认值即可。
(四)、中值滤波---medianBlur()
中值滤波是一种非线性滤波, 是用像素点邻域灰度值的中值代替该点的灰度值, 可以去除脉冲噪声和椒盐噪声.
median({1,2,3,3,7,5,1,8})=3 排序后的中间那个值
函数原型:
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
ksize: int类型的孔径的线性尺寸, 大于1的奇数.
(五)、双边滤波---bilateralFilter()
双边滤波是一种非线性滤波, 是结合图像空间邻近度和像素值相似度的一种折中处理, 尽量在去噪同时保存边缘。
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType=BORDER_DEFAULT );
d: 表示过滤过程中每个像素的邻域直径;
sigmaColor: 颜色空间滤波器sigma值, 值越大表面该像素邻域内有越广泛的颜色会混到一起,产生较大的半相等颜色区域;
sigmaSpace: 坐标空间中滤波器的sigma值, 坐标空间的标准方差;
borderType: 图像像素边界模式,一般用默认值即可。