分水岭算法的Matlab实现
- 格式:pdf
- 大小:1.12 MB
- 文档页数:10
程序代码:(代码标记[code]...[/code] )clear,clc%三种方法进行分水岭分割%读入图像filename='Fig1021(a)(small-blobs).tif';f=imread(filename);Info=imfinfo(filename);if Info.BitDepth>8f=rgb2gray(f);endfigure,mesh(double(f));%显示图像,类似集水盆地%方法1:一般分水岭分割,从结果可以看出存在过分割问题b=im2bw(f,graythresh(f));%二值化,注意应保证集水盆地的值较低(为0),否则就要对b取反d=bwdist(b); %求零值到最近非零值的距离,即集水盆地到分水岭的距离l=watershed(-d); %matlab自带分水岭算法,l中的零值即为风水岭w=l==0; %取出边缘g=b&~w; %用w作为mask从二值图像中取值figuresubplot(2,3,1),imshow(f);subplot(2,3,2),imshow(b);subplot(2,3,3),imshow(d);subplot(2,3,4),imshow(l);subplot(2,3,5),imshow(w);subplot(2,3,6),imshow(g);%方法2:使用梯度的两次分水岭分割,从结果可以看出还存在过分割问题(在方法1的基础上改进)h=fspecial('sobel');%获得纵方向的sobel算子fd=double(f);g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%使用sobel算子进行梯度运算l=watershed(g);%分水岭运算wr=l==0;g2=imclose(imopen(g,ones(3,3)),ones(3,3));%进行开闭运算对图像进行平滑l2=watershed(g2);%再次进行分水岭运算wr2=l2==0;f2=f;f2(wr2)=255;figuresubplot(2,3,1),imshow(f);subplot(2,3,2),imshow(g);subplot(2,3,3),imshow(l);subplot(2,3,4),imshow(g2);subplot(2,3,5),imshow(l2);subplot(2,3,6),imshow(f2);%方法3:使用梯度加掩模的三次分水岭算法(在方法2的基础上改进)h=fspecial('sobel');%获得纵方向的sobel算子fd=double(f);g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%使用sobel算子进行梯度运算l=watershed(g);%分水岭运算wr=l==0;rm=imregionalmin(g); %计算图像的区域最小值定位,该函数仅仅是用来观察为何分水岭算法产生这么多集水盆地im=imextendedmin(f,2);%上面仅是产生最小值点,而该函数则是得到最小值附近的区域,此处的附近是相差2的区域fim=f;fim(im)=175; %将im在原图上标识出,用以观察lim=watershed(bwdist(im));%再次分水岭计算em=lim==0;g2=imimposemin(g,im|em);%在梯度图上标出im和em,im是集水盆地的中心,em是分水岭l2=watershed(g2); %第三次分水岭计算f2=f;f2(l2==0)=255; %从原图对分水岭进行观察figuresubplot(3,3,1),imshow(f);subplot(3,3,2),imshow(g);subplot(3,3,3),imshow(l);subplot(3,3,4),imshow(im);subplot(3,3,5),imshow(fim);subplot(3,3,6),imshow(lim);subplot(3,3,7),imshow(g2);subplot(3,3,8),imshow(l2)subplot(3,3,9),imshow(f2);。
解决分水岭算法的过分割问题班级: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 morphology1.1图像分割综述把图像分解为一些特定的性质相似的部分(区域或对象),并用这些部分对图像进行分析和描述。
一幅图像往往包含许多不同类型的区域,如物体、环境和背景等。
图像分析的一个重要方法就是用它们作为基本组成成分对图像进行描述。
例如为了在气泡室图片中检出质点碰撞形式并判定其发生位置,就要在图像中分割出气泡的轨迹及其端点。
基本概念一点通从理论上讲,图像是一种二维的连续函数,然而在计算机上对图像进行数字处理的时候,首先必须对其在空间和亮度上进行数字化,这就是图像的采样和量化的过程。
空间坐标(x,y)的数字化称为图像采样,而幅值数字化称为灰度级量化。
对一幅图像采样时,若每行(横向)采样数为M,每列(纵向)采样数为N,则图像大小为M*N个像素,f(x,y)表示点(x,y) 处的灰度值,则F(x,y)构成一个M*N 实数矩阵****************************经验分享:“像素”的英文为“pixel”,它是“picture”和“element”的合成词,表示图像元素的意思。
我们可以对“像素”进行如下理解:像素是一个面积概念,是构成数字图像的最小单位。
****************************把采样后所得的各像素灰度值从模拟量到离散量的转换称为图像灰度的量化。
量化是对图像幅度坐标的离散化,它决定了图像的幅度分辨率。
量化的方法包括:分层量化、均匀量化和非均匀量化。
分层量化是把每一个离散样本的连续灰度值只分成有限多的层次;均匀量化是把原图像灰度层次从最暗至最亮均匀分为有限个层次,如果采用不均匀分层就称为非均匀量化。
当图像的采样点数一定时,采用不同量化级数的图像质量不一样。
量化级数越多,图像质量越好;量化级数越少,图像质量越差。
量化级数小的极端情况就是二值图像。
****************************经验分享:“灰度”可以认为是图像色彩亮度的深浅。
图像所能够展现的灰度级越多,也就意味着图像可以表现更强的色彩层次。
如果把黑——灰——白连续变化的灰度值量化为256个灰度级,灰度值的范围为0~255,表示亮度从深到浅,对应图像中的颜色为从黑到白。
****************************因此,对数字图像进行处理,也就是对特定的矩阵进行处理。
在C语言中,对M×N数字图像处理的核心代码如下:for (j=1;j<N+1;j++)for(i=1;i<M+1;i++){对I(i,j)的具体运算};在Matlab中,对M×N数字图像处理的核心代码如下:for i=1:Nfor j=1:M对I(i,j)的具体运算endend一幅数字图像可以用一个矩阵来表示,对数字图像进行处理,实质上就是对特定的图像矩阵进行变换的过程,因此,图像变换是数字图像处理技术的基础。
水系提取算法(D8)的matlab 实现D8算法是当今非常成熟的提取水系(或分水岭)的计算机实现方法。
这里笔者结合自身的编程实践介绍D8算法的matlab 实现过程,谨与大家分享。
D8算法分为两部分实现:每个栅格点水流方向的计算;每个栅格点汇水面积的计算。
1、水流方向的计算在水流方向的计算中,本人结合matlab 内嵌的滤波工具,利用一个简单的非线性滤波来实现,具体内容包括一个自己编辑的确定水流方向的函数flowdirection 和若干脚本命令,如下:以下是自己编辑的flowdirection 函数代码:function output=flowdirection(a)n=size(a);for i=1:n(2) k=0; b=-inf; for j=[1:4,6:9]if rem(j,2)==0r(j)=a(5,i)-a(j,i);elser(j)=(a(5,i)-a(j,i))/sqrt(2);endif r(j)>bb=r(j);k=j;endendoutput(i)=k;end执行的脚本代码如下:>> uiopen('F:\课件\2009田淑芳\正射校正\DEM.tif',1)%打开DEM 高程数据,生成的数据矩阵名可自行定义,这里默认为DEM>>DEM=mat2gray(DEM);%高程数据归一化处理>>DEM=padarray(DEM,[1 1],'replicate');%对数据边缘进行自动填充>>direc8=colfilt(DEM,[3 3],'sliding',@flowdirection);%执行非线性滤波,得到方向矩阵,得到的值分别为{1 ,2,3,4,6,7,8,9}.其方向意义如上图矩阵所示,如1代表北西向,8代表正东1、汇水面积的计算这里笔者根据自己的编程实践经验,给出一个函数来计算不同窗口大小下汇水面积的大小。
matlab中分水岭算法的原理English:The watershed algorithm is a segmentation technique that is used to separate touching or overlapping objects in an image. It is based on the concept of a topographic surface, where the pixel intensities are interpreted as the elevation of the surface. The algorithm begins by identifying the regional minima in the image, which are considered as the markers for the different objects. Then, the algorithm simulates a flooding process, where the elevated regions (or catchment basins) are gradually filled with water until they merge at the regional minima. This process creates a set of boundaries that separate the different catchment basins, resulting in the segmentation of the image. The watershed algorithm is particularly useful for segmenting complex and irregular objects, as it is able to find boundaries based on both intensity and spatial information.Translated content:分水岭算法是一种用于分割图像中接触或重叠对象的分割技术。