分水岭算法

合集下载

分水岭 算法

分水岭 算法

分水岭算法1. 简介分水岭算法(Watershed algorithm)是一种图像分割算法,可以将图像中的不同区域进行分离和标记。

它基于图像的灰度值和梯度信息,将图像看作一个地形地貌,并从低处向高处逐渐充满水,直到不同区域之间的水汇聚形成分割线。

该算法最初是由Belknap和Hoggan在1979年提出的,后来被广泛应用于计算机视觉领域,特别是在医学图像处理、目标检测和图像分析等方面。

2. 原理2.1 灰度变换在进行分水岭算法之前,需要对原始图像进行灰度变换。

这可以通过将彩色图像转换为灰度图像来实现。

灰度图像中的每个像素点都代表了原始彩色图像中相应位置的亮度值。

2.2 梯度计算接下来,需要计算灰度图像中每个像素点的梯度值。

梯度表示了亮度变化的速率,可以帮助我们找到不同区域之间的边界。

常用的梯度计算方法有Sobel、Prewitt和Scharr等算子。

这些算子对图像进行卷积操作,将每个像素点的梯度计算为其周围像素点的亮度差值。

2.3 标记初始化在进行分水岭算法之前,需要为每个像素点初始化一个标记值。

通常情况下,我们可以将背景区域标记为0,前景区域标记为正整数。

2.4 梯度图像处理接下来,我们将梯度图像中的每个像素点看作一个地形地貌中的一个位置,并将其灌满水。

初始时,所有像素点的水位都是0。

2.5 水汇聚从灰度最小值开始,逐渐增加水位直到灰度最大值。

在每次增加水位时,会发生以下情况: - 当前水位高于某个位置的梯度值时,该位置被认为是不同区域之间的边界。

- 如果两个不同区域之间存在连接路径,则会发生水汇聚现象。

此时需要将这两个区域合并,并更新合并后区域的标记值。

2.6 分割结果当水位达到最大值时,分割过程结束。

此时所有不同区域之间都有了明确的边界,并且每个区域都有了唯一的标记值。

3. 算法优缺点3.1 优点•分水岭算法是一种无监督学习方法,不需要依赖任何先验知识或训练数据。

•可以对图像中的任意区域进行分割,不受形状、大小和数量的限制。

分水岭算法的概念及原理

分水岭算法的概念及原理

分水岭算法的概念及原理
分水岭算法(Watershed Algorithm)是一种用于图像分割的算法,它基于山脊线(ridge line)和水流的概念,能够将图像中的物体分割出来。

该算法的主要原理是将图像看作地形地貌,将亮度视作高程,通过模拟洪水灌溉的过程,将图像分割成多个区域。

分水岭算法的核心思想是:将图像中的亮度极值点视作各个地块的山峰,从这些山峰出发,模拟水流的分布过程,即从高处向低处流动,在流动的过程中形成不同的流域。

当水流面临两个流域的交汇区时,就会形成分水岭,从而将图像分割成多个区域。

具体的分水岭算法步骤如下:
1.预处理:将彩色图像转换成灰度图像,并进行平滑处理,以减少噪声的干扰。

2.计算梯度图像:通过计算图像灰度值的梯度来得到梯度图像。

梯度较大的地方通常表示物体的边界。

3.标记种子点:选取梯度图像中的极值点作为种子点(山峰),这些点将成为分水岭的起点。

4.洪水灌溉:从种子点开始模拟水流的分布过程。

初始化一个标记图像,将种子点周围标记为相应的流域。

然后将水从种子点开始向相邻的像素流动,直到遇到另一个流域或已经被标记过。

这样不断地灌溉,最终得到一个水流分布图。

6.后处理:将不可靠的区域(通常是细长的、过于小的区域)进行合并,得到最终的分割结果。

总的来说,分水岭算法是一种基于洪水灌溉模拟的图像分割算法,通过模拟水流的分布过程,将图像分割成多个区域,从而准确地分割出物体边界。

分水岭算法步骤

分水岭算法步骤

分水岭算法步骤分水岭算法是一种用于图像分割的算法,其原理是根据图像中不同区域的灰度差异来确定分割点,从而将图像分割成多个区域。

下面将详细介绍分水岭算法的步骤。

1. 图像预处理在使用分水岭算法进行图像分割之前,需要对图像进行预处理。

预处理的目的是去除噪声、平滑图像、增强图像的边缘等。

常见的预处理方法包括均值滤波、高斯滤波、中值滤波等。

2. 计算梯度图像梯度图像可以反映图像中不同区域的边缘信息。

通过计算图像的梯度,可以得到一个梯度图像,其中每个像素点的灰度值表示该点的梯度强度。

常用的方法是使用Sobel算子或Laplacian算子计算图像的梯度。

3. 计算图像的标记在分水岭算法中,需要将图像的每个像素点标记为前景、背景或未知区域。

通常情况下,可以通过用户输入或者阈值分割等方法来得到一个初始的标记图像。

4. 计算距离变换距离变换是指计算图像中每个像素点到最近的前景区域像素点的距离。

通过距离变换,可以得到一个距离图像,其中每个像素点的灰度值表示该点到最近前景像素点的距离。

5. 寻找种子点种子点是指位于图像中的一些特殊点,用于标记不同的区域。

通常情况下,种子点位于图像的前景和背景之间的边界处。

可以通过阈值分割等方法来寻找种子点。

6. 计算分水岭变换分水岭变换是一种基于图像的梯度和距离变换来确定图像分割的方法。

在分水岭变换中,首先将种子点填充到距离图像中,然后通过计算梯度和距离变换来确定分割线的位置,从而将图像分割为多个区域。

7. 后处理在得到分割后的图像之后,可能会存在一些图像分割不准确或者存在过度分割的问题。

因此,需要进行一些后处理的操作,如去除小的区域、合并相邻的区域等,以得到最终的分割结果。

总结起来,分水岭算法是一种基于图像的梯度和距离变换来进行图像分割的算法。

通过对图像进行预处理、计算梯度图像、计算标记、计算距离变换、寻找种子点、计算分水岭变换和后处理等步骤,可以得到一个准确的图像分割结果。

分水岭算法在图像分割领域具有广泛的应用,并且在处理复杂图像时能够取得较好的效果。

分水岭 算法

分水岭 算法

分水岭算法1. 介绍分水岭算法(Watershed algorithm)是一种图像处理算法,主要用于图像分割。

它以图像中的亮度或颜色信息为基础,将图像划分为不同的区域,从而实现图像的分割与提取。

分水岭算法的基本原理是将图像视为地形图,其中亮度或颜色信息类似于地形高度,而分水岭则代表不同的区域。

通过模拟水从高处流下,在分水岭相交的地方形成分割线,将图像分成不同的区域。

分水岭算法广泛应用于计算机视觉、图像分析、医学图像处理等领域。

它可以用于目标检测、图像分割、图像融合、边缘检测等任务。

分水岭算法具有较好的鲁棒性和适应性,对于不同类型的图像都能取得较好的效果。

2. 基本原理分水岭算法的基本原理可以概括为以下几个步骤:2.1 灰度化首先,将彩色图像转换为灰度图像。

这是因为分水岭算法主要基于图像的亮度信息进行分割,灰度图像能够更好地表达图像的亮度变化。

2.2 预处理对灰度图像进行预处理,包括去噪和平滑处理。

去噪可以使用各种滤波器,如中值滤波器、高斯滤波器等。

平滑处理可以使用图像平滑算法,如均值滤波器、高斯滤波器等。

预处理的目的是减少图像中的噪声和不必要的细节,使得后续的分割更加准确。

2.3 计算梯度图像通过计算图像的梯度,可以得到图像中的边缘信息。

常用的梯度算子有Sobel算子、Prewitt算子等。

梯度图像可以用来寻找图像中的边缘和区域边界。

2.4 标记种子点选择一些种子点,作为分水岭的起始点。

种子点通常位于图像中的明显边缘或区域边界处。

可以手动选择种子点,也可以使用自动选择的方法。

2.5 填充区域从种子点开始,利用水流模拟的方式填充整个图像。

水从高处向低处流动,当水流到达一个分水岭时,会分流到周围的区域中。

在水流过程中,会形成分割线,将图像分成不同的区域。

2.6 分割结果根据分水岭的位置,将图像分成不同的区域。

分割结果可以通过分水岭线进行可视化展示,也可以将不同区域标记为不同的颜色。

3. 算法改进分水岭算法在实际应用中存在一些问题,如过分细化、过分合并等。

分水岭算法

分水岭算法

分水岭算法有好多种实现算法,拓扑学,形态学,浸水模拟和降水模拟等方式。

分水岭算法(Watershed Algorithm),是根据分水岭的构成来考虑图像的分割。

现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕山,山围水的情形。

当然在需要的时候,要人工构筑分水岭,以防集水盆之间的互相穿透。

而区分高山(plateaus)与水的界线,以及湖与湖之间的间隔或都是连通的关系,就是分水岭(watershed)。

分水岭的计算过程是一个迭代标注过程。

分水岭比较经典的计算方法是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{.}表示梯度运算。

分水岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化,都会产生过度分割的现象。

但同时应当看出,分水岭算法对微弱边缘具有良好的响应,是得到封闭连续边缘的保证的。

另外,分水岭算法所得到的封闭的集水盆,为分析图像的区域特征提供了可能。

为消除分水岭算法产生的过度分割,通常可以采用两种处理方法,一是利用先验知识去除无关边缘信息。

二是修改梯度函数使得集水盆只响应想要探测的目标。

为降低分水岭算法产生的过度分割,通常要对梯度函数进行修改,一个简单的方法是对梯度图像进行阈值处理,以消除灰度的微小变化产生的过度分割。

即g(x,y)=max(grad(f(x,y)),gθ)式中,gθ表示阈值。

分水岭算法之自下而上的模拟泛洪的算法流程

分水岭算法之自下而上的模拟泛洪的算法流程

分水岭算法是一种用于图像分割的算法,它能够将图像中的不同区域进行分割,并找到它们之间的分界线。

此算法的主要思路是通过模拟泛洪的方式来不断扩展各个区域,直到它们彼此分离为止。

分水岭算法通常分为两种实现方式,一种是自上而下的方式,另一种是自下而上的方式。

本文将重点介绍和探讨自下而上的模拟泛洪的分水岭算法流程,以帮助读者更好地理解该算法的原理和实现方法。

一、初始化1. 为图像创建距离变换图:首先需要将输入的图像进行预处理,创建一个距离变换图。

距离变换图中的每个像素表示该像素到最近的边界像素的距离。

2. 初始化标记图:标记图用来记录每个像素的标记信息,标记哪些像素属于同一个区域。

初始化时,将标记图中的像素值都设为0。

3. 初始化队列:为了模拟泛洪的过程,需要使用一个队列来存储待处理的像素。

将图像中的所有边界像素加入到队列中。

二、泛洪过程1. 从队列中取出一个像素,并记录其标记值。

2. 遍历该像素周围的像素,如果周围的像素未被标记过且不是边界像素,则将其加入到队列中,并将其标记值设为与当前像素相同。

3. 如果周围的像素已被标记过,且标记值不同于当前像素,则说明这两个区域相遇了。

此时需要将它们之间的分界线更新为分水岭,并将其加入到分水岭集合中。

4. 重复以上步骤,直到队列为空。

三、分水岭线处理1. 对分水岭集合中的像素进行排序:根据它们到最近的边界像素的距离,对分水岭集合中的像素进行排序。

2. 将排序后的像素逐个取出,遍历其周围的像素:如果周围的像素属于相同的区域,则将其标记为该区域的像素。

3. 重复以上步骤,直到所有分水岭像素都被处理完毕。

四、结果展示1. 根据标记图,可以将图像进行分割并展示不同区域的边界线或分水岭线。

2. 可以对图像进行进一步的后处理,如去除噪声、优化分割结果等。

通过以上的介绍,相信读者对于自下而上的模拟泛洪的分水岭算法流程有了更深入的了解。

虽然分水岭算法在图像分割领域具有广泛的应用,但其实现过程相对复杂,需要深入理解其原理和算法流程。

分水岭 算法

分水岭 算法

分水岭算法分水岭算法是一种经典的图像处理和计算机视觉算法,常用于图像分割任务。

它被广泛应用于数字图像处理、目标检测和图像识别等领域。

本文将对分水岭算法进行介绍,并探讨其原理、应用和优缺点。

首先,我们来了解一下分水岭算法的原理。

分水岭算法基于图像的灰度或颜色信息,将图像视为一个地图,其中灰度值或颜色代表地势高度。

该算法的目标是通过在图像上放置一些种子点,然后利用水流的下降路径模拟水流的流动,最终将图像分割为不同的区域。

在分水岭算法中,首先需要对图像进行预处理,包括去噪和图像增强等操作。

接下来,根据预处理后的图像,构建一个梯度图,表示图像中的边缘和轮廓信息。

然后,根据种子点的位置,通过计算水流的流动路径,将图像分割成不同的区域。

最后,再根据分割结果进行进一步的后处理,消除不必要的分割和合并相邻的区域,从而得到最终的图像分割结果。

分水岭算法在图像处理和计算机视觉领域有着广泛的应用。

首先,它可以用于图像分割,即将图像划分为具有明显边界的不同区域,以便进一步对图像进行分析和识别。

例如,在医学图像分析中,可以利用分水岭算法对病变区域进行提取和分割,以辅助医生进行疾病诊断和治疗。

其次,分水岭算法还可以用于图像标记和目标检测。

通过在图像中放置种子点,并模拟水流的流动路径,可以将目标与背景分离,并进行像素级别的标记和识别。

例如,在自动驾驶和机器人导航中,可以利用分水岭算法对道路和障碍物进行分割和检测,以确保车辆的安全行驶。

此外,分水岭算法还可以用于图像修复和图像融合等应用,提高图像质量和视觉效果。

然而,分水岭算法也存在一些局限性和挑战。

首先,由于算法本身是基于像素的,对图像中的噪声和弱边缘比较敏感,容易产生过分割和欠分割的问题。

因此,对于复杂的图像或具有相似纹理的区域,分水岭算法可能无法准确地将其分割开来。

其次,分水岭算法在计算复杂度和时间消耗方面比较高,对于大规模图像和实时应用来说,可能会造成较高的计算负担。

因此,对于实时应用和大规模图像处理,需要进一步对算法进行改进和优化。

分水岭算法

分水岭算法

分水岭算法1. 简介分水岭算法是一种用于图像分割的算法。

通过将图像视为地形地貌,将图像中的每个像素视为一个水滴,从低处开始模拟水的渗透和汇聚过程,最终得到图像中的不同区域。

分水岭算法最初用于地理学中的水文地貌研究,后来被引入到计算机视觉领域中。

它在图像分割、目标检测、图像处理等方面具有广泛的应用。

2. 算法步骤分水岭算法包含以下几个步骤:2.1 图像预处理首先,对原始图像进行预处理,以便更好地进行分水岭算法的运算。

预处理的步骤可以包括灰度化、去噪、平滑滤波等。

2.2 计算图像的梯度梯度表示图像中每个像素的边缘强度。

通过计算图像的梯度,可以找到图像中的边缘和纹理信息。

常用的计算梯度的方法包括Sobel、Prewitt等算子。

2.3 寻找图像中的标记点标记点是分水岭算法中的关键概念,表示图像中的起始点或分水岭点。

标记点的选取对于最终分割结果有很大的影响。

通常情况下,可以通过阈值分割、连通区域分析等方法寻找图像中的标记点。

2.4 计算距离变换图距离变换图是一个将图像中每个像素替换为其与最近标记点之间距离的图像。

通过计算距离变换图,可以评估每个像素到最近标记点的距离。

2.5 计算分水岭线分水岭线是指图像中的边缘或过渡区域,它将不同的区域分隔开来。

通过计算距离变换图,可以找到图像中的分水岭线。

2.6 执行分水岭漫水算法最后,执行分水岭漫水算法,将图像中的每个像素与标记点进行比较,并根据像素值和距离变换图进行分割。

分水岭漫水算法会将图像中的不同区域分割成若干个连通区域。

3. 算法优缺点3.1 优点•分水岭算法可以对图像进行多种类型的分割,包括分割不完全的区域和不规则形状的目标。

•分水岭算法不需要预先知道目标的数量。

•分水岭算法可以自动识别图像中的背景和前景。

3.2 缺点•分水岭算法对于噪声和纹理较强的图像分割效果不理想。

•分水岭算法对于图像中的非连通区域分割效果差。

•分水岭算法具有较高的计算复杂度,对于大规模图像处理较为困难。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分水岭算法的概念及原理分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。

分水岭的概念和形成可以通过模拟浸入过程来说明。

在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。

分水岭的计算过程是一个迭代标注过程。

分水岭比较经典的计算方法是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{.}表示梯度运算。

分水岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化,都会产生过度分割的现象。

但同时应当看出,分水岭算法对微弱边缘具有良好的响应,是得到封闭连续边缘的保证的。

另外,分水岭算法所得到的封闭的集水盆,为分析图像的区域特征提供了可能。

为消除分水岭算法产生的过度分割,通常可以采用两种处理方法,一是利用先验知识去除无关边缘信息。

二是修改梯度函数使得集水盆只响应想要探测的目标。

为降低分水岭算法产生的过度分割,通常要对梯度函数进行修改,一个简单的方法是对梯度图像进行阈值处理,以消除灰度的微小变化产生的过度分割。

即g(x,y)=max(grad(f(x,y)),gθ)式中,gθ表示阈值。

程序可采用方法:用阈值限制梯度图像以达到消除灰度值的微小变化产生的过度分割,获得适量的区域,再对这些区域的边缘点的灰度级进行从低到高排序,然后在从低到高实现淹没的过程,梯度图像用Sobel算子计算获得。

对梯度图像进行阈值处理时,选取合适的阈值对最终分割的图像有很大影响,因此阈值的选取是图像分割效果好坏的一个关键。

缺点:实际图像中可能含有微弱的边缘,灰度变化的数值差别不是特别明显,选取阈值过大可能会消去这些微弱边缘。

分水岭算法(Watershed Algorithm)所谓分水岭算法有好多种实现算法,拓扑学,形态学,浸水模拟和降水模拟等方式。

要搞懂就不容易了。

Watershed Algorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。

现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕山,山围水的情形。

当然在需要的时候,要人工构筑分水岭,以防集水盆之间的互相穿透。

而区分高山(plateaus)与水的界线,以及湖与湖之间的间隔或都是连通的关系,就是我们可爱的分水岭(watershed)。

为了得到一个相对集中的集水盆,那么让水涨到都接近周围的最高的山顶就可以了,再涨就要漏水到邻居了,而邻居,嘿嘿,水质不同诶,会混淆自我的。

那么这样的话,我们就可以用来获取边界灰阶大,中间灰阶小的物体区域了,它就是集水盆。

浸水法,就是先通过一个适当小的阈值得到起点,即集水盆的底;然后是向周围淹没也就是浸水的过程,直到得到分水岭。

当然如果我们要一直淹没到山顶,即是一直处理到图像灰阶最高片,那么,当中就会出现筑坝的情况,不同的集水盆在这里想相遇了,我们要洁身自爱,到这里为止,因为都碰到边界了;那么即使在相遇时没有碰到最高灰阶的地方,也需要人工构筑分水岭,区分不同的区域。

不再上山。

构筑属于自己的分水岭在计算机图形学中,可利用灰度表征地貌高。

图像中我们可以利用灰度高与地貌高的相似性来研究图像的灰度在空间上的变化。

这是空域分析,比如还可以通过各种形式的梯度计算以得到算法的输入,进行浸水处理。

分水岭具有很强的边缘检测能力,对微弱的边缘也有较好的效果。

这与分水岭扩张的阈值的设置有关系,阈值可以决定集水盆扩张的范围。

但自我构筑的能力却不受影响。

为会么这么说呢?为什么有很强的边缘检测能力,而又能得到相对集中的连通的集水盆?现实中很好办,我们在往凹地加水的时候,直到它涨到这一块紧凑的山岭边缘就不加了;但是如果有一条小山沟存在,那没办法,在初始阈值分割的时候,也就是山沟与集水盆有同样的极小值,而且它们之间是以这个高度一直连接的。

那没关系,我们将它连通。

在图像上呢?如何实现?看看算法,算法思想是这样的:首先准备好山和初始的水。

这山就是我们的初始图像了,比如用自然获取的图像的梯度来表征山地的每一点的高度吧;而初始的水就是在阈值记为Thre底下,所有的低于这个高度的整个山地都加水,直到这个阈值Thre高度。

从而有三个初始量:unsigned char** Ori_image、char** Seed_image和int** Label_image。

最后一个是为最终的结果做准备的。

当然要做好初始化,比如,Ora_image赋值为原图像(256色灰度图)的梯度值,Seed_image则是初始状态下有水的置位,无水的复位,而Label_image则全初始化为0,最终得到的是各点对应的区域号。

接下来是考虑将已加的水进行记录,记录成连通的区域,也就是看看有多少个互不相关的集水盆,有五个,那么我们就涨出五个湖,而且尽可能的高,只要大家想到不溢出。

在算法上,有多少个连通的区域就记录成多少个数据结构,工夫就在于如何将这些连通的区域连接成一块,并由一个数据结构来表达了。

很好,我们准备用一个向量容器来实现初始保存,保存所有标记区域种子队列的数组,里面放的是种子队列的指针vector<queue<POINT>*> vque; ,而且这个队列是由一系列属于同一个区域的图像点组成,我们来自一个集水盆:);其保存方式是这样的:queue<point> *pque=new queue<point>[256];vque.push_back(pque),这样便将一个成员放进到这个区域来了,即容器--集水盆的保管都,容器中的每个指针,都指向一个集水盆,也就是我们要的连通区域;所以我们可以方便地由这个容器数据结构直接读值的方便性进行操作,一个脚标就可以得到一个区域(队列指针)的指针;而每个队列还不简单,并不是一列整形数那么易搞,所以说啊,这个算法,真头痛,这个队列的一个成员是一个点;而注意到vque里存放的一256个队列的的起始指针,真够残忍的。

也就是说vque [m] [n]就表达了一个队列,这个队列里可以存储操作一系列的点;显然容量取256是因为所有的初始或者是最终的区域中可能有0-256之间的不同的灰阶的点,那么我一个区域分用256个队列来记录这些成员点啦,很有可能,这里就只有一个集水盆,那么,256个灰阶的点都存在一个区域就有可能了统计初始连通区域的方法是,八连通邻域法(还有其他方法:四连通域,六连通域),即从逐一扫描输入的Seed_image的每个像素点,将所有的标记了的初始集水盆一一纳入各自的区域,这是整修图像的扫描,形成外循环。

先创建一个临时队列quetem,用来处理当前初始集水盆的连通连接,将逐一扫描到的属于一个特定的初始集水盆区域的可生长点暂存,并形成一个内循环。

对当前扫描点的处理是,首先判断该点是否为某个初始集水盆的点,如果不是跳过;接下来是,如果是初始集水盆的点,那么它的八连通域中是否存在不可生长的点(这里的不可生长是指Seed_image中没有标记的点),扫描的八连通邻域中的点是可生长的,即有标记的,则将之加入到临时队列中quetem;如果扫描到的连通邻域中有不可生长的至少一个点存在,那么加入到种子队列,记当前区域号为Num,当前扫描点为(m,n),从而当前的灰阶为Ori_image[m][n],将当前点添加到种子队列:vque[Num-1][Ori_image[m][n]].push(POINT(m,n))。

这里有两个循环,一个是quetem,另一个是Seed_image。

直到两个循环完整结束,那么就得到了各个连通初始集水盆的记录,保存标记是区域号Num;而我们同时得到了初始的分水岭,那就放在了保存地点vque,这里面标识了它们对应的区域号,和区域里面对应的点的灰阶,即是特定区域特定灰阶对应的点的集合;我们可以获取这些分水岭的点所在的区域号,可以得到该区域的所有的灰阶的点信息。

一句话,统计连通区域的功能有两个,一是标记初始区域,二是找分水岭初始的区域标记好了,分岭也找到了,那么可以开始“水漫梁山”了。

这就是淹没过程。

淹没过程由也是由一个内嵌循环的循环来实现的:外循环是做水位上升(这里循环次数一定要256以内),waterlevel的上升,原来是已经做过了初始的水位分割,那么现在可以从Thre 开始了,让水位慢慢上升,让它原本的湖慢慢扩张,尽量利用其应有的空间,而又不至于淹没到其它的邻居湖泊。

内循环是扫描每个初始区域(当前Num,从而有Num个循环)的分水岭的点(在vque[][]中),按照给定的水位进行扩张。

扩张过程是这样的:扫描到的分水岭的当前点,对其进行四连通邻域进行逐一检查,如果四连通域中有点没有标记的(那这一定是高度较高的点,较低的前面一定扫描过),那么先对该点以本区域号做标记Num(注意是当前的Num);再判断它在当前水位下是否可生长(灰阶是否小于等于waterlevel),如果可生长那么加入到vque[Num][waterlevel]种子队列中,将会再次进入内循环,否则如果在当前水位下不可生长,则加入到这个邻域点的分水岭集合中vque[Num][Ori_image[邻域点]]队列中。

如此往复循环,直到对应区域完成,一个水位,扫描所有的区域的分水岭,这样各自同时在一个水位下扩张,保证了不出现跳跃的情况出现(就是一个水位一个区域全局扩张)。

最终,所有的区域在每个水位都扩张完毕,得到了分割图,我们的大湖泊形成了这是分水岭算法的一种实现方式。

仔细考察不难发现这种实现方式不能产生新的集水盆,也就是说,由于初始集水盆的局限性,很可能会浪费大部分没有发掘出来的起始点较高的集水盆地。

这样,我们就要对算法进行修改了。

实现方式是:在淹没的过程中,我们是由阈值Thre的水位开始淹没的,那么我们可以对初始区域之外的没有标记的点(从Seed_image 中考察),对之进行标记,条件是先把这一轮的内循环做好,然后在剩下的没标记区域中发掘新的集水盆,并加入到我们的种子队列中,下一个水位开始,就又多了一个新成员了,让它们不断膨胀,成长,拥有自己的小天的成员就会逐一的被分割出来。

相关文档
最新文档