1,简介

1.1,Opencv提供滤波处理函数

方框滤波,BoxBlur函数

均值滤波(领域平均滤波),Blur函数

高斯滤波,GaussianBlur函数

中值滤波,medianBlur函数

双边滤波,bilateralFilter函数

1.2,常见线性滤波器

低通滤波器:允许低频率通过。

高通滤波器:允许高频率通过。

带通滤波器:允许一定范围频率通过。

带阻滤波器:阻止一定范围频率通过并且允许其他频率通过。

全通滤波器:允许所有频率通过,仅仅改变相位关系。

陷波滤波器(Band-StopFilter):阻止-个狭窄频率范围通过,是一种特殊带阻滤波器。

2,目的

2.1,对噪声进行抑制

2.2,抽出对象的特征

3,均值滤波

线性滤波

CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );

//参数1(src):原图
//参数2(dst):处理后的图像
//参数3(ksize):核的尺寸,正奇数
//参数4(anchor):锚点,默认值 Point(-l-l)表示这个锚点在核的中心
//参数5(borderType):边框类型

原理:

在图像上对目标像素给出一个内核,该内核包括了其周围的临近像素(比如以目标像素为中心的周围8(3x3-1)个像素,构成一个滤波内核,去掉目标像素本身)。再用内核中的全体像素的平均值来代替原来像素值。

缺陷:

不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点

4,方框滤波

线性滤波

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 );

//参数1(src):原图
//参数2(dst):处理后的图像
//参数3(ddepth):处理后图像深度,-1代表使用原图深度
//参数4(ksize):核的尺寸,正奇数
//参数5(anchor):锚点,默认值 Point(-l-l)表示这个锚点在核的中心
//参数6(normalize):归一化处理
//参数7(borderType):边框类型

当normalize = true,结果等于均值滤波=内核像素的和 / (内核大小-1)

当normalize = false,结果计算图元像素=内核像素的和,导致像素值容易超出最大值255,截断变为255,白色图像

5,高斯滤波

线性滤波

CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

//参数1(src):原图
//参数2(dst):处理后图像
//参数3(ksize):内核大小,正奇数
//参数4(sigmaX):X方向上的高斯核标准偏差
//参数5(sigmaY):Y方向上的高斯核标准偏差
//参数6(borderType ):边框类型

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波具体操作是:用一个内核(或称卷积、掩模)扫描图像中的每一个像素,用内核确定的邻域内像素的加权平均灰度值去替代内核中心像素点的值。

效果:类似经过一个半透明屏幕在观察图像

6,中值滤波

非线性滤波

CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );

//参数1(src):原图
//参数2(dst):处理后图像
//参数3(ksize):内核大小,正奇数

用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声、斑点噪声的同时又能保留图像的边缘细节。

与均值滤波相比:中值滤波无论是在消除l噪声还是保存边缘方面都是一个不错的方法,但是耗时是均值滤波5倍以上。耗时长

7,双边滤波

非线性滤波

CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );

//参数1(src):原图
//参数2(dst):处理后图像
//参数3(d):表示在过滤过程中每个像素邻域的直径
//参数4(sigmaColor):颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域
//参数5(sigmaSpace):坐标空间中滤波器的sigma值,坐标空间的标注方差。它的数值越大,意味着越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当 d>0时, d指定了邻域大小且与sigmaSpace无关。否则, d正比于sigmaSpace
//参数6(borderType):边框类型

双边滤波(Bilateralfil忧r)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的,具有简单、非法代、局部的特点。

双边滤波器的好处是可以做边缘保存。耗时长

8,形态学滤波

简单来讲,形态学操作就是基于形状的一系列图像处理操作(腐蚀/膨胀等等)。腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀是图像中的高亮部分进行膨胀,类似于"领域扩张",效果图拥有比原图更大的高亮区域。腐蚀是原图中的高亮部分被腐蚀,类似于"领域被蚕食",效果图拥有比原图更小的高亮区域

8.1,膨胀

求局部最大值的操作

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );


//参数1(src):原图
//参数2(dst):处理后图像
//参数3(kernel):内核,可以是正方向或者矩形,可以通过cv2.getStructuringElement()函数创建
//参数4(anchor ):锚点
//参数5(iterations):迭代次数,如连续膨胀几次
//参数6(borderType ):边框类型
//参数7(borderValue ):边界值

获取内核

CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

//参数1(shape):设定卷积核的形状,有三个可选值:MORPH_RECT(返回矩形卷积核)、MORPH_CROSS(返回十字形卷积核)和MORPH_ELLIPSE(返回椭圆形卷积核)
//参数2(ksize):表示卷积核有x行,y列
//参数3(anchor ):设定锚点的位置,一般设为(-1,-1),表示锚点位于核中心。

注:参数1(shape)枚举定义

enum MorphShapes {
    MORPH_RECT    = 0, 
    MORPH_CROSS   = 1, 
    MORPH_ELLIPSE = 2 
};

8.2,腐蚀

求局部最小值的操作

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );

//参数1(src):原图
//参数2(dst):处理后图像
//参数3(kernel):内核,可以是正方向或者矩形,可以通过cv2.getStructuringElement()函数创建
//参数4(anchor ):锚点
//参数5(iterations):迭代次数,如连续腐蚀几次
//参数6(borderType ):边框类型
//参数7(borderValue ):边界值

8.3,开运算

先腐蚀后膨胀。

开运算可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积。

CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );


//参数1(src):原图
//参数2(dst):处理后图像
//参数3(op):形态学操作的类型,可以是腐蚀、膨胀、开运算、闭运算、顶帽、黑帽等
//参数4(kernel):内核,可以是正方向或者矩形,可以通过cv2.getStructuringElement()函数创建
//参数5(anchor ):锚点
//参数6(iterations):迭代次数
//参数7(borderType ):边框类型
//参数8(borderValue ):边界值

注:参数3(op)枚举定义

enum MorphTypes{
    MORPH_ERODE    = 0, 
    MORPH_DILATE   = 1, 
    MORPH_OPEN     = 2, 
    MORPH_CLOSE    = 3, 
    MORPH_GRADIENT = 4, 
    MORPH_TOPHAT   = 5, 
    MORPH_BLACKHAT = 6, 
    MORPH_HITMISS  = 7  
};

/*
    MORPH_ERODE    //腐蚀
    MORPH_DILATE   //膨胀
    MORPH_OPEN     //开运算
    MORPH_CLOSE    //闭运算
    MORPH_GRADIENT //梯度
    MORPH_TOPHAT   //顶帽
    MORPH_BLACKHAT //黑帽
    MORPH_HITMISS  //Hit-or-Miss 运算,是一种特殊的形态学运算,通常用于检测满足特定形状的物体
*/

8.4,闭运算

先膨胀后腐蚀。

能够排除小型黑洞(黑色区域)。

8.5,梯度

膨胀图与腐蚀图之差。

对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓。

8.6,梯度

膨胀图与腐蚀图之差。

对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓。

8.7,顶帽

原图与开运算的结果图之差。(原图 - 开运算)

开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作与选择的核的大小相关。

运算往往用来分离比邻近点亮一些的斑块。

在一副图像具有大幅的背景,而做小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

8.8,黑帽

闭运算的结果图与原图之差。(闭运算 - 原图)

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和|选择的核的大小相关。

黑帽运算用来分离比邻近点暗一些的斑块,效果图有着非常完美的轮廓。

11-05 11:00