利用分水岭算法进行图像分割matlab实现

利用分水岭算法进行图像分割matlab实现

1’原理
分水岭算法将图像看成“地形图”,灰度值大的对应山峰,灰度值小的对应集水盆,集水盆边界即为分水岭。
在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。
2’步骤
1’’读取图像转化为灰度图
2’’求图像梯度,对梯度应用分水岭算法(容易过度分割,效果不佳)
或者对图像前景和背景进行标记
3’’对图像计算分水岭
3’实现

%% 
clear;clc;close all;
img_gray=imread('gantrycrane.png');%读取图片
img_gray=rgb2gray(img_gray);
%% 求梯度,对梯度图像求分水岭
% img_gray_=double(img_gray);
% [GX,GY]=mygradient(img_gray_);  
% img_grad=sqrt(GX.*GX+GY.*GY); 
% img_blur=myblur(img_grad);
% img_blur=uint8(img_blur);
% water_line__=watershed(img_blur);           %
% water_line_=(water_line__==0)
% imshow(water_line_,[])
%% 腐蚀膨胀,基于标记的分水岭
se = strel('disk',2);
Ie = imerode(img_gray, se);
Iobr = imreconstruct(Ie, img_gray);
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
bw = imbinarize(Iobrcbr, graythresh(Iobrcbr));
D = bwdist(bw);
D=uint8(D);
%% 获取分水岭

 water_line__=watershed(D);           
 water_line_=(water_line__==0)
imshow(water_line_,[])


你可能感兴趣的:(图像处理,算法,matlab,matlab,计算机视觉,算法,拓扑学,后端)