【OpenCV新手教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑 (4)

【OpenCV新手教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑





 

二、深入——OpenCV源代码分析溯源




本文的主角是OpenCV中的morphologyEx函数。它利用主要的膨胀和腐蚀技术。来执行更加高级的形态学变换,如开闭运算。形态学梯度。“顶帽”、“黑帽”等等。

这一节我们来一起看一下morphologyEx函数的源代码。

//-----------------------------------【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(), temp; _dst.create(src.size(), src.type()); Mat dst = _dst.getMat(); //一个大switch,依据不同的标识符取不同的操作 switch( op ) { case MORPH_ERODE: erode( src, dst, kernel, anchor, iterations, borderType, borderValue ); break; case MORPH_DILATE: dilate( src, dst, kernel, anchor, iterations, borderType, borderValue ); break; case MORPH_OPEN: erode( src, dst, kernel, anchor, iterations, borderType, borderValue ); dilate( dst, dst, kernel, anchor, iterations, borderType, borderValue ); break; case CV_MOP_CLOSE: dilate( src, dst, kernel, anchor, iterations, borderType, borderValue ); erode( dst, dst, kernel, anchor, iterations, borderType, borderValue ); break; case CV_MOP_GRADIENT: erode( src, temp, kernel, anchor, iterations, borderType, borderValue ); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue ); dst -= temp; break; case CV_MOP_TOPHAT: if( src.data != dst.data ) temp = dst; erode( src, temp, kernel, anchor, iterations, borderType, borderValue ); dilate( temp, temp, kernel, anchor,iterations, borderType, borderValue ); dst = src - temp; break; case CV_MOP_BLACKHAT: if( src.data != dst.data ) temp = dst; dilate( src, temp, kernel, anchor, iterations, borderType, borderValue); erode( temp, temp, kernel, anchor, iterations, borderType, borderValue); dst = temp - src; break; default: CV_Error( CV_StsBadArg, "unknown morphological operation" ); } }

看上面的源代码能够发现,事实上morphologyEx函数事实上就是内部一个大switch而已。依据不同的标识符取不同的操作。比方开运算MORPH_OPEN,按我们上文中解说的数学表达式,就是先腐蚀后膨胀,即依次调用erode和dilate函数。为非常简明干净的代码。

 




 


三、浅出——API函数高速上手

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpsff.html