分享

opencv 分水岭算法cvWatershed

 昵称12326663 2013-05-13
opencv 分水岭算法cvWatershed(2012-09-04 16:42:04)
标签:

分水岭

it

分类: 专业
“分水岭的计算过程是一个迭代标注过程。分水岭比较经典的计算方法是L. Vincent提出的。在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。

分水岭变换得到的是输入图像的集水盆图像,集水盆之间的边界点,即为分水岭。显然,分水岭表示的是输入图像极大值点。因此,为得到图像的边缘信息,通常把梯度图像作为输入图像,g(x,y)=grad(f(x,y))={[f(x,y)-f(x-1,y)]2[f(x,y)-f(x,y-1)]2}0.5 式中,f(x,y)表示原始图像,grad{.}表示梯度运算。分水岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化,都会产生过度分割的现象。但同时应当看出,分水岭算法对微弱边缘具有良好的响应,是得到封闭连续边缘的保证的。另外,分水岭算法所得到的封闭的集水盆,为分析图像的区域特征提供了可能。

    为消除分水岭算法产生的过度分割,通常可以采用两种处理方法,一是利用先验知识去除无关边缘信息。二是修改梯度函数使得集水盆只响应想要探测的目标。

   Opencv中cvWatershed(const Mat &image , Mat& markers);函数并不是上述采用传统的方法。markers即是输入矩阵也是输出矩阵,大小与image大小相同。使用该函数的时候,用户在markers矩阵中必须粗略指定两种以上区域,该区域为1个点以上的连通点集,并用不同的正整数(1,2,3…)标记。这些区域可以用cvFindContour(),和cvDrawContour()标记。用户或算法可以通过画一条简单的线,有效地告知分水岭算法把这些点组合起来。markers矩阵其他区域为0。调用cvWatered()函数后,markers矩阵中所有为0的部分被重新标记为正整数,或为-1,-1代表住起来的坝。详细的部分可以参数opencv中自带的Watershed Demo。

OpencvcvWatershed()函数的原理,可以参考F. Meyer.Color image segmentation

  分水岭分割技术是一种很优秀的且得到了广泛应用的分割技术,从本质上讲,它属于一种基于区域增长的分割方法,但它得到的确是目标的边界,且是连续、闭合、但像素宽的边界。在很多领域,这种分割技术都得到了广泛的应用,但分水岭分割却有一个致命的弱点,那就是容易产生过分割,对于噪声和细密纹理非常敏感,使其常常产生严重的过分割结果。所以,针对这个问题,很多人提出了很多种改进的分水岭分割技术。综合来讲,大概也就三类。其一,分割预处理。既在应用分水岭分割之前对图像进行一些预处理,诸如除噪,求梯度图像,形态学重建,标记前景背景等等,一个目的,减少小的积水盆,从而减少过分割区域的数量。其二,分割后处理。既在应用分水岭分割之后对结果图像进行合并处理。如果初始分割产生过多小区域,合并处理会具有很大的运算量,所以后处理的时间复杂度经常较高,还有合并准则的确定,也是一件比较麻烦的事情,通常有基于相邻区域的平均灰度信息和边界强度信息的合并准则,不同的合并准则会得到不同的分割结果。其三,就是既有预处理又有后处理的分割技术了,根据具体应用领域的要求,如果只是采取预处理或后处理还不能得到满意的效果,那就把他们都用上试试.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多