分水岭算法的概念及原理
分水岭算法
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θ表示阈值。
程序可采用方法:用阈值限制梯度图像以达到消除灰度值的微小变化产生的过度分割,获得适量的区域,再对这些区域的边缘点的灰度级进行从低到高排序,然后在从低到高实现淹没的过程,梯度图可由Sobel算子计算得到。对梯度图像进行阈值处理时,阈值的合理选择对分割结果有较大的影响,因此,阈值的选取是影响图像分割效果的一个关键。该方法的缺点是,通常一些实际图像可能含有微弱的边缘,灰度值变化不是特别明显,阈值选取过大可能会消除这些微弱边缘。
分水岭算法是数学形态学分割方法中的经典算法,它将图像看作是地形学上被水覆盖的自然地貌,图像中的每一像素的灰度值表示该点的海拔高度,其每一个局部极小值及其影响区域称为集水盆,集水盆的边界则是分水岭,在各极小区域的表面打一个小孔,同时让水从小孔中涌出,并慢慢淹没极小区域周围的区域,那么各极小区域波及的范围,即是相应的集水盆,对应图像中的区域;不同区域的水流相遇时的界限,就是期望得到的分水岭,对应区域的边缘。分水岭变换可以保证分割区域的连续性和封闭性。
分水岭变换是从局部极小点开始,即只能是在梯度图中用,原始图是转换后才能用于分水岭变换的。一般图像中存在多个极小值点,通常会存在过分割现象,可以采用梯度阈值分割改进或者采用标记分水岭算法将多个极小值区域连在一起。
如果图像中的目标物体是连在一起的,则分割起来会更困难,分水岭算法经常用于处理这类问题,通常会取得比较好的效果。分水岭分割算法把图像看成一副“地形图”,其中亮度比较强的地区像素值较大,而比较暗的地区像素比较小,通过寻找“汇水盆地”和“分水岭界限”,对图像进行分割。
步骤:
1.读取图像
2.求取图像的边界,在此基础上可直接应用分水岭分割算法,但效果不佳;
3.对图像的前景和背景进行标记,其中每个对象内部的前景像素都是相连的,背景里面的每个像素值都不属于任何目标物体;
4.计算分割函数,应用分水岭分割算法的实现
注:直接用分水岭分割算法效果并不好,如果在图像中对前景和背景进行标注区别,再应用分水岭算法会取得较好的分割效果。
例步骤:
1.读取图像并求取图像的边界。
rgb = imread('pears.png');%读取原图像
I = rgb2gray(rgb);%转化为灰度图像
figure; subplot(121)%显示灰度图像
imshow(I)
text(732,501,'Image courtesy of Corel',...
'FontSize',7,'HorizontalAlignment','right')
hy = fspecial('sobel');%sobel算子
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');%滤波求y方向边缘
Ix = imfilter(double(I), hx, 'replicate');%滤波求x方向边缘
gradmag = sqrt(Ix.^2 + Iy.^2);%求摸
subplot(122); imshow(gradmag,[]), %显示梯度
title('Gradient magnitude (gradmag)')
2. 直接使用梯度模值进行分水岭算法:(往往会存在过的分割的情况,效果不好)
L = watershed(gradmag);%直接应用分水岭算法
Lrgb = label2rgb(L);%转化为彩色图像
figure; imshow(Lrgb), %显示分割后的图像
title('Watershed transform of gradient magnitude (Lrgb)')
3.分别对前景和背景进行标记:本例中使用形态学重建技术对前景对象进行标记,首先
使用开操作,开操作之后可以去掉一些很小的目标。
se = strel('disk', 20);%圆形结构元素
Io = imopen(I, se);%形态学开操作
figure; subplot(121)
imshow(Io), %显示执行开操作后的图像
title('Opening (Io)')
Ie = imerode(I, se);%对图像进行腐蚀
Iobr = imreconstruct(Ie, I);%形态学重建
subplot(122); imshow(Iobr), %显示重建后的图像
title('Opening-by-reconstruction (Iobr)')
Ioc = imclose(Io, se);%形态学关操作
figure; subplot(121)
imshow(Ioc), %显示关操作后的图像
title('Opening-closing (Ioc)')
Iobrd = imdilate(Iobr, se);%对图像进行膨胀
Iobrcbr = imreconstruct(imcomplement(Iobrd), ...
imcomplement(Iobr));%形态学重建
Iobrcbr = imcomplement(Iobrcbr);%图像求反
subplot(122); imshow(Iobrcbr), %显示重建求反后的图像
title('Opening-closing by reconstruction (Iobrcbr)')
fgm = imregionalmax(Iobrcbr);%局部极大值
分水岭算法原理
所谓分水岭算法有好多种实现算法,拓扑学,形态学,浸水模拟和降水模拟等方式。要搞懂就不容易了。WatershedAlgorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕山,山围水的情形。而区分高山(plateaus)与水的界线,以及湖与湖之间的间隔或都是连通的关系,就是我们可爱的分水岭(watershed)。为了得到一个相对集中的集水盆,那么让水涨到都接近周围的最高的山顶就可以了,再涨就要漏水到邻居了,而邻居,嘿嘿,水质不同诶,会混淆自我的。那么这样的话,我们就可以用来获取边界高度大,中间灰阶小的物体区域了,它就是集水盆。浸水法,就是先通过一个适当小的阈值得到起点,即集水盆的底;然后是向周围淹没也就是浸水的过程,直到得到分水岭。当然如果我们要一直淹没到山顶,即是一直处理到图像灰阶最高片,那么,当中就会出现筑坝的情况,不同的集水盆在这里想相遇了,我们要洁身自爱,到这里为止,因为都碰到边界了。不再上山。构筑属于自己的分水岭。在计算机图形学中,可利用灰度表征地貌高。图像中我们可以利用灰度高与地貌高的相似性来研究图像的灰度在空间上的变化。这是空域分析,比如还可以通过各种形式的梯度计算以得到算法的输入,进行浸水处理。分水岭具有很强的边缘检测能力,对微弱的边缘也有较好的效果。为会么这么说呢?为什么有很强的边缘检测能力,而又能得到相对集中的连通的集水盆?现实中很好办,我们在往凹地加水的时候,直到它涨到这一块紧凑的山岭边缘就不加了;但是如果有一条小山沟存在,那没办法,在初始阈值分割的时候,也就是山沟与集水盆有同样的极小值,而且它们之间是以这个高度一直连接的。那没关系,我们将它连通。在图像上呢?如何实现? 看看算法,算法思想是这样的: 首先准备好山和初始的水。这山就是我们的初始图像了,比如用自然获取的图像的梯度来表征山地的每一点的高度吧;而初始的水就是在阈值记为Thre底下,所有的低于这个高度的整个山地都加水,直到这个阈值Thre高度。从而有三个初始量:unsignedchar**Ori_image、 char**Seed_image和int**Label_image。最后一个是为最终的结果做准备的。当然要做好初始化,比如,Ori_image赋值为原图像(256色灰度图)的梯度值,Seed_image则是初始状态下有水的置位,无水的复位,而Label_image则全初始化为0,最终得到的是各点对应的区域号。接下来是考虑将已加的水进行记录,记录成连通的区域,也就是看看有多少个互不相关的集水盆,有五个,那么我们就涨出五个湖,而且尽可能的高,只要大家想到不溢出。在算法上,有多少个连通的区域就记录成多少个数据结构,功夫就在于如何将这些连通的区域连接成一块,并由一个数据结构来表达了。很好,我们准备用一个向量容器来实现初始保存,保存所有标记区域种子队列的数组,里面放的是种子队列的指针
程序设计与软件开发基础(一)
第27讲程序设计与软件开发基础(一) 教学目标及基本要求 掌握逐步求精的结构化程序设计方法,初步掌握良好的程序设计风格的内涵,掌握算法的基本概念,理解面向对象程序设计的基本概念。 教学重点 逐步求精的结构化程序设计方法,算法的基本概念。 教学难点 面向对象程序设计的基本概念,算法的复杂度。 教学内容 程序设计的风格 结构化程序设计 面向对象程序设计 算法的基本概念 算法的复杂度 教学时间 1学时 7.1 程序设计概述 7.1.1程序设计的风格 1.程序设计风格 程序设计风格是指编写程序时所表现出的特点、习惯和逻辑思路。 程序设计的风格总体而言应该强调简单和清晰,程序必须是可以理解的。 主导的程序设计风格:“清晰第一,效率第二” 。 2.良好程序设计风格 (1)源程序文档化 ①符号名的命名 见名知意 名字不宜太长 不要使用相似的名字 不要使用关键字做标识符 同一个名字不要有多种含义 ②程序注释 序言性注释: 通常位于每个程序的开头部分,它给出程序的整体说明。主要描述内容包括:程序标题、程序功能说明、主要算法、接口说明、程序位置、开发简历、程序设计者、复审者、复审日期、修改日期等。 功能性注释: 一般嵌在源程序体之中,主要描述其后的语句或程序做什么。 ③视觉组织 在程序中利用空格、空行、缩进等技巧使程序层次清晰。 (2)数据说明的方法 ①数据说明的次序规范化:数据说明次序固定,便程序理解、阅读和维护,可以使 数据的属性容易查找,也有利于测试、排错和维护。 ②说明语句中变量安排有序化:当一个说明语句说明多个变量时,变量按照字母顺 序排序为好。
③使用注释来说明复杂数据的结构。 ④显式地说明一切变量。 (3)语句的结构 ①在一行内只写一条语句。 ②程序编写应优先考虑清晰性,除非对效率有特殊要求,即清晰第一,效率第二。 ③首先要保证程序正确,然后才要求提高速度。 ④避免使用临时变量而使程序的可读性下降。 ⑤避免采用复杂的条件语句和不必要的转移,尽量使用库函数。 ⑥数据结构要有利于程序的简化,程序要模块化,且要尽量使模块功能单一化,利 用信息隐蔽,确保每一个模块的独立性。 ⑦尽量只采用3种基本控制结构来编写程序。 (4)输入和输出 ①对所有的输入数据都要检验数据的合法性以及检查输入项的各种重要组合的合理 性。 ②输入格式要简单,以使输入的步骤和操作尽可能简单。 ③输入数据时,应允许使用自由格式和缺省值。 ④输入一批数据时,最好使用输入结束标志。 ⑤以交互式方式输入、输出数据时,要在屏幕上有明确的提示符,数据输入结束时, 应在屏幕上给出状态信息。 ⑥当程序设计语言对输入格式有严格要求时,应保持输入格式与输入语句的一致性; 给所有的输出加注释,并设计良好的输出报表格式。 7.1.2 结构化程序设计 1.结构化程序设计的原则 自顶向下、逐步求精、模块化、限制使用GOTO语句。 (1)自顶向下 先总体,后细节;先全局目标,后局部目标。 (2)逐步求精 设计一些子目标作为过渡,逐步细化。 (3)模块化 把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标称为一个模块。 (4)限制使用GOTO语句 使用GOTO语句有时会使程序执行效率较高,但也容易造成程序混乱,程序不易理解、不易排错、不易维护,因而要尽量限制使用GOTO语句。 2.结构化程序的基本结构与特点 结构化程序的基本结构只有3种:顺序、选择和循环 (1)顺序结构 如图7-1所示,顺序结构是顺序执行结构。所谓顺序执行,就是按照程序语句行的自然 图7-1 顺序结构
必修二算法的概念、程序框图(一)
内部资料,请勿外传 1 第三讲 算法的概念、程序框图(一) 【考纲要求】: ①了解算法的含义、了解算法的思想. ②理解程序框图的三种基本逻辑结构:顺序、条件分支、循环. 一、算法的概念 1.用加减消元法解二元一次方程组2121x y x y ?=-??í?+=?? 的具体步骤是什么? 2.参照上述思路,一般地,解方程组 1112 22a x b y c a x b y c ì+=??í?+=?? 1221(0)a b a b -≠的基本步骤是什么? 3.根据上述分析,用加减消元法解二元一次方程组,可以分为五个步骤进行这五个步骤就构成了解二元一次方程组的一个“算法”.我们再根据这一算法编制计算机程序,就可以让计算机来解二元一次方程组.那么解二元一次方程组的算法包括哪些内容? 4.一般地,算法是由按照一定规则解决某一类问题的基本步骤组成的,你认为这些步骤的个数是有限的还是无限的?每个步骤是否有明确的计算任务? 5.有人对哥德巴赫猜想“任何一个大于4的偶数都能写成两个质数之和”,设计了如下操作步骤: 第一步,检验6=3+3, 第二步,检验8=3+5, 第三步,检验10=5+5, …… 利用计算机无穷地检验下去!请问:这是一个算法吗? 6.根据上述分析,归纳出算法的概念:在数学中,按照一定规则解决某一类问题的明确和有限的步骤称为算法. 二、算法的步骤设计 不同类型的问题有不同内容的算法,我们以判断一个整数是否为质数为例,一起来探讨算法的步骤设计. 1.如果让计算机判断7是否为质数,如何设计算法步骤? 2.如果让计算机判断35是否为质数,如何设计算法步骤? 3.整数89是否为质数?如果让计算机判断89是否为质数,按照上述算法需要设计多少个步骤? 4.用2~88逐一去除89求余数,需要87个步骤,这些步骤基本是重复操作,我们可以按下面的思路改进这个算法,减少算法的步骤. (1)用i 表示2~88中的任意一个整数,并从2开始取数; (2)用i 除89,得到余数r. 若r=0,则89不是质数;若r≠0,将i 用i+1替代,再执行同样的操作; (3)这个操作一直进行到i 取88为止. 你能按照这个思路,设计一个“判断89是否为质数”的算法步骤吗? 5.一般地,判断一个大于2的整数是否为质数的算法步骤如何设计? ① ② ① ②
1-1算法的概念练习题及答案
[当堂达标] 1.我们已学过的算法有一元二次方程的求根公式、加减消元法求二元一次方程组的解、二分法求函数零点等,对算法的描述有: ①对一类问题都有效; ②对个别问题有效; ③计算可以一步一步进行,每一步都有唯一结果; ④是一种通法,只要按部就班地做,总能得到结果. 以上描述正确的有( ) A .1个 B .2个 C .3个 D .4个 答案:C 解析:设计的算法应该是对一类问题都有效,而不是只对个别问题有效.所以①对,②不对.由算法的确定性、有限性、顺序性易知③④都是正确的,故描述正确的有3个. ; 2.下列所给问题中,不能设计一个算法求解的是( ) A .用二分法求方程x 2-3=0的近似解(精确到 B .解方程组????? x +y +5=0,x -y +3=0 C .求半径为2的球的体积 D .判断y =x 2在R 上是否具有单调性 答案:D 解析:选项A ,B ,C 中的问题都可以设计算法求解,而D 项中的问题则不能设计算法求解. 3.“已知直角三角形两直角边长为a ,b ,求斜边长c ”的一个算法分下列三步: ①计算c =a 2+b 2; ②输入直角三角形两直角边长a ,b 的值;
③输出斜边长c 的值. : 其中正确的顺序是________. 答案:②①③ 解析:根据运算顺序,易知算法顺序应是②①③. 4.已知一个学生的语文成绩为89,数学成绩为96,外语成绩为99,求它的总分和平均分的一个算法如下,请将其补充完整: 第一步:取A =89,B =96,C =99. 第二步,_____________________________________________. 第三步,_____________________________________________. 第四步,输出计算结果. 答案:计算总分D =A +B +C 计算平均分E =D 3 5.已知函数y =????? -x 2-1x ≤-1,x 3x >-1,试设计一个算法,输入x 的值,求对应的函数值. ^ 解:算法如下: 第一步,输入x 的值; 第二步,当x ≤-1时,计算y =-x 2-1,否则执行第三步; 第三步,计算y =x 3; 第四步,输出y . [课堂小结] 1.算法的特点:有限性、确定性、逻辑性、不唯一性、普遍性. 2.算法设计的要求: (1)写出的算法必须能够解决一类问题(如判断一个整数是否为质数,求任意一个方程的近似解等),并且能够重复使用.
分水岭算法
解决分水岭算法的过分割问题 班级:020751 学号:02075087 姓名:刘恺
摘要针对基于分水岭变换的分割算法通常存在过分割现象,提出了一种新的分割算法,采用形态学的运算去除噪声及背景像素的影响,搜索区域极大值点,将分割定位于目标图像,从而达到很好的分割效果,方法从消除过分割及区域轮廓定位等方面均具有很好的分割效果。 关检词图像分割,分水岭变换,数学形态学 Abstract The article is based on watershed algorithm, proposed a method of image segmentation, adopted the morphology arithmetic to eliminate the effect of noise and background pixel, search for the max point in each area, let segmentation orientate as target image, could reach very good segment effect. The method can efficiently eliminate over-segmentation, and hold the position of region contours without evident bias. Key words image segmentation, watershed transform ,mathematical morphology 1.1图像分割综述 把图像分解为一些特定的性质相似的部分(区域或对象),并用这些部分对图像进行分析和描述。一幅图像往往包含许多不同类型的区域,如物体、环境和背景等。图像分析的一个重要方法就是用它们作为基本组成成分对图像进行描述。例如为了在气泡室图片中检出质点碰撞形式并判定其发生位置,就要在图像中分割出气泡的轨迹及其端点。为了从输入的文本中识别出一串字符,首先就要把各个字符从背景和其他字符中分离出来。因此把图像分割为若干子图像,并利用各子图像的特性和它们之间的关系描述图像,对于图像识别和解释、物景分析以及图像的分块处理和存储都有很大的意义。 图像分割基本上是对像素进行分类的过程。例如用某个灰度阈值把图像像素分成“黑”和“白”两类,就可以把黑的对象同白的背景区分开。常用的分割方法有灰度等级阈值法、谱和空间分类法、区域生长法和边缘检测法。 灰度等级阈值法在图像只有两种组成部分的情况下,图像灰度的直方图常常呈现两个峰值。用两个峰值之间的谷值所对应的灰度作为阈值,把所有像素灰度大于或等于阈值的作为一类,小于阈值的作为另一类是一种最基本的两类分割方法。实际应用时为了改善分类的可靠性,可以利用某些附加的信息(例如已知两类区域的面积之比)使阈值的选择更加合理。在类别更多的情况下,可以采用多级阈值把各类分割开来(例如确定两个阈值,就可以把细胞图像分割为胞核、胞浆和背景三部分)。类别越多,图像直方图的峰值就越不明显,分割就更为困难。 谱和空间分类法对于彩色和多光谱图像,可以用像素的几种性质(颜色和谱信号)对像素作比较精细的分类。对于黑白图像,用包括像素本身灰度在内的一组局部性质(例如该像素邻域灰级的均值)在多维空间中进行分类。对于一些复杂图像,这种方法比单独的灰度阈值法效果更好。
算法与程序设计(教科版)教案
算法与程序设计(教科版)教案 1-1节计算机解决问题的过程 一、教学目标 1、知识与技能 (1)让学生了解算法、穷举法、程序设计语言、编写程序和调试程序等概念。 (2)让学生知道对现实问题的自然语言的描述,特别是类似程序设计语言的自然语言描述。 (3)让学生理解分析问题、设计算法、编写程序、调试程序这一用计算机解决问题的基本步骤,认识其在算法与程序设计中的作用。 2、方法与过程 (1)培养学生发现旧知识的规律、方法和步骤,并把它运用到新知识中去的能力。 (2)培养学生调试程序的能力。 (3)培养学生合作、讨论、观摩、交流和自主学习的能力。 3、情感态度和价值观 通过“韩信点兵”这个富有生动情节的实例和探究、讲授、观摩、交流等环节,让学生体验用计算机解决问题的基本过程。 二、重点难点 本节的重点用计算解决问题的过程中的分析问题、设计算法、和上机调试程序等步骤。用计算机解决问题的过程中的分析问题、设计算法也是本节的难点。 三、教学环境 1、教材处理 教学内容选用中华人民共和国教育部制订的《普通高中技术课程标准》(2003年4月版)中信息技术部分的选修模块1“算法与程序设计”第一章的第一课“计算机解决问题的过程”。教材选用《广东省普通高中信息技术选修一:算法与程序设计》第三章第一节,建议“算法与程序设计”模块在高中一年级下学期或高中二年级开设。 根据2003年4月版《普通高中技术课程标准》的阐述,“算法与程序设计”是普通高中信息技术的选修模块之1,它的前导课程是信息技术的必修模块“信息技术基础”。学生在“信息技术基础”模块里已经学习了计算机的基本操作,掌握了启动程序、窗口操作和文字编辑等基础知识。学生可以利用上述的基础知识,用于本节课的启动Visual Basic程序设计环境,输入程序代码,运行程序等操作。本节课“计算机解决问题的过程”是“算法与程序设计”模块的第一节课,上好这节课是使学生能否学好“算法与程序设计”这一模块的关键。本节课的教学目的是让学生理解分析问题、设计算法、编写程序和调试程序等用计算机解决问题的基本过程,认识其在算法与程序设计中的地位和作用,它也是后续课程如模块化程序设计、各种算法设计等课程的基础。 让学生在人工解题中发现分析问题、设计算法等步骤,并把它应用到用计算机解决问题中去,这是构建主义中知识迁移的方法。本节课还采用了探究、讲授、观摩、交流、阅读材料等多种教学活动的有机结合的方法。 2、预备知识 本节课相联系的旧知识是计算机的基本操作中鼠标、键盘操作,启动、关闭程序,窗口、菜单操作和文字编辑等基础知识,还有解决数学问题的步骤等知识。 3、硬件要求