opencv:基于opencv的五种滤波方法
图像滤波指的是在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像处理中不可缺少的一项操作。根据空间滤波增强目的可分为:平滑滤波和锐化滤波;平滑滤波,能减弱或消除图像中的高频分量,但不影响低频分量,锐化滤波,能减弱或消除图像中的低频分量,但不影响高频分量。根据空间滤波的特点可分为:线性滤波和非线性滤波。
下面是常用的一些滤波器及在opencv中对应的函数,分为线性滤波和非线性滤波
-
方框滤波–> boxblur函数来实现 –>线性滤波
-
均值滤波(邻域平均滤波)–> blur函数 –>线性滤波
-
高斯滤波–>GaussianBlur函数 –>线性滤波
-
中值滤波–>medianBlur函数 –>非线性滤波
-
双边滤波–>bilateralFilter函数 –>非线性滤波
下面将对这五种滤波器函数的功能进行介绍
1. 方框滤波
boxFilter( InputArray src, OutputArray dst, int ddepth,
Size ksize, Point anchor = Point(-1,-1),
bool normalize = true,
int borderType = BORDER_DEFAULT )
-
src:输入图像
-
dst:输出图像
-
ddepth:输出图像的深度,-1 代表使用原图深度
-
ksize: 滤波内核的大小。一般这样写Size(w, h)来表示内核的大小,Size(10, 10)就表示 10x10 的核大小
-
anchor = Point(-1,-1) :表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1) 如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
-
normalize = true:默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了
-
borderType = BORDER_DEFAULT:用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
2. 均值滤波
blur( InputArray src,OutputArray dst, Size ksize,
Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT)
-
src:输入图像 。
-
dst:输出图像 。
-
ksize:内核大小 ,一般用 Size(w,h),w 为宽度,h 为深度。
-
anchor:被平滑的点,表示取 内核中心 ,默认值 Point(-1,-1)。
-
boderType:推断图像外部像素的某种边界模式。默认值 BORDER_DEFAULT
3. 高斯滤波
GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT )
-
src:输入图像 。
-
dst:输出图像 。
-
ksize:ksize.width 和 ksize.height 可以不同,但他们都必须为正数和奇数,或者为0,可由 sigma 计算而来
-
sigmaX:高斯核函数在 X 方向的的标准差
-
sigmaY:高斯核函数在 Y 方向的的标准差
若 sigmaY 为零,就将它设为 sigmaX;若 sigmaX 和 sigmaY 都是0,那么就由 ksize.width 和 ksize.height 计算出来
4. 中值滤波
medianBlur(InputArray src,OutputArray dst,int ksize)
-
src:输入图像 。
-
dst:输出图像 。
-
ksize:孔径的线性尺寸,这个参数必须是大于1 的奇数
5. 双边滤波
bilateralFilter(InputArray src,OutputArray dst, int d,
double sigmaColor,double sigmaSpace,
int borderType=BORDER_DEFAULT)
-
src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
-
dst: 输出图像,和原图像有相同的尺寸和类型。
-
d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
-
sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
-
sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
-
borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
五种滤波实现代码:
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat dst1, dst2, dst3, dst4, dst5;
Mat src = imread("lena.jpg");
imshow("src", src);
//方框滤波
boxFilter(src, dst1, src.depth(), Size(3, 3), Point(-1, -1), false);
imshow("方框滤波", dst1);
//均值滤波
blur(src, dst2, Size(10, 10));
imshow("均值滤波", dst2);
//高斯滤波
GaussianBlur(src, dst3, Size(5, 5), 0, 0);
imshow("高斯滤波", dst3);
//中值滤波
medianBlur(src, dst4, 9);
imshow("中值滤波", dst4);
//双边滤波
bilateralFilter(src, dst5, 10, 10, 10);
imshow("双边滤波", dst5);
waitKey(0);
return 0;
}
实现结果:
如有对图像处理、计算机视觉感兴趣的小伙伴关注公众号,一起学习进步。可以微信搜索“图像处理CV讲武堂”关注,也可如下二维扫码关注。
“动动手指扫码或微信搜一搜“图像处理CV随堂学习笔记”关注哟”