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;
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);
以上是分水岭的算法,这是摘抄自百度知道的里的回复,感觉挺好,就年过来了。摘抄地址http://zhidao.baidu.com/question/254301763.html
分享到:
相关推荐
基于标记的分水岭自动分割算法,目的是为了降低分水岭的过分割问题。较为准确地标记提取方法可以实现对图像的成功分割。
分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界...
用Matlab实现分水岭算法,这个算法是图像边缘检测的常用算法。
MATLAB自己实现的分水岭算法,细节都是自己实现的,严格按照原本步骤实现,没有任何加速算法,带一张图片,可与MATLAB自带分水岭算法比较,看不出区别,中科大数字图像分析作业,自己做的,慎重下载
分水岭算法是现在医学图像分割的经典算法,具有非常高的参考价值
效果很好的分水岭算法!利用MATLAB编写,需要的自行下载!
matlab实现图像分水岭分割算法并且有改进的算法实现,两者相互比较效果,并且文档最后直接复制了全部的实现代码
这是数字调制解调技术的MATLAB与FPGA实现——AlteraVerilog版书的随书光盘。里面有FPGA工程和MATLAB .m原文件。
用分水岭算法进行图像分割,借鉴形态学理论,将一幅图看成拓扑性地图,其中灰度值对应地形高度。(The watershed algorithm is used for image segmentation, and a map is regarded as a topological map, in which ...
用MATLAB实现进化策略算法——求特定方程的极小值.pdf
本代码主要利用MATLAB工具实现MATLAB——遗传算法路径规划,简单明了,易于理解
arnold置乱算法matlab实现 里面有arnold的程序
这是分水岭算法的实现,有ppt,用matlab实现
新型群智能优化算法(matlab实现)——烟花算法、粒子群算法、蚁群算法。压缩包里有使用手册信息,方便读者使用
BP+近邻KNN+LS最小二乘算法的matlab代码——亲测可用(含实例)
【图像分割】基于分水岭算法实现细胞分割计数matlab源码.zip
分水岭算法对图像进行分割,实验结果自己在MATLAB上运行过,可以得出结果。
多目标检测追踪算法MATLAB实现,追踪多个监控目标,MATLAB实现
LOF离群因子算法,是基于密度的用于噪声和异常数据检测的常用算法,它通过为每个数据计算异常因子,来判断该数据是否为噪声或干扰数据。
matlab程序——蚁群算法,完整代码。