图像处理(3):
形态学滤波(5):核心API函数: morphologyEx()
上面已经讲到,morphologyEx函数利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,如开闭运算、形态学梯度、“顶帽”、“黑帽”等。下面我们来详细地讲解它的参数意义和使用方法。
C++: void morphologyEx(
InputArray src,
outputArray dst,int op,
InputArraykernel,
Pointanchor=Point (-1,-1) ,intiterations=l,
intborderType=BORDER_CONSTANT,
constScalar& bordervalue=morphologyDefaultBordervalue () );
·第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下5种之一:CV_8U.CV_16U.CV_16S.CV_32F和 CV_64F。
·第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
·第三个参数,int类型的op,表示形态学运算的类型,可以是如表6.2中任意之一的标识符。
对于OpenCV2,另有CV版本的标识符也可选择,如CV_MOP_CLOSE、cV_MOP_GRADIENT 、 cV_MOP_TOPHAT . cV_MOP_BLACKHAT ,这是OpenCV1.0系列版本遗留下来的标识符,在OpenCV2中和上面的“MORPH_OPEN"具有一样的效果,但已经在 OpenCV3中废止。
·第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL,表示的是使用参考点位 于中心3×3的核。一般使用函数 getStructuringElement配合这个参数的使用。 getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getStructuringElement 我们之前有讲到过,这里为了大家参阅方便,再写一遍。
getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:
·矩形———MORPH_RECT
·交叉形———MORPH_CROSs
·椭圆形———MORPH_ELLIPSE
而getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。
一般在调用erode 以及 dilate函数之前,要先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值 Point(-1,-1),表示锚点位于中心。另外需要注意:十字形的element形状唯一依赖于锚点的位置。而在其他情况下,锚点只是影响形态学运算结果的偏移。
getStructuringElement 函数相关的调用示例代码如下。
int g _nStructElementsize = 3;//结构元素(内核矩阵)的尺寸
//获取自定义核
Mat element =getStructuringElement (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)操作,且对于多通道图像,每一个通道都单独进行操作。