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

2 篇文章 0 订阅
1 篇文章 0 订阅

利用分水岭算法进行图像分割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_,[])


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值