分⽔岭算法matlab的三种实现⽅法.本⽂转⾃:
clear,clc%三种⽅法进⾏分⽔岭分割
%读⼊图像
filename='sar1.bmp';
f=imread(filename);
Info=imfinfo(filename);
if Info.BitDepth>8
f=rgb2gray(f);
end
figure,
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从⼆值图像中取值
figure
subplot(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),
用subplot函数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);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论