基于OpenCV的分水岭分割算法的及应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于OpenCV的分水岭分割算法的研究及应用
[摘要]本文对基于形态学分水岭算法进行了深入的研究,并针对其存在的过分割问题对分水岭算
法提出改进:使用区域合并方法限制允许出现的区域的数目,这种改进的方法不仅可以很好地抑制
过分割问题,还能有效分割出图像中的感兴趣区域,以达到提取图像有效边缘信息的目的。将此方
法在OpenCV下进行实验,结果表明这种方法可以有效清除干扰噪声及局部极小值,从而得到精确
的分割结果。
[关键词]分水岭算法;过分割;区域合并;OpenCV
[中图分类号]TP391.4[文献标识码]A[文章编号]1008-178X(2012)12-0020-03
燕杨1,2,王云吉2
(1.长春师范学院计算机科学与技术学院,吉林长春
130032;2.吉林大学通信工程学院,吉林长春130022)
[收稿日期]2012-07-16
[基金项目]吉林省科技发展计划项目青年科研基金(201201112)。
[作者简介]燕杨(1981-),女,吉林长春人,长春师范学院计算机科学与技术学院讲师,博士研究生,从事数字图像处理研究。第31卷第12期
Vol.31No.12长春师范学院学报(自然科学版)JournalofChangchunNormalUniversity(NaturalScience)2012年12月Dec.2012
1分水岭算法简介
分水岭算法是基于形态学的图像分割方法,其分割特点为定位精确和分割图像边缘准确,在图像分割领域得到了广泛的应用。在许多实际情况下,我们要分割图像,但无法从背景图像中获得有用信息。分水岭算法在这方面往往是有效的,该算法可以将图像中的边缘转化为“山脉”,将均匀区域转化为“山谷”以便分隔目标。分水岭算法先计算灰度图像的梯度,让亮度值低的点(山谷)、山脊对应的边缘(山头)同时形成,然后从指定点开始持续“灌注”盆地,直到这些区域链接在一起。这种方法产生的标记可以把各个区域合并到一起,合并后的区域又通过“聚集”的方式进行分割,好像图像被“填充”起来一样。与
指示点相连的盆地就为指示点“所拥有”
,从而得到被分割成相应的标记区域的图像。分水岭算法允许用户来标记目标某个部分为目标,或背景的某个部分为背景。用户也可以通过画一条简单的线,告知分水岭算法把这些点组合起来。分水岭算法就会通过“拥有”边沿定义的山谷来分割图像。
分水岭算法定位精确且分割细致,对微弱的物体边缘响应比较敏感,能确保得到目标区域封闭连续边缘。但物体表面一些细微的灰度变化以及图像中的噪声干扰等因素皆会导致对图像过度分割的产生,从而产生过多无用的边缘信息。
本文在对分水岭算法进行了深入的研究的基础上针对其过分割的问题提出改进:使用区域合并方法限制允许出现的区域的数目,这样不仅可以有效地抑制过分割问题,还能较好地分割出图像中的目标区域,以达到提取图像有效边缘信息的目的。
2原理
2.1分水岭传统方法
分水岭分割方法是基于拓扑理论的形态学分割方法,它的基本概念是将图像看成地形学上被水覆盖的自然地貌,图像中的每一点像素的灰度值表示这一点海拔的高度,其中每一个局部极小值和它所影响的区域称为集水盆,集水盆的边界形成了分水岭[1];其思想和形成可以通过模拟“溢流”的过程来说明:首先,20··
在各个极小区域的底部打一个小孔,让水从孔中溢出,慢慢浸没极小区域周围的区域,这样各个极小区域所波及的范围就是相应的集水盆,各个不同区域的水相连时的边界,就是想要获取的分水岭[2]。
分水岭的经典算法是L.Vincent提出的模拟沉浸算法,其计算过程是一个迭代标注过程。在这个算法中两个步骤,分别是排序过程和淹没过程[3];首先对各个像素的灰度级进行低到高排序,然后在从低到高实施浸没的过程中,对各个局部极小值在h阶-高度的影响域采用FIFO(先进先出)结构来进行判断和标注[4]。
设hmin和hmax是灰度图像I的最低灰度和最高灰度,Th(I)表示灰度值小于等于阈值h的所有像素,即Th(I)={p|I(p)≤h}。M1,M2,…,MR为图像中的局部最小点,即低洼。C(Mi)表示与低洼Mi相对应的集水盆地。Ch(Mi)表示C(Mi)的一个子集,它由该集水盆地中灰度值小于等于h的所有像素组成,即Ch(Mi)=C(Mi)∩Th(I)。minh(I)表示灰度值等于h的所有局部最小值。
令C[h]表示所有集水盆地中灰度值小于等于阈值h的像素集合,即:C[h]=
R
t
=1
胰C h(M i).
那么,C[hmax]就是所有集水盆地的并集。显然,C[h-1]是Th(I)的一个子集。
假设已经得到阈值h-1下的C[h-1],现在需要从C[h-1]获得C[h]。若Y为包含于Th(I)的一个连通成分,则Y与C[h-1]的交集有以下三种可能:(1)Y∩C[h-1]为空;(2)Y∩C[h-1]不为空且包含C[h-1]中的一个连通分量;(3)Y∩C[h-1]不为空且包含C[h-1]中的多个连通分量。
于是,C[h]就包含对C[h-1]中的各集水盆地在水平h下扩展得到的区域以及水平h下新出现的低洼。模拟沉浸法将C[hmin]初始化为Thmin(I),从最小灰度hmin开始,逐灰度级由C[h-1]构造出C[h],直到hmax,此时,得到的C[hmax]就是所需标记的集水盆地。其他不属于任何一个集水盆地的点就是分水线点,通过在图像中求C[hmax]的补集可以得到[5]。
2.2改进方法
利用上述传统方法经常会因为噪声的干扰和梯度的局部不规则性影响而造成过度分割。如对图1使用传统算法得到的实验结果如图2所示,图2中的过度分割产生了很多无关的边缘信息,过多的无关信息让结果没有意义。
图1原图像图2使用传统分水岭分割算法得到的结果
利用区域合并的方法来限制出现的区域的数目可以有效解决该问题。控制过度分割,我们将标记作为基础。本文以Opencv中的函数cvWatershed(constMat&image,Mat&markers)为例进行说明。markers即是输入矩阵也是输出矩阵,大小与image大小相同。使用该函数时,在markers矩阵中粗略指定两种以上区域,该区域为1个点以上的连通点集,并用不同的正整数(1,2,3…)标记。这些区域可以用cvFindContour(),和cvDrawContour()标记。用户或算法可以通过画一条简单的线,有效地告知分水岭算法把这些点组合起来。markers矩阵其他区域为0。调用cvWatered()函数后,markers矩阵中所有为0的部分被重新标记为正整数,或为-1,-1代表筑起来的坝。
标记是图像的连通分量,分为内部标记和外部标记,内部标记与目标体相关,外部标记与背景相关。图像中存在的许多隐含的极小值是导致图2过度分割的原因之一,因为这些区域都很小,所以这些值中有很多是没有意义的细节。此时将图像用平滑滤波器过滤,将这些对图像产生影响的极小的无关细节降到最少,
21
··