×

分水岭算法

MATLAB 分水岭分割算法?帮帮我 我不知道分水岭算法在图像分割中的应用 代码,还有别的帮帮我

admin admin 发表于2022-05-28 11:01:50 浏览108 评论0

抢沙发发表评论

MATLAB 分水岭分割算法


其实,这涉及到命令和算法,单一的命令往往不能解决所有的问题,要有前处理或后处理,才能达到目的。另外,也说明,某个命令应该升级或更新了。所以,watershed这个命令,单用达不到所期望的效果,只有加上预处理才行。

帮帮我 我不知道分水岭算法在图像分割中的应用 代码,还有别的帮帮我


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),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;

figure
subplot(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; %从原图对分水岭进行观察
figure
subplot(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);

如何计算分水岭分割后区域的像素个数


这个其实在进行分水岭分割的过程就能过直接得到。
如果你是基于标记点的meyer分水岭分割算法,那么在没有进行区域合并和仅仅使用分水岭分割的情况下,标记点的数目等于最终的分水岭分割区域的数目。
如果你是原始的Vincen分水岭分割算法,程序中会将每个区域梯度极小值作为集水点开始涨水,那么每遇到一个新的集水点,则会出现一个新的集水盆地,对应的就是一个分水岭分割区域。
所以,只要你会分水岭分割算法,你就很轻而易举的知道分水岭分割区域的数目。
如果你是只有一幅分水岭分割图的话,可以看看联通区域标记算法,也可以很容易的获取联通区域的个数,每个联通区域对应一个分割区域。
-分水岭算法