本文共 2865 字,大约阅读时间需要 9 分钟。
本篇博文是小武通过学习浅墨_毛星云的博客以及书籍《opencv3.0编程入门》整理的笔记及疑问心得,小武水平有限,欢迎交流。
方框滤波(box filter)被封装在一个名为boxblur的函数中,即boxblur函数的作用是使用方框滤波器(box filter)来模糊一张图片,从src输入,从dst输出。
void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT )
InputArray src
:输入图像,填Mat类的对象即可。OutputArray dst
:目标图像,需要和源图片有一样的尺寸和类型。int ddepth
:输出图像的深度,-1代表使用原图深度,即src.depth()。Size ksize
:内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小。Point anchor
:表示锚点(即被平滑的那个点),默认值Point(-1,-1)表示这个锚点在核的中心。bool normalize
:标识符,表示内核是否被其区域归一化。int borderType
:用于推断图像外部像素的某种边界模式,默认值BORDER_DEFAULT。方框滤波使用的是一个均匀大小的矩形内核。以下是示例内核图:
1 1 11 1 11 1 1
均值滤波是方框滤波归一化(normalized)后的特殊情况。均值滤波的作用是对图像进行均值模糊,使图像更加平滑。
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
InputArray src
:输入图像,填Mat类的对象即可。OutputArray dst
:目标图像,需要和源图片有一样的尺寸和类型。Size ksize
:内核的大小。Size(3,3)表示3x3的核大小,Size(5,5)表示5x5的核大小。Point anchor
:锚点,默认值Point(-1,-1)表示锚点在核的中心。int borderType
:边界模式,默认值BORDER_DEFAULT。均值滤波使用的是均匀大小的矩形内核,但由于归一化处理,内核的权重为1。以下是示例内核图:
1 1 11 1 11 1 1
高斯滤波(GaussianBlur)函数的作用是用高斯滤波器来模糊一张图片。高斯滤波比方框滤波和均值滤波更加平滑,效果更自然。
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
InputArray src
:输入图像,填Mat类的对象即可。OutputArray dst
:目标图像,需要和源图片有一样的尺寸和类型。Size ksize
:高斯内核的大小。ksize.width和ksize.height可以不同,但它们都必须为正数和奇数,或者由sigma计算得出。double sigmaX
:高斯核函数在X方向的标准偏差。double sigmaY
:高斯核函数在Y方向的标准偏差。若sigmaY为零,则设为sigmaX。int borderType
:边界模式,默认值BORDER_DEFAULT。高斯滤波使用的是高斯函数设计的内核。以下是示例内核图:
5.0 2.0 0.0 0.0 5.0 2.0 4.0 2.0 2.0 2.0 0.0 2.0 4.0 2.0 0.0 0.0 2.0 2.0 4.0 2.0 5.0 2.0 0.0 0.0 5.0
#include#include #include using namespace std; using namespace cv;int main() { Mat lenna1 = imread("lenna.jpg"); Mat Img_out; boxFilter(lenna1, Img_out, -1, Size(9, 9)); imshow("【原图】方框滤波", lenna1); imshow("【效果图】方框滤波", Img_out); waitKey(0); return 0;}
#include#include #include #include using namespace std; using namespace cv;int main() { Mat lenna1 = imread("lenna.jpg"); Mat Img_out; blur(lenna1, Img_out, Size(7, 7)); imshow("【原图】均值滤波", lenna1); imshow("【效果图】均值滤波", Img_out); waitKey(0); return 0;}
#include#include #include #include using namespace std; using namespace cv;int main() { Mat lenna1 = imread("lenna.jpg"); Mat Img_out; GaussianBlur(lenna1, Img_out, Size(9, 9), 0, 0); imshow("【原图】高斯滤波", lenna1); imshow("【效果图】高斯滤波", Img_out); waitKey(0); return 0;}
通过上述教程,可以轻松学习OpenCV中的常用滤波技术。
转载地址:http://nrrfk.baihongyu.com/