所谓分水岭算法有好多种实现算法,拓扑学,形态学,浸水模拟和降水模拟等方式。要搞懂就不
容易了。WatershedAlgorithm( 分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。现
实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕山,山围水的情形。而区分高山
(plateaus )与水的界线,以及湖与湖之间的间隔或都是连通的关系,就是我们可爱的分水岭
(watershed)。为了得到一个相对集中的集水盆,那么让水涨到都接近周围的最高的山顶就可以了,再
涨就要漏水到邻居了,而邻居,嘿嘿,水质不同诶,会混淆自我的。那么这样的话,我们就可以用来
获取边界高度大,中间灰阶小的物体区域了,它就是集水盆。浸水法,就是先通过一个适当小的阈值
得到起点,即集水盆的底;然后是向周围淹没也就是浸水的过程,直到得到分水岭。当然如果我们要
一直淹没到山顶,即是一直处理到图像灰阶最高片,那么,当中就会出现筑坝的情况,不同的集水盆
在这里想相遇了,我们要洁身自爱,到这里为止,因为都碰到边界了。不再上山。构筑属于自己的分
水岭。在计算机图形学中,可利用灰度表征地貌高。图像中我们可以利用灰度高与地貌高的相似性来
研究图像的灰度在空间上的变化。这是空域分析,比如还可以通过各种形式的梯度计算以得到算法的
输入,进行浸水处理。分水岭具有很强的边缘检测能力,对微弱的边缘也有较好的效果。为会么这么
说呢?为什么有很强的边缘检测能力,而又能得到相对集中的连通的集水盆?现实中很好办,我们在
往凹地加水的时候,直到它涨到这一块紧凑的山岭边缘就不加了;但是如果有一条小山沟存在,那没
办法,在初始阈值分割的时候,也就是山沟与集水盆有同样的极小值,而且它们之间是以这个高度一
直 连 接 的 。 那 没 关 系 , 我 们 将 它 连 通 。 在 图 像 上 呢 ? 如 何 实 现 ?
首先准备好山和初始的水。这山就是我们的初始图像了,比如用自然获取的图像的梯度来表征山
地的每一点的高度吧;而初始的水就是在阈值记为 Thre 底下,所有的低于这个高度的整个山地都加
水,直到这个阈值 Thre 高度。从而有三个初始量:unsignedchar**Ori_image、char**Seed_image 和
int**Label_image。最后一个是为最终的结果做准备的。当然要做好初始化,比如,Ori_image 赋值为原
图像(256 色灰度图)的梯度值,Seed_image 则是初始状态下有水的置位,无水的复位,而 Label_image
则全初始化为 0,最终得到的是各点对应的区域号。接下来是考虑将已加的水进行记录,记录成连通的
区域,也就是看看有多少个互不相关的集水盆,有五个,那么我们就涨出五个湖,而且尽可能的高,
只要大家想到不溢出。在算法上,有多少个连通的区域就记录成多少个数据结构,功夫就在于如何将
这些连通的区域连接成一块,并由一个数据结构来表达了。很好,我们准备用一个向量容器来实现初
始保存,保存所有标记区域种子队列的数组,里面放的是种子队列的指针<vector*>vque,而且这个队
列是由一系列属于同一个区域的图像点组成,我们来自一个集水盆:);其保存方式是这样的: