matlab实现分水岭算法

数学形态学以图像的形态特征为研究对象,用具有一定形态的结构元素描述图像中元素与元素、部分与部分之间的关系,以达到对图像分析和识别的目的。数学形态学用于基于区域的图像分割最典型的例子就是分水岭(Watershed)方法。 
分水岭算法(Watershed)基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。 
分水岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化,都会产生过度分割的现象。figure2就是直接对梯度图进行分水岭算法的结果,产生了严重的过分割。

为消除分水岭算法产生的过度分割,通常对梯度图片进行预处理。frgure4就是先对梯度图进行了形态学的开闭运算在使用分水岭算法。 
还有一些学者对梯度图片在结合形态学开闭运算的特点,对原始图像进行形态开闭预重建,在计算形态梯度之后采用开闭后重建,对梯度进行给定的阈值变换,引入给定尺度等级的非线性分类,在像素连通关系的基础上,研究了一种改进的分水岭标记算法进行分割,取得了较好的图像分割效果。 

参考论文:一种基于分水岭变换的图像分割方案_杨文明

MATLAB实现分水岭算法如下(直接对梯度使用分水岭算法和经过开闭运算相对比) 
%1.读取图像并求取图像的边界。 
clc; 
clear all; 
rgb = imread(‘1.jpg’);%读取原图像 
imshow(rgb); 
I = rgb2gray(rgb);%转化为灰度图像 
text(732,501,’Image courtesy of Corel’,… 
‘FontSize’,7,’HorizontalAlignment’,’right’) 
hy = fspecial(‘sobel’);%sobel算子 
hx = hy’; 
Iy = imfilter(double(I), hy, ‘replicate’);%滤波求y方向边缘 
Ix = imfilter(double(I), hx, ‘replicate’);%滤波求x方向边缘 
gradmag = sqrt(Ix.^2 + Iy.^2);%求摸 
L = watershed(gradmag);%直接应用分水岭算法 
Lrgb = label2rgb(L);%转化为彩色图像 
figure; 
imshow(Lrgb), %显示分割后的图像 
title(‘直接使用梯度模值进行分水岭算法’) 
%3.分别对前景和背景进行标记:本例中使用形态学重建技术对前景对象进行标记,首先使用开操作,开操作之后可以去掉一些很小的目标。 
se = strel(‘disk’, 20);%圆形结构元素 
Io = imopen(I, se);%形态学开操作 
Ie = imerode(I, se);%对图像进行腐蚀 
Iobr = imreconstruct(Ie, I);%形态学重建 
Ioc = imclose(Io, se);%形态学关操作 
Iobrd = imdilate(Iobr, se);%对图像进行膨胀 
Iobrcbr = imreconstruct(imcomplement(Iobrd), … 
imcomplement(Iobr));%形态学重建 
Iobrcbr = imcomplement(Iobrcbr);%图像求反 
fgm = imregionalmax(Iobrcbr);%局部极大值 
I2 = I; 
I2(fgm) = 255;%局部极大值处像素值设为255 
se2 = strel(ones(5,5));%结构元素 
fgm2 = imclose(fgm, se2);%关操作 
fgm3 = imerode(fgm2, se2);%腐蚀 
fgm4 = bwareaopen(fgm3, 20);%开操作 
I3 = I; 
I3(fgm4) = 255;%前景处设置为255 
bw = im2bw(Iobrcbr, graythresh(Iobrcbr));%转化为二值图像 
%4. 进行分水岭变换并显示: 
D = bwdist(bw);%计算距离 
DL = watershed(D);%分水岭变换 
bgm = DL == 0;%求取分割边界 
gradmag2 = imimposemin(gradmag, bgm | fgm4);%置最小值 
L = watershed(gradmag2);%分水岭变换 
I4 = I; 
I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255;%前景及边界处置255 
figure; 
subplot(121) 
imshow(I4)%突出前景及边界 
title(‘Markers and object boundaries’) 
Lrgb = label2rgb(L, ‘jet’, ‘w’, ‘shuffle’);%转化为伪彩色图像 
subplot(122); imshow(Lrgb)%显示伪彩色图像 
title(‘Colored watershed label matrix’) 
figure; 
imshow(I), 
hold on 
himage = imshow(Lrgb);%在原图上显示伪彩色图像 
set(himage, ‘AlphaData’, 0.3); 
title(‘Lrgb superimposed transparently on original image’) 


转载自:http://blog.csdn.net/jiang111_111shan/article/details/41454261

http://blog.sina.com.cn/s/blog_725866260100rz7x.html

http://blog.csdn.net/jiake_yang/article/details/51367263

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值