【OpenCV入门教程之十一】 形态学图像处理 二开运算 闭运算 形态学梯度( 三 )


//-----------------------------------【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 = http://www.kingceram.com/post/_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" );}}
看上面的源码可以发现 , 其实函数其实就是内部一个大而已 。根据不同的标识符取不同的操作 。比如开运算 , 按我们上文中讲解的数学表达式 , 就是先腐蚀后膨胀 , 即依次调用erode和函数 , 为非常简明干净的代码 。
三、浅出——API函数快速上手
3.1 函数详解
上面我们已经讲到 , 函数利用基本的膨胀和腐蚀技术 , 来执行更加高级形态学变换 , 如开闭运算 , 形态学梯度 , “顶帽”、“黑帽”等等 。这一节我们来了解它的参数意义和使用方法 。
C++: void morphologyEx(InputArray src,OutputArray dst,int op,InputArraykernel,Pointanchor=Point(-1,-1),intiterations=1,intborderType=BORDER_CONSTANT,constScalar& borderValue=http://www.kingceram.com/post/morphologyDefaultBorderValue() );
另有CV版本的标识符也可选择 , 如 ,  ,  ,  , 这应该是.0系列版本遗留下来的标识符 , 和上面的“”一样的效果 。
其中 , t函数的第一个参数表示内核的形状 , 我们可以选择如下三种形状之一:
而t函数的第二和第三个参数分别是内核的尺寸以及锚点的位置 。
我们一般在调用erode以及函数之前 , 先定义一个Mat类型的变量来获得t函数的返回值 。对于锚点的位置 , 有默认值Point(-1,-1) , 表示锚点位于中心 。且需要注意 , 十字形的形状唯一依赖于锚点的位置 。而在其他情况下 , 锚点只是影响了形态学运算结果的偏移 。
t函数相关的调用示例代码如下: