1MATLAB程序设计实验报告院(系)名称宇航学院专业名称图像处理与模式识别学生学号13151023学生姓名荣楚君2016年5月2实验基于Matlab水域分割的图像分割实验一、实验目的1、掌握Matlab图像处理工具箱的使用。2、学习使用联机帮助、Demo与查找更多的Matlab功能。3、熟悉使用Matlab进行交互操作的方法。4、学习图像分割的基本知识。二、实验要求(一)、对实验过程的要求1、编写M-文件,实现给定图像的分割。2、学习Matlab中Demo的相关帮助。3、实验中生成的中间结果和数据尽量保存。(二)、对实验报告的撰写要求1、参考附录的实验报告格式样本撰写。2、“实验结果”主要包括:(1)基于标记的和非标记的两种水域分割结果图。(2)用于水域分割的Marker图。(3)将水域分割得到结果的轮廓在原图上显示出来。3、实验报告附录中包含M-文件的源代码,要注意代码的格式。三、实验环境和设备1、PC机,WindowsXP/7操作系统。2、MatlabR2010及其以上版本。四、实验原理1、图像分割图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程,它是由图像处理到图像分析的关键步骤。图像分割的关键是将前景与背景区分开。分水岭算法又称为水域分割,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。水域分割一般是在梯度图像上实现,梯度图上的局部极小值一般代表较平滑的区域,即为目标中心区域或者变化不大的背景区域,集水形成的“分水岭”则位于梯度较大的边缘区域。32、实现方式首先要对输入原始图像求取梯度图像,对梯度图像直接做水域变换(watershed)即可得到无标记的水域分割结果。对梯度图像做前景标记,即在输入图像的每一个目标中心做一个Marker(可手动选取,也可用阈值法得到),在梯度图像上用该Marker作局部极小值的标记,再进行水域变换,即可得到基于标记点的水域分割结果。3、分割结果展示,在原图像上添加水域分割得到的轮廓如图所示。(a)(b)图1图像配准的例子。五、实验内容及步骤(一)学习Matlab帮助的Demo代码从Matlab帮助界面中打开Demos或Examples,搜索watershed在结果中找到Marker-ControlledWatershedSegmentation,配合中间结果研究该demo如何实现利用水域分割得到图像中的梨。(二)输入测试图像生成待分割的灰度图像利用如下代码输入图像:I=imread('cells.bmp');(三)计算图像梯度与水域分割使用sobel算子计算水平梯度与垂直梯度再综合,得到输入图像的梯度图像。在梯度4图像上直接做水域分割,得到非标记的水域分割结果。(四)计算标记点在原始图像上通过阈值得到前景的大致分割结果并用形态学腐蚀后作为前景(细胞)标记,也可以通过函数[xy]=ginput()手动标记各细胞的位置,甚至用PS或windows画图画出细胞的标记。标记点可以是真正的点,也可以是有一定面积的区域,但是标记区域一定要位于真实的分割细胞内部。标记图像是与输入图像同大小的,在细胞位置为255,其他位置为0的图像,如下图所示。(a)输入图像(b)标记图像(五)由标记图像标记梯度图像中的前景与背景极值第四步中得到的是前景(细胞)的标记,现在要通过前景标记得到背景标记。函数bwdist可以计算二值图像的距离变换,对距离变换做watershed就可以得到前景与前景之间的背景标记(线型标记)。在梯度图上利用imimposemin(gradmap,backgroundmarker|foregroundmarker)即可得到标记了极值的梯度图像;(a)由距离变换得到的背景标记(b)标记前景与背景的梯度图像(六)基于标记的水域分割对标记了极小值的梯度图像做watershed,得到水域分割结果(七)结果分析与总结(1)对比无标记的水域分割与有标记的水域分割结果;(2)总结水域分割算法整体流程,尤其是标记点的运用;5(3)与阈值法(如大津阈值)分割图像的算法相比,水域分割的优劣。(八)Bonus完全依照实验步骤,最后结果可能会如下所示的结果。图中的线是如何产生的,如何避免产生这种问题。六、实验结果1.实验截图67892.结果分析与总结(1)对比无标记的水域分割与有标记的水域分割结果;无标记时,水域分割产生过分割现象,得不到理想的效果,只有标记后才能得到较为理想的结果(2)总结水域分割算法整体流程,尤其是标记点的运用;整体流程:输入测试图像生成灰度图像=计算图像梯度=设置标记点产生标记图像=由标记图像标记梯度图像中的前景与背景极值=基于标记作水域分割(3)与阈值法(如大津阈值)分割图像的算法相比,水域分割的优劣。优点:水域分割法可以得到比阈值法更好的分割原图像,它结合了边缘检测和区域生长的优点,得到单像素宽、封闭的、位置准确的轮廓。缺点:算法比较复杂,对计算机要求很高。3.实验代码clearall;clc;I=imread('C:\Users\rh\北航\大三下\MATLAB课\水域分割\cells.tif');10imshow(I);title('原图');%1h=fspecial('sobel');%h=fspecial(type)createsatwo-dimensionalfilterhofthespecifiedtype.fspecialreturnshas%acorrelationkernel,whichistheappropriateformtousewithimfilter.typeisastringhavingoneofthesevalues.fd=double(I);%double使数据变成双精度g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);figure;imshow(g);title('梯度图');%2L=watershed(g);Lrgb=I;Lrgb(L==0)=255;figure;imshow(Lrgb);title('未标记的水域分割');%3se=strel('disk',20);se2=strel(ones(3,3));Ie=imerode(I,se);Iobr=imreconstruct(Ie,I);Iobrd=imdilate(Iobr,se);Iobrcbr=imreconstruct(imcomplement(Iobrd),imcomplement(Iobr));Iobrcbr=imcomplement(Iobrcbr);fgm=imregionalmax(Iobrcbr);fgm2=imclose(fgm,se2);g3=imerode(fgm2,se2);figure;imshow(g3);title('标记图像');%411M=imread('C:\Users\rh\北航\大三下\MATLAB课\水域分割\ff.tif');imshow(M);title('标记图像改正后');%5bw=im2bw(Iobrcbr,graythresh(Iobrcbr));%阈值分割D=bwdist(bw);Lim=watershed(D);%watershed分水岭算法Lim的值greaterthanorequalto0,等于0是分水岭脊像素em=Lim==0;figure;imshow(em);title('背景标记');%6fgm4=bwareaopen(M,20);g4=imimposemin(g,em|fgm4);figure;imshow(g4);title('标记前景与背景的梯度图像');%7g5=watershed(g4);g6=I;g6(g5==0)=255;figure;imshow(g6);title('标记后的水域分割');%8