opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)
图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作。
邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子。线性邻域滤波器就是一种常见的邻域算子,像素的输出值取决于输入像素及其周围像素的加权和,权重是邻域算子相应位置上的值。
线性滤波概念:
原始数据与滤波结果是一种算术运算,即用加减乘除等运算实现,如均值滤波器(模板内像素灰度值的平均值)、高斯滤波器(高斯加权平均值)等。
非线性滤波概念:
原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现,如最大值滤波器(膨胀)、最小值滤波器(腐蚀)、中值滤波器等,是通过比较一定邻域内的灰度值大小来实现的。
线性滤波:boxFilter 方框滤波、blur 均值滤波、GaussianBlur 高斯滤波
boxFilter 方框滤波
void boxFilter (InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor = Point (-1, -1), bool normalize = true, int borderType = BRODER_DEFAULT);
- src,输入图像,即原图像,填 Mat 类的对象即可。待处理的图像深度应该是 CV_8U、CV_16U、CV_16S、CV_32F、CV_64F。
- dst,目标图像,需要和原图像有一样的尺寸和类型。
- ddepth,输出图像的深度。“-1”代表使用原图深度,即 src.depth() 。
- ksize,内核大小。形式为 Size(x,y)
- anchor,锚点,即被平滑的那个点。默认值为 Point (-1, -1),表示取核的中心。
- normalize,一个标识符,表示内核是否被其区域归一化。默认值为 true。当 normalize = true 时,方框滤波就变成了均值滤波。
boxFilter 所用到的核表示如下:
其中
blur 均值滤波
void blur (InputArray src, OutputArray dst, Size ksize, Point anchor = Point (-1, -1), int borderType = BRODER_DEFAULT);
- 函数变量与 boxFilter 方框滤波几乎一样。
blur 所用到的核表示如下:
GaussianBlur 高斯滤波
void GaussianBlur (InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BRODER_DEFAULT);
-
GaussianBlur 两种常见的核表示如下:
高斯模板是通过高斯函数计算出来的,公式如下:
以3×3 的高斯滤波器模板为例,以模板的中心位置为坐标原点进行取样。模板在各个位置的坐标,如下所示(x轴水平向右,y轴竖直向上)。
- sigmaX (σx),表示高斯核函数在X方向的的标准偏差。
- sigmaY (σy),表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
非线性滤波: medianBlur 中值滤波、bilateralFilter 双边滤波
medianBlur 中值滤波
void medianBlur (InputArray src, OutputArray dst, int ksize);
- ksize,滤波器的大小,必须是大于一的奇数。
- 其他函数变量与 boxFilter 方框滤波几乎一样。
bilateralFilter 双边滤波
双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布。最重要的是,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(例如卷积核中像素与中心像素之间相似程度、颜色强度,深度距离等),在计算中心像素的时候同时考虑这两个权重。
void bilateralFilter (InputArray src, OutputArray dst,int d, double sigmaColor, double sigmaSpace, int borderType = BRODER_DEFAULT);
- d,过滤过程中每个像素邻域的直径。如果 d < 0,则会根据第五个参数 sigmaSpace 来计算。
- sigmaColor(σcolor),颜色空间滤波器的 σ 值,这个参数越大,表明该像素邻域内有越宽广的颜色被混到一起。
- sigmaSpace(σspace),坐标空间滤波器的 σ 值,它的值越大,意味着越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同颜色。当 d > 0 时,d 指定了邻域大小且与 sigmaSpace 无关,否则,d 正比于 sigmaSpace。
- 其他函数变量与 boxFilter 方框滤波几乎一样。