基于形态学分水岭的图像分割算法摘要关键字图像分割是图像分析.DOC
文本预览下载声明
基于形态学分水岭的图像分割算法
摘要:
关键字:
图像分割是图像分析和处理中一个重要的研究方向,它是许多后续处理的基础。其分割结果的好坏对后续的图像分析、理解及识别都有很大影响。图像分割的算法有很多种,比较常用的有:快速聚类分割、颗粒分割、区域阈值法、边缘检测法以及基于形态学分水岭分割等。其中分水岭变换是图像分割中的一种经典有效的方法,它与经典的边缘检测算法相比,计算精度高,可有效的生成封闭的单像素轮廓,它以快速、有效、准确的分割结果越来越得到人们的重视。
分水岭图像分割方法采用的原理主要有两种:
第一种是模拟浸水过程。首先把一幅图像视为跌宕起伏的地形曲面,图像中每个象素的灰度值对应于地形中的高度,代表了该点在地形中的海拔。在这样的地形中,有盆地(图像中的局部极小区域)、山脊(分水岭)以及盆地和山脊之间的山坡。初始把图像这个有盆地也有山脊的地形模型垂直浸入湖水中,然后在各个盆地的最低处刺上各个洞,使水慢慢均匀浸入各个洞中,当水快要填满盆地,即某两个或多个盆地中的水将要相交融时,就在将要相交的两盆地之间修建堤坝,随着水位的逐渐上涨,最后各个盆地完全被水淹没,只有各个堤坝没被水淹没,而各个盆地又完全被堤坝所包围,从而可以得到各个堤坝(分水岭)和一个个被堤坝分开的盆地(目标物体),从而达到使粘连物体分割的目的。
第二种是模拟降水过程。这种方法也是基于地形学中的地貌特征,同样把一幅图像视为跌宕起伏的地貌模型。在模拟降水过程中,当雨滴落到山地模型上时,必将沿着山坡流人谷底,雨滴所经过的路线就是一个连通分支,也是雨滴到谷底的最陡峭路径,而通往同一谷底的所有连通分支就形成了一个蓄水盆地。
算法实现:
% 分水岭算法
clear, close all;
clc;
PathName=t ;%t为自填内容,下面p类似
FileName=[PathName p];??
Image=imread(FileName);
subplot(2,2,1);subimage(Image);title(原图);;pixval on;
B=[1,1,1;1,1,1;1,1,1];%方形结构元
E8=[-1,0;-1,1;0,1;1,1;1,0;1,-1;0,-1;-1,-1];??? % 8-连通结构元坐标
maskLenth=length(E8);?????? % 结构元点的个数
[X,Y]=size(Image);
%原始图像image 赋值给A1
n=1;
A(:,:,n)=Image;
M=zeros(X,Y);
Mark_Image=zeros(X,Y);
%产生距离图
while sum(sum(A(:,:,n)))~=0
???? A(:,:,n+1)= imerode(A(:,:,n),B);
???? U(:,:,n)= (A(:,:,n)-A(:,:,n+1))*n;
???? M=M+U(:,:,n);
???? n=n+1;
end
n=n-1;
subplot(2,2,2);imagesc(M,[0,n]);title(距离图);
% 搜寻局部最大值,将其放入Deal_Image
Deal_Image=zeros(X,Y);
while n0
for high=1:X
????? for width=1:Y
%********************************************************************
????????? Mark_Bool=0;
????????? if M(high,width)==n
%______________________________________________________________?
??????????? for dot=1:maskLenth
???????????????? i=E8(dot,1); j=E8(dot,2);
???????????????? if high+i=1 width+j=1 high+i=X width+j=Y M(high+i,width+j)M(high,width);
????????????????????? Mark_Bool=1;break;
???????????????? end % if_end
????????????? end % for dot_end
%______________________________________________________________
???????????? if?? Mark_Bool==0;
???????????????? Deal_Image(high,width)=M(high,width);
????????????
显示全部