基于分水岭的图像分割程序设计

摘 要

在图像处理中,图像分割是一项非常关键的技术,在图像工程中占有重要的地位。随着科学技术的发展,它在众多领域中有着广泛的应用。如医学、地质、环保、气象。常见的分割算法包括阔值分割算法、边缘检测方法、区域提取方法和结合特定理论工具分割法。采用了标记分水岭算法对图像进行分割,先对图像进行灰度图像的转化,在进行梯度分割,构造出区域连接图和最小生成树,然后对他们整合。针对分水岭算法对梯度图像强度的变化分水岭算法对梯度图像强度的变化非常敏感,分水岭算法得到分割结果的时候往往会存在过分分割现象本文通过分别对前景对象和背景对象进行标记,来获得更加完善的效果。

关键词:标记分水岭;梯度图像;Matlab

目 录

1 绪论 ........................................................................................................................................ 1

1.1研究目的及意义 ........................................................................................................... 1

1.2国内外现状 ................................................................................................................... 1

1.3本文研究内容 ............................................................................................................... 2

2 图像分割算法综述 ................................................................................................................ 2

2.1图像分割的概述 ........................................................................................................... 2

2.2图像分割方法介绍 ....................................................................................................... 3

2.2.1阈值的分割方法 ................................................................................................. 3

2.2.2基于区域分割方法 ............................................................................................. 3

2.2.3基于边缘的图像分割 ......................................................................................... 5

2.2.4基于聚类分析的图像分割方法 ......................................................................... 6

3 分水岭图像分割算法 ............................................................................................................ 7

3.1分水岭算法原理 ........................................................................................................... 7

3.2分水岭算法特征 ........................................................................................................... 8

3.3梯度图像获取 ............................................................................................................... 8

3.3.1图像梯度的实现 ................................................................................................. 8

3.3.2 梯度图像处理方法 ............................................................................................ 9

3.4标记对象 ..................................................................................................................... 10

4 分水岭算法实现 .................................................................................................................. 11

4.1分水岭算法实现流程 ................................................................................................. 11

4.2程序代码 ..................................................................................................................... 12

5 仿真结果及分析 .................................................................................................................. 16

结论 .......................................................................................................................................... 29

参考文献 .................................................................................................................................. 30

1 绪论

1.1研究目的及意义

图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程,其中的独特性区域可以是图像的颜色、灰度、纹理、轮廓等,而目标可以对应某一块所需要处理单位区域,也可是对应的多个处理区域。近年来,随着各科学新理论和新方法的提出,人们也提出了一些特定理论、方法和工具相结合的分割记住,其中基于形态学得分割算法是目前使用较为广泛的算法之一。

数字图像分割在数学图像的处理和计算机视觉领域中是一个备受关的研究分支在目标分割和提取的过程中可以运用大量的数字处理方法,结合它在计算机上所产生的视觉,模式识别等领域中的运用,吸引了一大群研究者的关注。数学图像分割技术所带来的社会意义,加上研究者的研究,使得数学图像分割技术在深入的研究中不断的完善。将会推动一系列的科学分之发展,比如,模式识别,计算机视觉,人工智能等。在最近的20年中图像分割得到了广泛的关注和发展,国内外的很多研究人士提出了许多的方法,在各个不同的领域中都取得了响应的成果。但是在对于一种能过普遍应用于各种复杂情况和准确性很高的分割检测算法,还存在大量的提升空间。目前的方法和理论还有许多不完善的地方,这就需要不断的探索不断的改进和发展。

图像有许多的复杂性和多义性,大部分的分割的过程无法依靠计算机单独完成,但是手工分割的工作量大的惊人,而且对于地位非常困难,所以,有些人提出了人工河计算机交互自动接合定位的方法,结合各自的优势,来实现对目标轮廓的快速定位。相信这些交互式方法的应用,必将推动图像目标分割与提取这一既具有广阔的应用前景又具有重要的学术价值的课题的进一步研究,也必将成为一个更为独立和活跃的研究领域。

1.2国内外现状

据数字图像处理技术的发展来看,实时性在实际应用中运用非常广泛。实时图像处理系统的主要难点在于如何在有限的时间里完成大批量的数据处理。因为要对图像进行处理,为了实现实时图像处理快速,高效的处理,在系统中图像处理的速度要达到一定的速度,然而图像处理的速度是由执行短发的时间,视频输入输出延迟以及外部数据存

储器与DSP 的数据交换效率来决定的。从而产生了许多种图像分割算法。比如阈值分割算法, 基于区域分割算法,以及基于边缘的图像分割。

分水岭(watershed )算法法是一种已经发展起来的数学形态图像分割方法。该方法之所以能引起人们的重视,第一是因为它的计算速度比较快,第二是因为物理轮廓线的封闭性,第三是因为它的定位分厂精确。但是分水岭算法在微弱边缘处理也拥有很好的响应。

分水岭算法最初是由Digabel 和Lantuejoul 引入图像处理领域,用于分析简单的二值图像。,Beucher,Vincent 等人往深处研究,得到更通用的模型,建立了分水岭算法的理论,大量的用于灰度图像的分割。它的思想虽然简单,但是设计方法比较困难,早期因为计算机的落后导致该方法计算负担过重,所消耗的时间较长。因此,采用分水岭算法进行图像分割时,会产生过度的分割现象和消耗的时间较长。

应用到图像分割中,分水岭变换是指将源图像转换成一个标记图像,其中所有属于同一集水盆的点均被赋予同一个标记,并用一个特殊的标记来标几分水岭上的点。

1.3本文研究内容

本文根据国内外现有的图像分割方法,和课题设计要求,研究基于分水岭图像分割方法,梯度图像获取,所使用的算子。并介绍了利用分水岭算法对图像进行分割。

2 图像分割算法综述

2.1图像分割的概述

图像分割在图像处理中时一项关键的技术,在20世纪70年代开始一直受到人们的高度重视,迄今为止已经提出了千百种分割算法,都因为无法通用的分割理论,现在所提出的是针对具体问题的分割方法,并没有找到一种适合所有图像的通用分割算法。此外,需要制定出适用分割算法的标准,给图像分割技术带来许多实际问题。最近几年又涌现出了许多新思路、新方法或改进算法,对一些经典方法和新出现的方法作了划分。将图像分割方法分为阈值分割方法、边缘检测方法、区域提取方法和结合特定理论工具的分割方法。图像的分割方法有两种。一种是边界方法,一种是区域方法,两种方法都

存在缺点和优点,一些学者试图把两者结合起来进行图像分割,随着计算机处理能力的提高,越来越多的方法陆续的出现,如基于彩色纹理图像分割、纹理图像分割。教学工具和实验手段也的到了很大的更新扩展,从时域信号到频域信号处理,使得近来的小波变换也开始在图像分割中得到应用。

2.2图像分割方法介绍

2.2.1阈值的分割方法

灰度阈值分割法是一种最常用的并行区域技术,它是图像分割中应用数量最多一类

[2]。阈值分割方法实际上是输入图像到输出图像其中,T 为阈值,物体的图像元素背景的图像可以看出来,阈值的分割算法主要是确定阈值,主要能确定一个合适的阈值就能准确的把图像分割开来。确定了阈值以后,把阈值和像素点的灰度值比较在和像素分割可对各像素并行地进行,分割所得出的结果是直接给出图像的区域。 计算简单,运算效率快,高是阈值分割的主要优点。在重视运算效率的场合,它得了广泛的应用。阈值有很多种处理技术,有全局阈值,最佳阈值,自适应阈值等。

不同的问题需要选择不同的阈值来确定。具体可以通过实验来去顶。如果给定了一张图像,分析直方图的来确定最佳的阈值方法。例如当直放图明显呈现双峰情况是,可以选择两个峰值的中心点最为最佳的阈值。下图2.1(a )( b )分别为全局阈值和自适应阈值分割结果。

(a )全局阈值 (b )自适应阈值

图2.1 全局阀值与自适应阀值

2.2.2基于区域分割方法

区域分割方法有两种,一种是区域生长,一种是区域分裂合并。

把具有相似性质的像素集合起来构成区域,这就是区域生长。详细的思想是先对每一个所要分割的区域找到一个种子像素来作为所生长的起始点,根据某种实现确定的生长或者相似准则来判定种子像素周围于种子像素有相同或相似性质的像素合并到像素所在的区域中。得到的新像素后,在把这些像素当做新的像素种子,来继续上一步的过程。一直执行到没有符合条件的像素可以被包括进来。这样就长成了一个区域。

区域生长实现过程,需要选择出一组能够正确代表区域的种子像素,确定好在生长过程中的相同或者相似性准则,其中相似或者相同准则可以使灰度,彩色,纹理,梯度等特性。再指定一个让生长停止的准则条件。所选取出来的种子像素可以使单个像素,也可以是包含若干个像素的小区域。根据不同的原则来指定不同的生长准则,使用不同的生长准则,在生长的过程中会受到生长准则的影响。区域生长的主要优点是计算简单,在对较均匀的连通目标有很好的分割效果。而缺点是需要人为的去确定种子像素,对噪声相当敏感,可能会导致区域中出现空洞。此外。它还是一种串行的算法,如果计算的目标过于庞大,分割速度就会大大的减慢,因此在设计算法时,最好能提高它的计算效率。下图为区域生长分割的一个结果。

图2.2 区域生长分割结果

区域的分裂合并可以说是区域生长的逆过程:从整个的图像出发,不断的分裂图像来得到各个子区域,然后把前景区域合并,来实现目标提取。假设对一幅图,前景区域是由一些互相连通的像素组成的。如果把一副图像分裂到像素级,那就可以判定出该像素是否就是前景像素。当判断完所有的像素点或子区域,在把前景区域或者像素合并就能得到前景目标。这种方法在使用中,最常见的是四叉树分解法, 下图为四叉树分解效果图。

图2.3 四叉树分解效果图

2.2.3基于边缘的图像分割

基于图像边缘信息的分割方法是最古老,也是仍然很重要的一类图像分割方法[6].它主要作用是通过对于边缘的检测,检测灰度级或者结构具有突变的地方,表明一个区域的终结,也是另一个区域开始的地方。边缘检测的结果是不能作为图像分割的结果。还需要进一步的处理,将边缘点沿着边界(轮廓)连接起来。最终的目的至少是达到部分分割,也就是将局部的边缘组成一个目标或部件的边界。

1. 基于边缘的分割方法经常遇到的几个问题:

2. 图像噪声和背景的影响。

3. 不是边界的地方出现边缘点。

4. 是边界的地方缺少边缘点。

(a )原始图片 (b )边缘图片

图2.4边缘检测原始及边缘图

(c )边缘伸张后的图片

图2.4边缘检测效果图

2.2.4基于聚类分析的图像分割方法

随着科学的不断发展,提出了许多对于图像分割的新理论和新方法,随着出现了一些特定的理论,方法相结合的图像分割方法,而聚类分析就属于其中一种。

聚类法属于多远统计分析,它可在没有训练样本的情况下,自己根据数据集内在的结构,按照数据在样本空间中相似性和相似性测量准则来对数据进行自动划分和归类,使得同一类内的样本具有相同或者相近的属性,对于属性的不同类的样本属相差别会很大。K 均值聚类是一种基本的聚类方法,既有结构明确,通用性好和分割快速的优点,但是他也存在优化分割陷入局部极小值的问题。1974年Dunn 提出了模式形式K 均值聚类算法,既模糊C 均值聚类算法[8]。Bezdek 在1981年证明了模糊C 均值的收敛性[9]并讨论了模糊C 均值类算法与K 均值聚类算法的关系,并进一步扩展和建立模糊聚类理论。

2.2.5基于模糊集理论的分割方法

模糊集理论有描述不确定的能力,常用于图像分割的问题。近年来,涌现出很多模糊分割技术,已经广泛的应用到图像分割当中。因为模糊技术在图像分割中有一个突出的优点,它能和现有的很多图像分割方法互相结合在一起,形成一系列的集成模糊分割技术。模糊分割技术有很多类,比如模糊聚类,模糊阈值,模糊边缘检测技术之类的。

3 分水岭图像分割算法

分水岭算法其实就是对于整体形态进行分割的算法,是对图像做梯度分割处理。这样处理的目的是要将图像分割成不同类型的特殊个体,来分析物体的边缘灰度变化情况。梯度分割处理可以很好的描述图像中物体边缘的灰度变化情况。所以,先将原始图像进行对物体边缘的检测来得到梯度图像,在用分水岭算法对梯度图像进行分割。在进行图像分析,从而达到分割图像的效果和目的。

3.1分水岭算法原理

分水岭算法是一种基于拓扑理论的数学形态学得分割方法,其基本思想是把图像看做是测地学上的拓扑地貌,图像中每个一像素灰度值表示该点得海拔高度,每一个局部极小的值及其影响区域称为集盆,而集水盆的边界则形成分水岭[10]。它可以将图像分割为互不重叠区域,得到一个象素宽度且连续的边界,其应用对象是灰度梯度图像,梯度图像可有Cann y 算子在灰度图像上得到[11]。Vincent 和Soille 提出的浸没模拟分水岭算法是根据自然界中水浸没的规律,即地形处于低洼的地段先被浸没。[12]分水岭算法主要包含了两个步骤。第一步:将图像进行处理,在将处理的图像像素灰度值的大小按照升序排列出来;第二步:对排序处的顺序进行扫描,构造出“集水盆地”,然后在不同标记的“集水盆地”的边缘构造出“防水提坝”,来对图像区域的初始化划分处理。(如图3.1.1(a )(b)所示)

(a)“集水盆地”的构造

(b )“提坝”的构造

图3.1 分水岭地貌图

3.2分水岭算法特征

分水岭算法有多种实现方法,较典型的有基于标记分水岭变换和欧式距离映射法。 所谓标记分水岭变换就是从给定图片的全局极小值点开始,假设当前的值是 ,其中每个极小值小于或者等于 的集水盆会被分配到唯一的标记,对于当前值是 的像素,如果跟它相邻得区域中已经有了被标记过的像素,就分配一个相同的标记给它,如果它周围没有一个像素被标记过。就把这个未标记过的像素当成一个新的集水盆,并且给它一个新的标记。重复的进行标记,一直标记到图像中所有的像素都配分配到某一个集水盆(就是属于某个对象区域为止)。标记分水岭变换则完成。

欧式距离映射法,则是通过对二值图像的腐蚀,就是计算各个像素的欧式距离映射(Euclidean Distancc Maps.EDM)从而生成EDM 图像,然后用该图像作为拓扑表面,接着对其它像素的取值来作为获得分割结果的判断。EMD 图像从最亮的值开始,知道迭代递减到1,然后重复运算直到除了边界线以外所有的像素都被填充为止。

传统的分水岭算法都是对梯度图像进行无标记的分割,这样会造成过分的分割。本文采用对分割区域进行标记,使用标记分水岭算法。

3.3梯度图像获取

3.3.1图像梯度的实现

.

图像边缘一般都是通过对图像进行梯度运算来实现的。图3.2是使用Sobel 算子所得到的梯度图像。

图3.2 灰度图梯度图

3.3.2 梯度图像处理方法

Sobel 算子

索贝尔算子(Sobel operator)是图像处理中的算子之一,主要用于图像边缘检测。在技术上面,是一种离散性差分算子,它主要用来运行算图像亮度函数的梯度近似值。使用该算子对图像的任和一个点计算,就会产长相对应的梯度矢量或者是其法矢量。

如果角度的值等于零的话,就代表图像该处拥有纵向边缘,左方向会比右方向暗一些。

Sobel 算子在边缘检测中,是一种常用的模版。该算子分为两种,一种是检测水平边沿,一种是检测垂直平边沿的。跟“和”相比,该算子对像素为止的影响做出了加权处理,所以效果会更好。

该算子还有一种各向同性Sobel 算子,它也分为水平边沿检测和垂直平沿检测两种。它和普通的Sobel 算子相比较,它的为止加权系数更加的准确,不同方向的边沿检测时,梯度的幅值一致。

Sobel 算子的优势在于它是滤波算子形式,用于提取图像边缘,利用了快速卷积函数,方法简单有效, 所以得到广泛应用。而它的缺点在于该算子没有能把图像的主体和背景严格的划分出来。就是说该算子没有对于图像的灰度进行处理,由于该算子没有

严格的模拟人得视觉胜利特征来处理图像,所以提取出来的图像轮廓有些时候并不能得到人们的满意。

Canny 算子

坎尼(Canny )边缘检测算子广泛的应用于灰度图像中。坎尼根据边缘检测的有效性和定位的可靠性, 研究出了最优秀的边缘检测器所需要的特征,推导出了最优边缘检测器的数学表达式。在不同类型的边缘中,坎尼的边缘检测算子是最好形式是不相同的。在一维边缘检测中,由于一阶导数算子的最大值和M-H 算子的零交叉是一直的,所以坎尼边缘检测跟M-N 边缘检测几乎是一样的。但是在二维检测中,坎尼算子的方向性质使得边缘检测的定位性能要比M-H 算子好很多,能更好的边缘强度估计,并且能产生边缘梯度方向和强度两个信息,因此后续更为方便。

衡量边缘检测性能优劣有三个指标坎尼首次把三点判据用数学的形式表示出来,在采用最优化数值方法,从而能得到对应给定边缘类型的最佳边缘检测模版。在二维图像中,必须要使用若干个方向的模版分别对图像作卷积处理,然后取得最有可能的边缘方向。对于阶跃行的边缘,坎尼推导出的最优边缘检测器的形状和高斯函数的一阶导数相似。利用二维高斯函数的圆对称行和可分解性,我们就可以非常容易的来计算高斯函数在任和一个方向上的方向导数和图像的卷积。所以,实际应用中可以选择高斯函数的一届导数来作为阶跃形式边缘的次最优检测算子。

3.4标记对象

分水岭算法对梯度图像强度的变化非常敏感,所以在用分水岭算法得到分割结果的时候往往会存在过分分割现象,因此通常要分别对前景对象和背景对象进行标记,来获得更加完善的效果。

获得前景标记的方法有很多种,这些标记都必须是前景对象的内部链接的斑点像素。本文中,将采用形态学技术“基于开的重建”和“基于闭的重建”来清理图像。将会对于每个对象内部创建单位极大值,使用imregionalmax 命令来定位。

所谓开运算,就是先腐蚀后膨胀,它可以把比结构元素小的突刺过滤掉,在切断细长的搭接二起到分离作用。闭运算是先膨胀后腐蚀,它可以把比结构元素小的缺口或孔

填充上,大街较短的间隔来起到连接作用。这两种算法主要功能是去除比结构元素小的特定图像细节,同时来保证不产生全局的几何失真。

4 分水岭算法实现

4.1分水岭算法实现流程

分水岭算法在MATLAB 上实现的基本步骤有以下几步:

1. 读入彩色图像,并转化为灰度图像。

2. 运用Sobel 算子获得梯度幅值图像。

3. 前景标记对象和计算。

4. 计算背景标记。

5. 计算分割函数的分水岭变换。

4.2程序代码

clc; clear all; close all; 图4.1基于分水岭算法实现流程图

rgb = imread('pinguo.jpg');

if ndims(rgb) == 3

I = rgb2gray(rgb);

else

I = rgb;

end

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(rgb); title('原图');

subplot(1, 2, 2); imshow(I); title('灰度图');

hy = fspecial('sobel');

hx = hy';

Iy = imfilter(double(I), hy, 'replicate');

Ix = imfilter(double(I), hx, 'replicate');

gradmag = sqrt(Ix.^2 + Iy.^2);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I,[]), title('灰度图像')

subplot(1, 2, 2); imshow(gradmag,[]), title('梯度幅值图像')

se = strel('disk', 20);

Io = imopen(I, se);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I, []); title('灰度图像');

subplot(1, 2, 2); imshow(Io), title('图像开操作')

Ie = imerode(I, se);

Iobr = imreconstruct(Ie, I);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I, []); title('灰度图像');

subplot(1, 2, 2); imshow(Iobr, []), title('基于开的重建图像');

Ioc = imclose(Io, se);

Ic = imclose(I, se);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I, []); title('灰度图像');

subplot(2, 2, 2); imshow(Io, []); title('开操作图像');

subplot(2, 2, 3); imshow(Ic, []); title('闭操作图像');

subplot(2, 2, 4); imshow(Ioc, []), title('开闭操作');

Iobrd = imdilate(Iobr, se);

Iobrcbr =imreconstruct(imcomplement(Iobrd),imcomplement(Iobr));

Iobrcbr = imcomplement(Iobrcbr);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I, []); title('灰度图像');

subplot(2, 2, 2); imshow(Ioc, []); title('开闭操作');

subplot(2, 2, 3); imshow(Iobr, []); title('基于开的重建图像');

subplot(2, 2, 4); imshow(Iobrcbr, []), title('基于闭的重建图像');

fgm = imregionalmax(Iobrcbr);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 3, 1); imshow(I, []); title('灰度图像');

subplot(1, 3, 2); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(1, 3, 3); imshow(fgm, []); title('局部极大图像')

It1 = rgb(:, :, 1);

It2 = rgb(:, :, 2);

It3 = rgb(:, :, 3);

It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;

I2 = cat(3, It1, It2, It3);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(rgb, []); title('原图像');

subplot(2, 2, 2); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(2, 2, 3); imshow(fgm, []); title('局部极大图像');

subplot(2, 2, 4); imshow(I2); title('局部极大叠加到原图像');

se2 = strel(ones(5,5));

fgm2 = imclose(fgm, se2);

fgm3 = imerode(fgm2, se2);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(2, 2, 2); imshow(fgm, []); title('局部极大图像');

subplot(2, 2, 3); imshow(fgm2, []); title('闭操作');

subplot(2, 2, 4); imshow(fgm3, []); title('腐蚀操作');

fgm4 = bwareaopen(fgm3, 20);

It1 = rgb(:, :, 1);

It2 = rgb(:, :, 2);

It3 = rgb(:, :, 3);

It1(fgm4) = 255; It2(fgm4) = 0; It3(fgm4) = 0;

I3 = cat(3, It1, It2, It3);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I2, []); title('局部极大叠加到原图像');

subplot(2, 2, 2); imshow(fgm3, []); title('闭腐蚀操作');

subplot(2, 2, 3); imshow(fgm4, []); title('去除小斑点操作');

subplot(2, 2, 4); imshow(I3, []); title('修改局部极大叠加到原图像');

bw = im2bw(Iobrcbr, graythresh(Iobrcbr));

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(1, 2, 2); imshow(bw, []); title('阈值分割');

D = bwdist(bw);

DL = watershed(D);

bgm = DL == 0;

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(2, 2, 2); imshow(bw, []); title('阈值分割');

subplot(2, 2, 3); imshow(label2rgb(DL), []); title('分水岭变换示意图');

subplot(2, 2, 4); imshow(bgm, []); title('分水岭变换脊线图');

gradmag2 = imimposemin(gradmag, bgm | fgm4);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(bgm, []); title('分水岭变换脊线图');

subplot(2, 2, 2); imshow(fgm4, []); title('前景标记');

subplot(2, 2, 3); imshow(gradmag, []); title('梯度幅值图像');

subplot(2, 2, 4); imshow(gradmag2, []); title('修改梯度幅值图像');

5 仿真结果及分析

第一步:读入图片,将图片转化为灰度图像。

clc; clear all; close all;

rgb = imread('pinguo.jpg');

if ndims(rgb) == 3

I = rgb2gray(rgb);

else

I = rgb;

end

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(rgb); title('原图');

subplot(1, 2, 2); imshow(I); title('灰度图');

(a )原图 (b )灰度图

图5.1 原图图的灰度处理

第二步:做梯度幅值图像。

使用 Sobel 边缘算子对图像进行水平和垂直方向的滤波,然后求取模值,sobel 算子滤波后的图像在边界处会显示比较大的值,在没有边界处的值会很小

hy = fspecial('sobel');

hx = hy';

Iy = imfilter(double(I), hy, 'replicate');

Ix = imfilter(double(I), hx, 'replicate');

gradmag = sqrt(Ix.^2 + Iy.^2);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I,[]), title('灰度图像')

subplot(1, 2, 2); imshow(gradmag,[]), title('梯度幅值图像')

图5.2 梯度幅值图像

第三步: 前景标记对象和计算。

如果直接使用梯度模值图像进行分水岭算法话,得到的结果通常会存在过度分割的现象。所以本文采用分别对前景对象和背景对象进行标记,来获得更好的分割效果。

首先使用用 imopen 对图像做开操作。

se = strel('disk', 20);

Io = imopen(I, se);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I, []); title('灰度图像');

subplot(1, 2, 2); imshow(Io), title('图像开操作')

图5..3 图像的开操作

然后对通过腐蚀之后重建来做基于开的重建计算:

Ie = imerode(I, se);

Iobr = imreconstruct(Ie, I);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I, []); title('灰度图像');

subplot(1, 2, 2); imshow(Iobr, []), title('基于开的重建图像');

图5.4 重建图像

开操作后,使用imclose 移除较暗的斑点和枝干标记。对比常规的形态学闭操作和基于闭的重建操作。

Ioc = imclose(Io, se);

Ic = imclose(I, se);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I, []); title('灰度图像');

subplot(2, 2, 2); imshow(Io, []); title('开操作图像');

subplot(2, 2, 3); imshow(Ic, []); title('闭操作图像');

subplot(2, 2, 4); imshow(Ioc, []), title('开闭操作');

19

图5..5 普通图像开闭操作

接着使用 imdilate ,然后使用 imreconstruct 。先对图像求补,对imreconstruct 输出图像求补。

Iobrd = imdilate(Iobr, se);

Iobrcbr =imreconstruct(imcomplement(Iobrd),imcomplement(Iobr));

Iobrcbr = imcomplement(Iobrcbr);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I, []); title('灰度图像');

subplot(2, 2, 2); imshow(Ioc, []); title('开闭操作');

subplot(2, 2, 3); imshow(Iobr, []); title('基于开的重建图像');

subplot(2, 2, 4); imshow(Iobrcbr, []), title('基于闭的重建图像');

20

图5.6 基于开闭重建图像

通过比较,基于重建的开闭操作比普通的开闭操作有效。下面计算 Iobrcbr 的局部极大来得到更好的前景标记。

fgm = imregionalmax(Iobrcbr);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 3, 1); imshow(I, []); title('灰度图像');

subplot(1, 3, 2); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(1, 3, 3); imshow(fgm, []); title('局部极大图像')

21

图5.7 前景标记

叠加前景标记到原图上,更容易的理解这个结果。

It1 = rgb(:, :, 1);

It2 = rgb(:, :, 2);

It3 = rgb(:, :, 3);

It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;

I2 = cat(3, It1, It2, It3);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(rgb, []); title('原图像');

subplot(2, 2, 2); imshow(Iobrcbr, []); title('基于重建的开闭操作');

22

subplot(2, 2, 3); imshow(fgm, []); title('局部极大图像');

subplot(2, 2, 4); imshow(I2); title('局部极大叠加到原图像');

图5.8 前景标记到原图

通过闭操作和腐蚀操作来清理标记斑点的边缘,来解决大多闭塞处和阴影对象没有被标记,对象在结果中得不到合理的分割和一些对象的前景标记会一直到对象的边缘。

se2 = strel(ones(5,5));

fgm2 = imclose(fgm, se2);

fgm3 = imerode(fgm2, se2);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(2, 2, 2); imshow(fgm, []); title('局部极大图像');

subplot(2, 2, 3); imshow(fgm2, []); title('闭操作');

subplot(2, 2, 4); imshow(fgm3, []); title('腐蚀操作');

23

图5.9 闭操作和腐蚀操作

使用 bwareaopen ,来移除少于特定像素个数的斑点。BW2 = bwareaopen(BW,P)从二值图像中移除所以少于 P 像素值的连通块,得到另外的二值图像 BW2。

fgm4 = bwareaopen(fgm3, 20);

It1 = rgb(:, :, 1);

It2 = rgb(:, :, 2);

It3 = rgb(:, :, 3);

It1(fgm4) = 255; It2(fgm4) = 0; It3(fgm4) = 0;

I3 = cat(3, It1, It2, It3);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I2, []); title('局部极大叠加到原图像');

subplot(2, 2, 2); imshow(fgm3, []); title('闭腐蚀操作');

subplot(2, 2, 3); imshow(fgm4, []); title('去除小斑点操作');

24

subplot(2, 2, 4); imshow(I3, []); title('修改局部极大叠加到原图像')

图5.10 移出斑点

第四步:计算背景标记

首先,在清理后的图像 Iobrcbr 中,暗像素属于背景,所以可以从阈值操作开始。 bw = im2bw(Iobrcbr, graythresh(Iobrcbr));

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(1, 2, 2); imshow(bw, []); title('阈值分割');

25

图5.11 阈值分割

背景像素在黑色区域,在理想情形下,不需要要求背景标记太接近于要分割的对象边缘。一般计算“骨架影响范围”来“细化”背景,或者 SKIZ ,bw 的前景。这样能通过计算 bw 的距离变换的分水岭变换来实现,然后寻找结果的分水岭脊线(DL==0)。D = bwdist(BW)计算二值图像 BW 的欧几里得矩阵。对 BW 的每一个像素,距离变换指定像素和最近的 BW 非零像素的距离。bwdist 默认使用欧几里得距离公式。BW 可以由任意维数,D 与 BW 有同样的大小。

D = bwdist(bw);

DL = watershed(D);

bgm = DL == 0;

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');

subplot(2, 2, 2); imshow(bw, []); title('阈值分割');

subplot(2, 2, 3); imshow(label2rgb(DL), []); title('分水岭变换示意图');

subplot(2, 2, 4); imshow(bgm, []); title('分水岭变换脊线图');

26

图5.12 分水岭变化

第五步:分水岭变换的分割函数计算

可以用imimposemin 函数来修改图像,让它在特定的要求位置有局部极小。这一步中是用 imimposemin 来修改梯度幅值图像,使得在前景和后景标记像素有局部极小。

gradmag2 = imimposemin(gradmag, bgm | fgm4);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(bgm, []); title('分水岭变换脊线图');

subplot(2, 2, 2); imshow(fgm4, []); title('前景标记');

subplot(2, 2, 3); imshow(gradmag, []); title('梯度幅值图像');

subplot(2, 2, 4); imshow(gradmag2, []); title('修改梯度幅值图像');

27

图5.13 修改梯度幅值图像

28

结论

本文提出了分水岭图像分割算法对图像进行分割的方法、梯度分割的方法以及区域合并的方法。先对图像进行灰度图像的转化,在进行梯度分割,构造出区域连接图和最小生成树,然后对他们整合。并作出了实验结果。

在图像的处理上,图像分割一直是至关重要的技术。随着科技的进步,以及人们对图像分割的探索,使得图像分割技能越来越完善,处理图像的方法越来越多。达到处理图像的目标越来越精确。但是这还是图像处理上的一个重要难题。需要我们不停地去探索。来完善这一技术。让图像分割更好的能在各个领域上运用。

参考文献

[1]陈婷婷,采用模糊形态学和分水岭算法的图像分割研究[D],西南大学,2008,94-96

[2]Milan Sonka,Vadav Hhvac,Roger Boyle£.Image Processing,Amdy-sis,and Machine Vision[M].人民邮电出版社。2003,45-46

[3]宋健中。基于边缘图像分割,《视频图像处理》,2004,16-18

[4]J.Bezdek.Pattem recognition with fuzzy objective function algorithms[M].Plenum,New York,1981.

[5]J.Bezdek.A convergence theorem.for the fuzzy ISODATA clustering algorithm[j].IEEE PAMI,1980,1(2):1-8

[6]CONZALEZ R C;WOODS R E Digital image processing[M].2nded New York: Prentice Hall,2002

[7]CANNY . A Computational Approach to Edge Detection [J].IEEE Trans action son Pattern Analysis and Machine Intelligence,1986,8(6):679-698

[8]VNCENTL, SOLLEP. Watershed in digital space: an efficient algorithm based on immersion simulation[J]. IEEE Transactions on Pattern Analysis and Machine

Intelligence1991, (13):583-589

[9]唐金尤,范彦斌,姚锡凡. 基于分水岭算法的彩色图像分割. 佛山科学技术学院学报(自然科学版),2006. 第24卷第1期 ,2-3


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn