图像腐蚀和膨胀胀的作用,开运算和腐蚀的异同,闭运算和膨胀的异同

您的位置: &
数学形态学腐蚀膨胀运算的快速算法
优质期刊推荐效果图制作
联系我们021-
承接全国室内外效果图制作◆品质专业◆价格从优!
电话:021-
当前位置: >
【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑 2009室内装修效果图
【opencv入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑上篇文章中,我们重点了解了腐蚀和膨胀这两种最基本的形态学操作,而运用这两个基本操作,我们可以实现更高级的形态学变换。所以,本文的主角是opencv中的morphologyex函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算、形态学梯度、&顶帽&、&黑帽&等等。先上几张示例程序的截图吧:有没有很熟悉这张图?没错,这就是最近热映的电影captain america~下面这张图的效果就有些凶残了:ok,截图先看到这里。在正文之前先来唠唠和主题相关的事情。第一件事,opencv最新版本更新到了2.4.9。在写这篇博文的两天之前(4月25日上午),opencv官网页面显示最新版本还是2.4.8,但是通过浅墨细心地发现,文档页面的标题已经悄悄而低调地改成了2.4.9.所以我们当时应该可以去断定,opencv2.4.9应该马上就要和我们见面了。果然,opencv2.4.9就在两天后(4月27日),正式在opencv官方网站上上线了。现在转到opencv的官方主页,赫然发现最新版本已然显示为2.4.9:这是opencv的官方主页传送门:http://opencv.org/大家可以自己前去看看以及下载最新版本的opencv。如果不出意外的话呢,下次文章我们就将紧跟时代,用上最新版本的opencv2.4.9进行讲解和程序的书写,所以,大家在看这篇文章之后呢,可以去下载当前最新的2.4.9版本并装上配置好。第二件事,是浅墨想跟大家做一个关于opencv系列文章的书写内容和风格的思想汇报。是这样的,浅墨发现最近几期写出来的文章有些偏离自己开始开这个专栏的最初的愿望&&原理和概念部分占的比重有些大,有些弱化opencv实际的使用。写这些博文的初心是教大家如何使用opencv来写代码,原理部分我想很多朋友应该多少都懂,就算某些同学对某些概念有些模糊,大家也完全可以带着关键词句去google或者百度。浅墨的想法是,以后的专栏文章原理部分尽量从简,&深入&的源码剖析部分也是从简,重点突出&浅出&部分,让大家快速上手opencv函数的使用,这样浅墨的工作量也会小很多,更新也会更勤。ps:浅墨其实每次在写图像处理原理部分的时候都特纠结,因为浅墨其实感兴趣的家装餐厅设计效果图和大家一样,也是如何写代码,而不是那些多多少少让人提不起兴趣来的图像处理公式和概念。这往往就照成了博文更新的拖延症。所以呢,在浅墨以后写的opencv文章中,原理和深入部分我们就点到为止,文章的拳头内容是&浅出&部分,重点教大家如何快速上手opencv api。我想这也是大家一直期待和想要看到的浅墨出品的文章的样子吧。:)ok,大概就是这些。我们开始今天的正题。一、理论与概念讲解&&从现象到本质首先呢,要知道形态学的高级形态,往往都是建立在腐蚀和膨胀这两个基本操作之上的。而关于腐蚀和膨胀,概念和细节以及相关代码可以看浅墨之前写的这篇文章:【opencv入门教程之十】 形态学图像处理(一):膨胀与腐蚀对膨胀和腐蚀心中有数了,接下来的高级形态学操作,应该就不难理解。另外,为了下面对比和演示以及理解的方便,浅墨自己制作了一张毛笔字图,这里先上原图:ok,我们开始讲解。1.1 开运算(opening operation)开运算(opening operation),其实就是先腐蚀后膨胀的过程。其数学表达式如下:开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。效果图是这样的:实际效果图:1.2 闭运算(closing operation)先膨胀后腐蚀的过程称为闭运算(closing operation),其数学表达式如下:闭运算能够排除小型黑洞(黑色区域)。效果图如下所示:实际效果图:1.3 形态学梯度(morphologicalgradient)形态学梯度(morphological gradient)为膨胀图与腐蚀图之差,数学表达式如下:对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓,如下所示:实际素材效果图:1.4 顶帽(top hat)顶帽运算(top hat)又常常被译为&礼帽&运算。为原图像与上文刚刚介绍的&开运算&的结果图之差,数学表达式如下:因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。如下所示校园绿化效果图:素材效果图:1.5 黑帽(black hat)黑帽(black hat)运算为&闭运算&的结果图与原图像之差。数学表达式为:黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。所以,黑帽运算用来分离比邻近点暗一些的斑块。非常完美的轮廓效果图:实际素材效果图:二、深入&&opencv源码分析溯源本文的主角是opencv中的morphologyex函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算,形态学梯度,&顶帽&、&黑帽&等等。这一节我们来一起看一下morphologyex函数的源代码。[cpp] view plaincopyprint?//-----------------------------------【erode()函数中文注释版源代码】----------------------------//说明:以下代码为来自于计算机开源视觉库opencv的官方源代码//opencv源代码版本:2.4.8//源码路径:&\opencv\sources\modules\imgproc\src\morph.cpp//源文件中如下代码的起始行数:1369行//中文注释by浅墨//--------------------------------------------------------------------------------------------------------void cv::morphologyex( inputarray _src,outputarray _dst, int op,inputarray kernel, pointanchor, int iterations,int bordertype, constscalar& bordervalue ){//拷贝mat数据到临时变量mat src = _src.getmat(),_dst.create(src.size(), src.type());mat dst = _dst.getmat();//一个大switch,根据不同的标识符取不同的操作switch( op ){case morph_erode:erode( src, dst, kernel, anchor, iteration室内装修施工合同s, bordertype, bordervalue );case morph_dilate:dilate( src, dst, kernel, anchor, iterations, bordertype, bordervalue );case morph_open:erode( src, dst, kernel, anchor, iterations, bordertype, bordervalue );dilate( dst, dst, kernel, anchor, iterations, bordertype, bordervalue );case cv_mop_close:dilate( src, dst, kernel, anchor, iterations, bordertype, bordervalue );erode( dst, dst, kernel, anchor, iterations, bordertype, bordervalue );case cv_mop_gradient:erode( src, temp, kernel, anchor, iterations, bordertype, bordervalue );dilate( src, dst, kernel, anchor, iterations, bordertype, bordervalue );dst -=case cv_mop_tophat:if( src.data != dst.data )temp =erode( src, temp, kernel, anchor, iterations, bordertype, bordervalue );dilate( temp, temp, kernel, anchor,iterations, bordertype, bordervalue );dst = src -case cv_mop_blackhat:if( src.data != dst.data )temp =dilate( src, temp, kernel, anchor, iterations, bordertype, bordervalue);erode( temp, temp, kernel, a建筑效果图公司组成nchor, iterations, bordertype, bordervalue);dst = temp -default:cv_error( cv_stsbadarg, "unknown morphological operation" );}}//-----------------------------------【erode()函数中文注释版源代码】----------------------------//说明:以下代码为来自于计算机开源视觉库opencv的官方源代码//opencv源代码版本:2.4.8//源码路径:&\opencv\sources\modules\imgproc\src\morph.cpp//源文件中如下代码的起始行数:1369行//中文注释by浅墨//--------------------------------------------------------------------------------------------------------void cv::morphologyex( inputarray _src,outputarray _dst, int op,inputarray kernel, pointanchor, int iterations,int bordertype, constscalar& bordervalue ){//拷贝mat数据到临时变量mat src = _src.getmat(),_dst.create(src.size(), src.type());mat dst = _dst.getmat();//一个大switch,根据不同的标识符取不同的操作switch( op ){case morph_erode:erode( src, dst, kernel, anchor, iterations, bordertype, bordervalue );case morph_dilate:dilate( src, dst, kernel, anchor, iterations, bordertype, bordervalue );case morph_open:erode( src, dst, kernel, anchor, iterations, bordertype, bor室内设计师网dervalue );dilate( dst, dst, kernel, anchor, iterations, bordertype, bordervalue );case cv_mop_close:dilate( src, dst, kernel, anchor, iterations, bordertype, bordervalue );erode( dst, dst, kernel, anchor, iterations, bordertype, bordervalue );case cv_mop_gradient:erode( src, temp, kernel, anchor, iterations, bordertype, bordervalue );dilate( src, dst, kernel, anchor, iterations, bordertype, bordervalue );dst -=case cv_mop_tophat:if( src.data != dst.data )temp =erode( src, temp, kernel, anchor, iterations, bordertype, bordervalue );dilate( temp, temp, kernel, anchor,iterations, bordertype, bordervalue );dst = src -case cv_mop_blackhat:if( src.data != dst.data )temp =dilate( src, temp, kernel, anchor, iterations, bordertype, bordervalue);erode( temp, temp, kernel, anchor, iterations, bordertype, bordervalue);dst = temp -default:cv_error( cv_stsbadarg, "unknown morphological operation" );}}看上面的源码可以发现,其实morphologyex函数其实就是内部一个大switch而已。根据不同的标识符取不同的操作。比如开运算morp房屋装修设计效果图h_open,按我们上文中讲解的数学表达式,就是先腐蚀后膨胀,即依次调用erode和dilate函数,为非常简明干净的代码。三、浅出&&api函数快速上手3.1 morphologyex函数详解上面我们已经讲到,morphologyex函数利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,如开闭运算,形态学梯度,&顶帽&、&黑帽&等等。这一节我们来了解它的参数意义和使用方法。[cpp] view plaincopyprint?c++: void morphologyex(inputarray src,outputarray dst,int op,inputarraykernel,pointanchor=point(-1,-1),intiterations=1,intbordertype=border_constant,constscalar& bordervalue=morphologydefaultbordervalue() );c++: void morphologyex(inputarray src,outputarray dst,int op,inputarraykernel,pointanchor=point(-1,-1),intiterations=1,intbordertype=border_constant,constscalar& bordervalue=morphologydefaultbordervalue() );第一个参数,inputarray类型的src,输入图像,即源图像,填mat类的对象即可。图像位深应该为以下五种之一:cv_8u, cv_16u,cv_16s, cv_32f 或cv_64f。第二个参数,outputarray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:morph_open & 开运算(opening operation)morph_close & 闭运算(closing operation)morph_gradient -形态学梯度(morphological gradient)morph_tophat - &顶帽&(&top hat&)morph_blackhat -3d效果图渲染 不动 &黑帽&(&black hat&)另有cv版本的标识符也可选择,如cv_mop_close,cv_mop_gradient,cv_mop_tophat,cv_mop_blackhat,这应该是opencv1.0系列版本遗留下来的标识符,和上面的&morph_open&一样的效果。第四个参数,inputarray类型的kernel,形态学运算的内核。若为null时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getstructuringelement配合这个参数的使用。getstructuringelement函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getstructuringelement我们上篇文章中讲过了,这里为了大家参阅方便,再写一遍:其中,getstructuringelement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:矩形: morph_rect交叉形: morph_cross椭圆形: morph_ellipse而getstructuringelement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。我们一般在调用erode以及dilate函数之前,先定义一个mat类型的变量来获得getstructuringelement函数的返回值。对于锚点的位置,有默认值point(-1,-1),表示锚点位于中心。且需要注意,十字形的element形状唯一依赖于锚点的位置。而在其他情况下,锚点只是影响了形态学运算结果的偏移。getstructuringelement函数相关的调用示例代码如下:[cpp] view plaincopyprint?int g_nstructelementsize = 3; //结构元素(内核矩阵)的尺寸//获取自定义核mat element =getstructuringelement(morph_rect,size(2*g_nstructelementsize+1,2*g_nstructelementsize+1),point(g_nstructelementsize, g_nstructelementsize ));int g_nstructelementsize = 3; //结构元素(内核矩阵)的尺寸//获取自定义核mat element =getstructuringele校园绿化效果图ment(morph_rect,size(2*g_nstructelementsize+1,2*g_nstructelementsize+1),point(g_nstructelementsize, g_nstructelementsize ));调用这样之后,我们便可以在接下来调用erode、dilate或morphologyex函数时,kernel参数填保存getstructuringelement返回值的mat类型变量。对应于我们上面的示例,就是填element变量。第五个参数,point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。第七个参数,int类型的bordertype,用于推断图像外部像素的某种边界模式。注意它有默认值border_ constant。第八个参数,const scalar&类型的bordervalue,当边界为常数时的边界值,有默认值morphologydefaultbordervalue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createmorphologyfilter()函数得到更详细的解释。其中的这些操作都可以进行就地(in-place)操作。且对于多通道图像,每一个通道都是单独进行操作。ok,讲解完毕,下面就是使用的范例。高能预警!高能预警!高能预警!一大波示例代码正在逼近。为了方便大家需要的时候随时取用。下面我们依次列举出开运算,闭运算,形态学梯度,顶帽,黑帽,腐蚀,膨胀的效果实现简化版完整代码。其实说白了,这些代码基本上内容一致,其实就是改一下morphologyex里面的第三个标识符参数而已。核都是选的morph_rect,矩形元素结构。另外,通过看源码我们发现,最基本的腐蚀和膨胀操作也可以用morphologyex函数来实现,他们由morphologyex函数源码中switch的前两个case来实现(虽然在case体内就是简单地各自调用了一下erode和dilation函数,但还是有写出来的必要)。所以在这里,我们也用morphologyex再重新来实现一遍他们。按着顺序来列出吧,就直接列详细注释好的代码和运行结果了。3.2 开运算示例程序opencv中调用morphologyex函数进行开运算操作的示例程序如下:[cpp] view plaincopypri07客厅吊顶效果图nt?//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】开运算");namedwindow("【效果图】开运算");//显示原始图imshow("【原始图】开运算", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_open, element);//显示效果图imshow("【效果图】开运算", image);waitkey(0);return 0;}//-----------------------------------【头房屋室内装修图文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】开运算");namedwindow("【效果图】开运算");//显示原始图imshow("【原始图】开运算", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_open, element);//显示效果图imshow("【效果图】开运算", image);waitkey(0);return 0;}运行效果图:3.3 闭运算示例程序opencv中调用morphologyex函数进行闭运算操作的示例程序如下:[cpp] view plaincopyprint?//07装修设计效果图-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】闭运算");namedwindow("【效果图】闭运算");//显示原始图imshow("【原始图】闭运算", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_close, element);//显示效果图imshow("【效果图】闭运算", image);waitkey(0);return 0;}//-----------------------------------【头文件包含建筑 效果图 素材部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】闭运算");namedwindow("【效果图】闭运算");//显示原始图imshow("【原始图】闭运算", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_close, element);//显示效果图imshow("【效果图】闭运算", image);waitkey(0);return 0;}运行效果图:3.4 形态学梯度示例程序opencv中调用morphologyex函数进行形态学梯度操作的示例程序如下:[cpp] view plaincopyprint?/效果图大全/-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】形态学梯度");namedwindow("【效果图】形态学梯度");//显示原始图imshow("【原始图】形态学梯度", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_gradient, element);//显示效果图imshow("【效果图】形态学梯度", image);waitkey(0);return 0;}//-----------------------------67平米室内装修------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】形态学梯度");namedwindow("【效果图】形态学梯度");//显示原始图imshow("【原始图】形态学梯度", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_gradient, element);//显示效果图imshow("【效果图】形态学梯度", image);waitkey(0);return 0;}运行效果图:3.5 顶帽运算(top hat)示例程序opencv中调用morphologyex函数进行顶帽运算操作的示例程序如下室内3d效果图:[cpp] view plaincopyprint?//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】顶帽运算");namedwindow("【效果图】顶帽运算");//显示原始图imshow("【原始图】顶帽运算", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_tophat, element);//显示效果图imshow("【效果图】顶帽运算", image);waitkey(0);return 0;}//-------手绘室内效果图----------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】顶帽运算");namedwindow("【效果图】顶帽运算");//显示原始图imshow("【原始图】顶帽运算", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_tophat, element);//显示效果图imshow("【效果图】顶帽运算", image);waitkey(0);return 0;}运行效果图:3.6 黑帽运算(blackhat)示例程序opencv中调用morphologyex室内设计专业教程函数进行黑帽运算操作的示例程序如下:[cpp] view plaincopyprint?//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】黑帽运算");namedwindow("【效果图】黑帽运算");//显示原始图imshow("【原始图】黑帽运算", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_blackhat, element);//显示效果图imshow("【效果图】黑帽运算", image);waitkey客厅电装修效果图(0);return 0;}//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】黑帽运算");namedwindow("【效果图】黑帽运算");//显示原始图imshow("【原始图】黑帽运算", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_blackhat, element);//显示效果图imshow("【效果图】黑帽运算", image);waitkey(0);return 0;}运行效果图:3.7 腐蚀(morphologyex调用建筑效果图psd版)示例程序opencv中调用morphologyex函数进行腐蚀操作的示例程序如下:[cpp] view plaincopyprint?//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】腐蚀");namedwindow("【效果图】腐蚀");//显示原始图imshow("【原始图】腐蚀", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_erode, element);//显示效果图imshow("【效果图】腐蚀", 3d草坪制作image);waitkey(0);return 0;}//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】腐蚀");namedwindow("【效果图】腐蚀");//显示原始图imshow("【原始图】腐蚀", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_erode, element);//显示效果图imshow("【效果图】腐蚀", image);waitkey(0);return 0;}运行效果图:3.8 膨胀(morphologyex客厅墙装修效果图调用版)示例程序opencv中调用morphologyex函数进行膨胀操作的示例程序如下:[cpp] view plaincopyprint?//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】膨胀");namedwindow("【效果图】膨胀");//显示原始图imshow("【原始图】膨胀", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_dilate, element);//显示效果图imshow("【效果图】膨胀厂区绿化效果图", image);waitkey(0);return 0;}//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】---------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//载入原始图mat image = imread("1.jpg");//工程目录下应该有一张名为1.jpg的素材图//创建窗口namedwindow("【原始图】膨胀");namedwindow("【效果图】膨胀");//显示原始图imshow("【原始图】膨胀", image);//定义核mat element = getstructuringelement(morph_rect, size(15, 15));//进行形态学操作morphologyex(image,image, morph_dilate, element);//显示效果图imshow("【效果图】膨胀", image);waitkey(0);return 0;}运行效果图:四、综合示例&家装 3d效果图&在实战中熟稔依然是每篇文章都会配给大家的一个详细注释的博文配套示例程序,把这篇文章中介绍的知识点以代码为载体,展现给大家。这个示例程序中,一共有四个显示图像的窗口。原始图一个,开/闭运算为一个,腐蚀/膨胀为一个,顶帽/黑帽运算为一个。分别使用滚动条,来控制得到的形态学效果。且迭代值为10的时候,为中间。另外,还可以通过键盘按键1,2,3以及空格,来调节成不同的元素结构(矩形、椭圆、十字形)。说明页面如下:废话不多说,上代码吧:[cpp] view plaincopyprint?//-----------------------------------【程序说明】----------------------------------------------//程序名称::《【opencv入门教程之十一】形态学图像处理(一):膨胀与腐蚀》 博文配套源码//开发所用ide版本:visual studio 2010//开发所用opencv版本:2.4.8//日 create by 浅墨//----------------------------------------------------------------------------------------------//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】--------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//----------ps园林效果图制作-------------------------【全局变量声明部分】--------------------------------------//描述:全局变量声明//-----------------------------------------------------------------------------------------------mat g_srcimage, g_//原始图和效果图int g_nelementshape = morph_//元素结构的形状//变量接收的trackbar位置参数int g_nmaxiterationnum = 10;int g_nopenclosenum = 0;int g_nerodedilatenum = 0;int g_ntopblackhatnum = 0;//-----------------------------------【全局函数声明部分】--------------------------------------//描述:全局函数声明//-----------------------------------------------------------------------------------------------static void on_openclose(int, void*);//回调函数static void on_erodedilate(int, void*);//回调函数static void on_topblackhat(int, void*);//回调函数static void showhelptext();//帮助文字显示//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//改变console字体颜色system("color 2f");showhelptext();//载入墙效果图大全2012原图g_srcimage = imread("1.jpg");//工程目录下需要有一张名为1.jpg的素材图if( !g_srcimage.data ) { printf("oh,no,读取srcimage错误~! \n"); }//显示原始图namedwindow("【原始图】");imshow("【原始图】", g_srcimage);//创建三个窗口namedwindow("【开运算/闭运算】",1);namedwindow("【腐蚀/膨胀】",1);namedwindow("【顶帽/黑帽】",1);//参数赋值g_nopenclosenum=9;g_nerodedilatenum=9;g_ntopblackhatnum=2;//分别为三个窗口创建滚动条createtrackbar("迭代值", "【开运算/闭运算】",&g_nopenclosenum,g_nmaxiterationnum*2+1,on_openclose);createtrackbar("迭代值", "【腐蚀/膨胀】",&g_nerodedilatenum,g_nmaxiterationnum*2+1,on_erodedilate);createtrackbar("迭代值", "【顶帽/黑帽】",&g_ntopblackhatnum,g_nmaxiterationnum*2+1,on_topblackhat);//轮询获取按键信息while(1){//执行回调函数on_openclose(g_nopenclosenum, 0);on_erodedilate(g_nerodedilatenum, 0);on_topblackhat(g_ntopblackhatnum,0);//获取按键c = waitkey(0);//按下键盘按键q或者esc,程序退出if( (char)c == 'q'||(char)c == 27 )//按下键盘按键1,使用椭圆(elliptic)结构元素结构元素morph_ellipseif( (char)c == 49 )//键盘按键1的asii码为49g_nelementshape = morph_//按下键盘按键2,使用矩形(rectangle)结构元素morph_rectelse if( (char)c == 50 )//键盘按键2的asii码为50g_nelementshape = morph_//按下键盘按键3,使用十字形(cross-shaped)结构元素morph室内设计师之路_crosselse if( (char)c == 51 )//键盘按键3的asii码为51g_nelementshape = morph_//按下键盘按键space,在矩形、椭圆、十字形结构元素中循环else if( (char)c == ' ' )g_nelementshape = (g_nelementshape + 1) % 3;}return 0;}//-----------------------------------【on_openclose( )函数】----------------------------------//描述:【开运算/闭运算】窗口的回调函数//-----------------------------------------------------------------------------------------------static void on_openclose(int, void*){//偏移量的定义int offset = g_nopenclosenum - g_//偏移量int absolute_offset = offset > 0 ? offset : -//偏移量绝对值//自定义核mat element = getstructuringelement(g_nelementshape, size(absolute_offset*2+1, absolute_offset*2+1), point(absolute_offset, absolute_offset) );//进行操作if( offsetmorphologyex(g_srcimage, g_dstimage, cv_mop_open, element);elsemorphologyex(g_srcimage, g_dstimage, cv_mop_close, element);//显示图像imshow("【开运算/闭运算】",g_dstimage);}//-----------------------------------【on_erodedilate( )函数】----------------------------------//描述:【腐蚀/膨胀】窗口的回调函数//-----------------------------------------------------校园绿化效果图------------------------------------------static void on_erodedilate(int, void*){//偏移量的定义int offset = g_nerodedilatenum - g_//偏移量int absolute_offset = offset > 0 ? offset : -//偏移量绝对值//自定义核mat element = getstructuringelement(g_nelementshape, size(absolute_offset*2+1, absolute_offset*2+1), point(absolute_offset, absolute_offset) );//进行操作if( offseterode(g_srcimage, g_dstimage, element);elsedilate(g_srcimage, g_dstimage, element);//显示图像imshow("【腐蚀/膨胀】",g_dstimage);}//-----------------------------------【on_topblackhat( )函数】--------------------------------//描述:【顶帽运算/黑帽运算】窗口的回调函数//----------------------------------------------------------------------------------------------static void on_topblackhat(int, void*){//偏移量的定义int offset = g_ntopblackhatnum - g_//偏移量int absolute_offset = offset > 0 ? offset : -//偏移量绝对值//自定义核mat element = getstructuringelement(g_nelementshape, size(absolute_offset*2+1, absolute_offset*2+1), point(absolute_offset, absolute_offset) );//进行操作if( offsetmorphologyex(g_sr装修效果图大全2010图片cimage, g_dstimage, morph_tophat , element);elsemorphologyex(g_srcimage, g_dstimage, morph_blackhat, element);//显示图像imshow("【顶帽/黑帽】",g_dstimage);}//-----------------------------------【showhelptext( )函数】----------------------------------//描述:输出一些帮助信息//----------------------------------------------------------------------------------------------static void showhelptext(){//输出一些帮助信息printf("\n\n\n\t请调整滚动条观察图像效果~\n\n");printf( "\n\n\t按键操作说明: \n\n""\t\t键盘按键【esc】或者【q】- 退出程序\n""\t\t键盘按键【1】- 使用椭圆(elliptic)结构元素\n""\t\t键盘按键【2】- 使用矩形(rectangle )结构元素\n""\t\t键盘按键【3】- 使用十字型(cross-shaped)结构元素\n""\t\t键盘按键【空格space】- 在矩形、椭圆、十字形结构元素中循环\n""\n\n\t\t\t\t\t\t\t\t by浅墨");}//-----------------------------------【程序说明】----------------------------------------------//程序名称::《【opencv入门教程之十一】形态学图像处理(一):膨胀与腐蚀》 博文配套源码//开发所用ide版本:visual studio 2010//开发所用opencv版本: 2.4.8//日 create by 浅墨//----------------------------------------------------------------------------------------------//-----------------------------------【头文件包含部分】---------------------------建筑效果图制作学习------------//描述:包含程序所依赖的头文件//----------------------------------------------------------------------------------------------#include#include#include//-----------------------------------【命名空间声明部分】--------------------------------------//描述:包含程序所使用的命名空间//-----------------------------------------------------------------------------------------------//-----------------------------------【全局变量声明部分】--------------------------------------//描述:全局变量声明//-----------------------------------------------------------------------------------------------mat g_srcimage, g_//原始图和效果图int g_nelementshape = morph_//元素结构的形状//变量接收的trackbar位置参数int g_nmaxiterationnum = 10;int g_nopenclosenum = 0;int g_nerodedilatenum = 0;int g_ntopblackhatnum = 0;//-----------------------------------【全局函数声明部分】--------------------------------------//描述:全局函数声明//-----------------------------------------------------------------------------------------------static void on_openclose(int, void*);/室内装修报价/回调函数static void on_erodedilate(int, void*);//回调函数static void on_topblackhat(int, void*);//回调函数static void showhelptext();//帮助文字显示//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数,我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){//改变console字体颜色system("color 2f");showhelptext();//载入原图g_srcimage = imread("1.jpg");//工程目录下需要有一张名为1.jpg的素材图if( !g_srcimage.data ) { printf("oh,no,读取srcimage错误~! \n"); }//显示原始图namedwindow("【原始图】");imshow("【原始图】", g_srcimage);//创建三个窗口namedwindow("【开运算/闭运算】",1);namedwindow("【腐蚀/膨胀】",1);namedwindow("【顶帽/黑帽】",1);//参数赋值g_nopenclosenum=9;g_nerodedilatenum=9;g_ntopblackhatnum=2;//分别为三个窗口创建滚动条createtrackbar("迭代值", "【开运算/闭运算】",&g_nopenclosenum,g_nmaxiterationnum*2+1,on_openclose);createtrackbar("迭代值", "【腐蚀/膨胀】",&g_nerodedilatenum,g_nmaxiterationnum*2+1,on_erodedilate);createtrackbar("迭代值", "【顶帽/黑帽】",&g_ntopblackhatnum,g_nmaxiterationnum*2+1,on_topblackhat);//轮询获取按键信息while(1){//执行回调函数on_住宅室内装修设计openclose(g_nopenclosenum, 0);on_erodedilate(g_nerodedilatenum, 0);on_topblackhat(g_ntopblackhatnum,0);//获取按键c = waitkey(0);//按下键盘按键q或者esc,程序退出if( (char)c == 'q'||(char)c == 27 )//按下键盘按键1,使用椭圆(elliptic)结构元素结构元素morph_ellipseif( (char)c == 49 )//键盘按键1的asii码为49g_nelementshape = morph_//按下键盘按键2,使用矩形(rectangle)结构元素morph_rectelse if( (char)c == 50 )//键盘按键2的asii码为50g_nelementshape = morph_//按下键盘按键3,使用十字形(cross-shaped)结构元素morph_crosselse if( (char)c == 51 )//键盘按键3的asii码为51g_nelementshape = morph_//按下键盘按键space,在矩形、椭圆、十字形结构元素中循环else if( (char)c == ' ' )g_nelementshape = (g_nelementshape + 1) % 3;}return 0;}//-----------------------------------【on_openclose( )函数】----------------------------------//描述:【开运算/闭运算】窗口的回调函数//-----------------------------------------------------------------------------------------------static void on_openclose(int, void*){//偏移量的定义int offset = g_nopenclosenum - g_//偏移量int absolute_offset = offset > 0 ? offset : -//偏移量绝对值//自定义核mat element = getstructuringelement(g_nelementshape, size(absolute_offse室内装修材料t*2+1, absolute_offset*2+1), point(absolute_offset, absolute_offset) );//进行操作if( offset0 ? offset : -//偏移量绝对值//自定义核mat element = getstructuringelement(g_nelementshape, size(absolute_offset*2+1, absolute_offset*2+1), point(absolute_offset, absolute_offset) );//进行操作if( offset0 ? offset : -//偏移量绝对值//自定义核mat element = getstructuringelement(g_nelementshape, size(absolute_offset*2+1, absolute_offset*2+1), point(absolute_offset, absolute_offset) );//进行操作if( offset放出一些效果图:首先是原图:非常帅气的captain america有木有!腐蚀效果图:膨胀效果图:开运算效果图:闭运算效果图:顶帽运算效果图:黑帽运算效果图:好的,就放出这些效果图吧,具体更多的运行效果大家就自己下载示例程序回去玩~本篇文章的配套源代码请点击这里下载:【浅墨opencv入门教程之十一】配套源代码下载ok,今天的内容大概就是这些,我们下篇文章见:)posted on
08:39 风云逸 阅读(...) 评论(...)编辑 收藏提供大量的建筑设计图,住宅建筑设计图,房屋建筑设计图,建筑设计效果图,建筑效果图,建筑设计平面图,住宅建筑设计图,以及大量的室内效果图、室外效果图作品,可以免费下载。
3d室内效果图专业制作公司
室内效果图,装修效果图,客厅效果图公装室内设计效果图—公共环境,办公空间.桑拿洗浴中心.夜总会 ,量贩KTV娱乐空间及中西餐厅等效果图设计作品. 别墅豪宅效果图设计—高档住宅和别墅豪宅,地产样板房售楼部等家居相关类空间装饰效果图设计及外观设计. 宾馆酒店效果图设计—饭店宾馆酒店的室内装饰设计.含五星级酒店大堂.宴会厅.西餐厅以及客房.总统套房的等空间
最好的效果图公司
室内设计、建筑设计公司哪家好?图50设计团队自2006年成立,拥有六百多名室内外效果图设计师。专业从事:室内、室外、3D、家装、建筑、景观、工装、鸟瞰、展示设计、装修效果图等类的效果图制作。堪称室内外效果图大全。我们以效率高、品质高、价格低的原则真诚服务于全国各地的客户,欢迎大家了前来咨询!
经过十余年的室内装修设计效果图制作以及建筑,景观等室外效果图设计,得到万千客户的认可,赢得了很高的荣誉,图50设计团队是国内最好的效果图公司【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑 2009室内装修效果图TAG:,,
家装效果图①
工装效果图②
建筑效果图③
景观绿化效果
其它效果图}

我要回帖

更多关于 opencv 腐蚀膨胀 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信