OpenCV3.0形态学

来源:互联网 发布:注册会计师题库软件 编辑:程序博客网 时间:2024/05/14 01:59

OpenCV3.0形态学

基本的形态学变化包括膨胀(dilation)和腐蚀(erosion)。膨胀与腐蚀能实现多种多样的功能,主要有:

  • 去除噪声
  • 分割出图像当中的独立元素,在图像中连接相邻的元素
  • 寻找图像中明显的极大值区域和极小值区域
  • 求出图像的梯度

腐蚀和膨胀


膨胀(Dilation)是指将一些图像或者图像当中的一部分区域(称之为A)与核(称之为B)进行卷积。核可以是任何的形状或者大小,它有一个单独定义出来的参考点(anchor point)。多数情况下,核是一个小的中间带有参考点的实心正方形或者圆盘,可以将它看做是模板或者掩码。膨胀是求局部最大值的操作,如下图所示,核B与图像卷积,计算B覆盖区域像素点的最大值,并且把这个最大值赋值给参考点指定的像素。达成的效果就是图像当中的高亮区域逐渐增长。
膨胀效果原理图
腐蚀是膨胀的反操作。腐蚀操作主要是计算核区域像素的最小值,如下图所示,腐蚀的过程是:当B与图像卷积时,计算被B覆盖的区域的最小像素值,并且把这个值放置到参考点上面。
腐蚀效果原理图
形态学腐蚀膨胀的公式如下:

erode(x,y)=min(x,y)kernelsrc(x+x,y+y)

dilate(x,y)=max(x,y)kernelsrc(x+x,y+y)

一般来讲,膨胀扩展了区域A,而腐蚀缩小了区域A。此外,膨胀可以填补凹洞,腐蚀能够消除细小的凸起。准确的效果取决于核的选取,不过以上的效果能够在选取凸核时很好地实现。下面我们使用OpenCV3.0.0调用erode和dilate两个函数,完成腐蚀和膨胀的实现。
这里写图片描述

OpenCV3.0提供了erode和dilate方法,实现形态学的腐蚀和膨胀。

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

erode方法的参数主要是前面三个需要设置,前两个src是输入的原始图像,第二个dst是腐蚀操作的结果。关键参数是kernel,为了个性定制想要的kernel,我们可以使用下面的函数完成:

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

该函数第一个参数是shape,表示生成的形状属于何种,如下所示:

enum MorphShapes {MORPH_RECT    = 0, //方形MORPH_CROSS   = 1, //十字形MORPH_ELLIPSE = 2 //椭圆形};

膨胀方法:

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

本文使用的kernel为3*3的十字形,参考点设置为默认的中心位置。腐蚀和膨胀得到的结果分别如下图:
这里写图片描述这里写图片描述这里写图片描述

高级形态学处理方法

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() );

该方法其中的int型op参数定义了不同的操作类型,如下:

enum MorphTypes{MORPH_ERODE    = 0, //腐蚀MORPH_DILATE   = 1, //膨胀MORPH_OPEN     = 2, //形态学开运算MORPH_CLOSE    = 3, //形态学闭运算MORPH_GRADIENT = 4, //形态学梯度MORPH_TOPHAT   = 5, //礼帽运算MORPH_BLACKHAT = 6  //黑帽运算        };

开运算(Opening Operation)

开运算是先腐蚀再膨胀的过程,作用是消除小物体、在纤细处分离物体、平滑较大物体的边界、断开目标物之间的粘连同时并不明显改变目标物的面积。开运算经常用于统计二值图像中的区域数。例如,拍摄到一张显微镜下面的细胞图片,并且对该图片进行了阈值化的处理,可以使用开运算将相邻的细胞区分开来,然后再计算图像中的区域(细胞)数目。
形态学开运算,向上的孤立点被消除
这里写图片描述这里写图片描述

闭运算(Closing Operation)

闭运算是先膨胀,后腐蚀的过程。作用是能够去掉小型的低灰度值区域,也就是“填平”的作用。
形态学闭运算,消除低亮度值的孤立点
这里写图片描述这里写图片描述

形态学梯度(Morphological Gradient)

形态学梯度为膨胀图与腐蚀图之差,计算公式如下:

gradient(src)=dilate(src)erode(src)

对二值图像进行该操作能够将团块(Blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓。下图解释了这一操作的过程:形态梯度在灰度图像应用,在灰度值变化最剧烈的区域得到的结果数值最大。右下图是操作结果,图像的边缘以高亮区域突出。
这里写图片描述

礼帽(Top Hat)

礼帽操作是从A减去A的开运算,计算公式为

TopHat(src)=srcopen(src)

这里写图片描述这里写图片描述这里写图片描述
因为开运算带来的结果是放大了裂缝或者是局部低亮度区域,因此,从原图中减去开运算后的图像,得到的效果突出了比原图轮廓周围区域更亮明亮的区域,并且这一操作和选择的核的大小相关。上图参与计算的核大小为3*3的MORPH_CROSS类型。礼帽运算往往用来分离比临近点亮一些的斑块。当微小目标有规律的情况下,可以使用礼帽运算进行背景提取。

黑帽(Black hat)

黑帽运算是闭运算的结果与原图像之差。计算公式为:

BlackHat(src)=close(src)src

黑帽运算后的效果突出了比原图轮廓周围区域更暗的区域,且这一操作和选择的核大小相关。所以,黑帽运算用于分离比邻近点暗一些的区域。
这里写图片描述这里写图片描述这里写图片描述

[TOC]来生成目录:

  • OpenCV30形态学
    • 腐蚀和膨胀
    • 高级形态学处理方法
      • 开运算Opening Operation
      • 闭运算Closing Operation
      • 形态学梯度Morphological Gradient
      • 礼帽Top Hat
      • 黑帽Black hat

0 0
原创粉丝点击