[OpenCV] 形态学滤波 (补充)

发布时间 2023-04-17 09:26:05作者: 冷小男

作用:

开运算(先腐蚀后膨胀) : 用来消除小物体,再纤细点处分离物体,并且再光滑较大的物体的边界的同时不明显改变其面积

闭运算 (先膨胀后腐蚀):能够排除小型黑洞

形态学梯度 (膨胀 减去 腐蚀): 对二值图像进行这一操作可以把blob的边缘突出出来,我们可以用
形态学梯度来保留物体的边缘轮廓

顶帽 (原图 减去 开运算): 由于开运算的结果是放大了裂缝或者局部低亮度的区域,因此,再原图中减去开运算后的图 -------- 得到比原图轮廓周围更明亮的区域
往往用来分离比临近点亮一些的版块

黑帽(闭运算 减去 原图) : 突出了比原图轮廓周围区域更暗的区域
用来分离比临近点暗一些的斑块

MorphologyEx

CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );

 

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可.图像位深应该为以下5种之一:CV_8U、CV_16U、CV_16S、CV_32F和CV_64F。

第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。

第三个参数,int类型的op,表示形态学运算的类垣,可以是如表6.2中任意之一的标识符。
      MORPH_OPEN 开运算
      MORPH_CLOSE 闭运算
      MORPH_GRADIENT 形态梯度学
      MORPH_TOPHAT 顶帽
      MORPH_BLACKHAT 黑帽
      MORPH_ERODE 腐蚀
      MORPH_DILATE 膨胀

第四个参数,InputArray类型的kernel,形态学运算的内核,若为NULL,表示的是使用参考点位于中心3x3的核。一航使用函数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 = getStructuringEllement(MORPH_RECT,
Size(2 * g_nStructBLlementSize + 1, 2 * g_nStructElementSize + 1 ),
Point(g_nStructELlementSize, g_nStructElementSize));

 

调用之后,我们可以在接下来调用erode或dilate函数时,在第三个参数填保存了getStructuringElement返回值的Mat类型变量。对应于上面的示例,就是element变量。

第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。

第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_CONSTANT。

第八个参数,constScalar&类型的bordervalue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般不用去管它。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。其中的这些操作都可以进行就地(in-place)操作,且对于多通道图像,每一个通道都单独进行操作。