好文档 - 专业文书写作范文服务资料分享网站

八、线性滤波

天下 分享 时间: 加入收藏 我要投稿 点赞

参数详解如下:

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。 第三个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小

第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。

第五个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

调用代码示范:

[cpp] view plain copy print? //载入原图

Mat image=imread(\ //进行均值滤波操作 Mat out;

blur(image, out, Size(7, 7));

为了大家的理解和应用方便,还是给出用上面三句核心代码架起来完整程序的代码: [cpp] view plain copy print? //-----------------------------------【头文件包含部分】--------------------------------------- // 描述:包含程序所依赖的头文件

//---------------------------------------------------------------------------------------------- #include \

#include\#include\#include

//-----------------------------------【命名空间声明部分】--------------------------------------- // 描述:包含程序所使用的命名空间

//----------------------------------------------------------------------------------------------- using namespace cv;

//-----------------------------------【main( )函数】-------------------------------------------- // 描述:控制台应用程序的入口函数,我们的程序从这里开始 //----------------------------------------------------------------------------------------------- int main( ) {

//载入原图

Mat image=imread(\

//创建窗口

namedWindow(\均值滤波【原图】\ namedWindow(\均值滤波【效果图】\ //显示原图

imshow(\均值滤波【原图】\ //进行滤波操作 Mat out;

blur(image, out, Size(7, 7));

//显示效果图

imshow(\均值滤波【效果图】\ waitKey(0 ); }

运行效果图(内核大小Size(7, 7)):

<3>GaussianBlur函数——高斯滤波

GaussianBlur函数的作用是用高斯滤波器来模糊一张图片,对输入的图像src进行高斯滤波后用dst输出。 函数原型如下:

[cpp] view plain copy print? C++: void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT ) 参数详解如下:

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及CV_64F之一。

第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。

第三个参数,Size类型的ksize高斯内核的大小。其中ksize.width和ksize.height可以不同,

但他们都必须为正数和奇数。或者,它们可以是零的,它们都是由sigma计算而来。 第四个参数,double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。

第五个参数,double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。

为了结果的正确性着想,最好是把第三个参数Size,第四个参数sigmaX和第五个参数sigmaY全部指定到。

第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。

调用示例:

[cpp] view plain copy print?//载入原图

Mat image=imread(\

//进行滤波操作 Mat out;

GaussianBlur( image, out, Size( 5, 5 ), 0, 0 );

用上面三句核心代码架起来的完整程序代码: [cpp] view plain copy print? //-----------------------------------【头文件包含部分】--------------------------------------- // 描述:包含程序所依赖的头文件

//---------------------------------------------------------------------------------------------- #include \

#include\#include\#include

//-----------------------------------【命名空间声明部分】--------------------------------------- // 描述:包含程序所使用的命名空间

//----------------------------------------------------------------------------------------------- using namespace cv;

//-----------------------------------【main( )函数】-------------------------------------------- // 描述:控制台应用程序的入口函数,我们的程序从这里开始 //----------------------------------------------------------------------------------------------- int main( ) {

//载入原图

Mat image=imread(\ //创建窗口

namedWindow(\均值滤波【原图】\ namedWindow(\均值滤波【效果图】\ //显示原图

imshow(\均值滤波【原图】\ //进行均值滤波操作 Mat out;

GaussianBlur(image, out, Size( 3, 3 ), 0, 0 ); //显示效果图

imshow(\均值滤波【效果图】\ waitKey(0 ); }

运行效果图(内核大小Size(5, 5)):

四、图像线性滤波综合示例程序

依然是每篇文章都会配给大家的一个详细注释的博文配套示例程序,把这篇文章中介绍的知识点以代码为载体,展现给大家。

这个示例程序中可以用轨迹条来控制三种线性滤波的核参数值,通过滑动滚动条,就可以控制图像在三种线性滤波下的模糊度,有一定的可玩性。废话不多说,上代码吧:

[cpp] view plain copy print? //-----------------------------------【程序说明】----------------------------------------------

// 程序名称::【OpenCV入门教程之八】线性滤波专场:方框滤波、均值滤波与高斯滤波 配套源码

// 开发所用OpenCV版本:2.4.8 // 2014年3月31 日 Create by 浅墨

//------------------------------------------------------------------------------------------------

//-----------------------------------【头文件包含部分】--------------------------------------- // 描述:包含程序所依赖的头文件

//---------------------------------------------------------------------------------------------- #include

#include #include #include

//-----------------------------------【命名空间声明部分】--------------------------------------- // 描述:包含程序所使用的命名空间

//----------------------------------------------------------------------------------------------- using namespace std; using namespace cv;

//-----------------------------------【全局变量声明部分】-------------------------------------- // 描述:全局变量声明

//-----------------------------------------------------------------------------------------------

Mat g_srcImage,g_dstImage1,g_dstImage2,g_dstImage3;//存储图片的Mat类型 int g_nBoxFilterValue=3; //方框滤波参数值 int g_nMeanBlurValue=3; //均值滤波参数值 int g_nGaussianBlurValue=3; //高斯滤波参数值

//-----------------------------------【全局函数声明部分】-------------------------------------- // 描述:全局函数声明

//----------------------------------------------------------------------------------------------- //轨迹条的回调函数

static void on_BoxFilter(int, void *); //方框滤波 static void on_MeanBlur(int, void *); //均值滤波

static void on_GaussianBlur(int, void *); //高斯滤波

//-----------------------------------【main( )函数】-------------------------------------------- // 描述:控制台应用程序的入口函数,我们的程序从这里开始 //----------------------------------------------------------------------------------------------- int main( ) {

//改变console字体颜色 system(\

//载入原图

g_srcImage= imread( \

if(!g_srcImage.data ) { printf(\,no,读取srcImage错误~!\\n\

//克隆原图到三个Mat类型中 g_dstImage1= g_srcImage.clone( ); g_dstImage2= g_srcImage.clone( ); g_dstImage3= g_srcImage.clone( );

//显示原图

八、线性滤波

参数详解如下:第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U,CV_16U,CV_16S,CV_32F以及CV_64F之一。第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类
推荐度:
点击下载文档文档为doc格式
1mw8p938kf75cln2z0an3ef8l940oa007q1
领取福利

微信扫码领取福利

微信扫码分享