OpenCV3.0形态学

原创 2017年01月03日 21:07:13

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]来生成目录:

版权声明:本文为博主原创文章,未经博主允许不得转载。

(未实用)opencv3.0 函数学习 9——膨胀与腐蚀

(膨胀与腐蚀需要进行类封装) 以下内容转载自   http://blog.csdn.net/poem_qianmo/article/details/23710721 本篇文章中,我们一起探究...
  • banjiding8023
  • banjiding8023
  • 2016年08月09日 14:58
  • 1026

二值图像--形态学处理2 腐蚀和膨胀

学习DIP第12天 开篇废话     今天来介绍形态学中最基础也是最重要的两个操作,腐蚀和膨胀,腐蚀和膨胀基本上是所有形态学操作的基础,除此之外还有补集(即二值图全部取反的操作,0变1,1变0),和反...
  • TonyShengTan
  • TonyShengTan
  • 2014年12月25日 19:47
  • 6433

2014.2.21 形态学开操作 膨胀腐蚀

一    引言         数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。1964年法国的Matheron和Serra在积分几何的研究...
  • junshen1314
  • junshen1314
  • 2014年02月21日 16:32
  • 1714

【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀

形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。 数学形态学(Math...
  • zhmxy555
  • zhmxy555
  • 2014年04月14日 23:12
  • 96968

数学形态学之二值形态学(腐蚀、膨胀、开闭运算)基本原理

数学形态学
  • zxli3011
  • zxli3011
  • 2016年01月15日 12:32
  • 7306

二值图像的膨胀操作及c++实现

应用背景:二值图像的初等形态学运算中的膨胀操作是腐蚀操作的逆运算。
  • yi_tech_blog
  • yi_tech_blog
  • 2017年05月27日 22:40
  • 510

形态学滤波:腐蚀与膨胀(一)

一、自己使用过的关于二值化、膨胀、腐蚀以及拟合椭圆中心的代码如下: bool detectEllipse(const Mat &img, vector &data) { vector c...
  • Yong_Qi2015
  • Yong_Qi2015
  • 2016年10月27日 21:03
  • 1543

腐蚀膨胀等形态学处理c代码

// Morph.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "cv.h" #include "highgui.h" ...
  • hit2015spring
  • hit2015spring
  • 2016年05月15日 22:12
  • 1408

形态学运算之基本概念

形态学运算是针对二值图像依据数学形态学(Mathematical Morphology)的集合论方法发展起来的图像处理方法。 通常,形态学图像处理表现为一种邻域运算形式,一种特殊定义的领域称之为“结构...
  • nature_XD
  • nature_XD
  • 2017年03月22日 17:25
  • 818

OpenCv学习笔记(五)-数学形态学2(灰度级膨胀和腐蚀及c语言实现)

一 基本概念 所谓的灰度级膨胀和腐蚀即将而知图像的二值形态学运算推广到灰度图像上。对于一幅图像的腐蚀(膨胀)运算定义为对每个像素赋值为某个领域内输入图像灰度级的最小(或最大值)。在二值变换中的...
  • Augusdi
  • Augusdi
  • 2013年05月02日 16:31
  • 5044
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV3.0形态学
举报原因:
原因补充:

(最多只允许输入30个字)