当前位置:文档之家› 分水岭算法(完整版)

分水岭算法(完整版)

分水岭分割算法的实现 与分析
青 衣
11053413 李小泷
• 分水岭算法实现步骤:先把图片转化为灰度梯度级图像, 在图像梯度空间内逐渐增加一个灰度阈值,每当它大于一 个局部极大值时,就把当时的二值图像(只区分陆地和水 域,即大于灰度阈值和小于灰度阈值两部分)与前一个时 刻(即灰度阈值上一个值的时刻)的二值图像进行逻辑异或 (XOR)操作,从而确定出灰度局部极大值的位置 。根据所 有灰度局部极大值的位置集合就可确定分水岭。
Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');%转 化为伪彩色图像 subplot(122); imshow(Lrgb)%显示伪彩色图 像 title('分水岭伪彩色图像') 青 衣
figure; imshow(I), hold on himage = imshow(Lrgb);%在原图上显示 伪彩色图像 set(himage, 'AlphaData', 0.3); title('原图像上的Lrgb处理')
imcomplement(Iobr));%形态学重建 Iobrcbr = imcomplement(Iobrcbr);%图像求反 subplot(122); imshow(Iobrcbr), %显示重建求反后的 图像 title('重建求反后的图像(Iobrcbr)')
fgm = imregionalmax(Iobrcbr);%局部极大值 figure; imshow(fgm), %显示重建后局部极大值图像 title('重建后局部极大值图像(fgm)')
此时再进行分水岭变换并显示得到的效果。
青 衣
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('突出前景及边界')
先做sobel算子用于边缘提取,然后转化为梯度级图像
青 衣
L = watershed(gradmag);%直接应用 分水岭算法 Lrgb = label2rgb(L);%转化为彩色图像 figure; imshow(Lrgb), %显示分割后的 图像 title('分割梯度级图像(Lrgb)')
青 衣
Watershed是matlab自带的函数,调用这个函 数后可直接应用分水岭分割算法,图像依稀可 以看到物体的轮廓,但效果不佳。
• 为使分水岭分割算法的效果更好,可分别对图像前景和背 景进行标记:本例中使用形态学重建技术对前景对象进行 标记,首先使用开操作,开操作之后可以去掉一些很小的 目标
青 衣
fgm3 = imerode(fgm2, se2);%腐蚀
fgm4 = bwareaopen(fgm3, 20);%开操作
I3 = I;
I3(fgm4) = 255;%前景处设置为255

figure; subplot(121)

imshow(I3)%显示修改后的极大值区域
title('修改后的极大值区域')
青 衣
rgb = imread('pears.png');%读取原图像 imshow(rgb) title('原图')
I = rgb2gray(rgb);%转化为灰度图像 figure; subplot(121)%显示一行两列第1张 imshow(I) title('原图灰度图像')
青 衣
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);%求摸 subplot(122); imshow(gradmag,[]), %显示梯度 title('(gradmag)梯度级')
Ioc = imclose(Io, se);%形态学关操作 figure; subplot(121) imshow(Ioc), %显示关操作后的图像 title('关操作(Ioc)')
青 衣Βιβλιοθήκη Iobrd = imdilate(Iobr, se);%对图像进行膨胀 Iobrcbr = imreconstruct(imcomplement(Iobrd), ...
青 衣
I2 = I; I2(fgm) = 255;%局部极大值处像素值设为255 figure; imshow(I2), %在原图上显示极大值区域 title('原图上的极大值区域(I2)')
se2 = strel(ones(5,5));%结构元素
fgm2 = imclose(fgm, se2);%关操作
se = strel('disk', 20);%圆形结构元素 Io = imopen(I, se);%形态学开操作 figure; subplot(121) imshow(Io), %显示执行开操作后的图像
title('开操作之后的图像(Io)') Ie = imerode(I, se);%对图像进行腐蚀 Iobr = imreconstruct(Ie, I);%形态学重建 subplot(122); imshow(Iobr), %显示重建后的图像 title('打开重建(Iobr)')
bw = im2bw(Iobrcbr, graythresh(Iobrcbr));%转化为二值图像 subplot(122); imshow(bw), %显示二值图像 title('开关重建之后的阈值图像')
D = bwdist(bw);%计算距离 DL = watershed(D);%分水岭变换 bgm = DL == 0;%求取分割边界 figure; imshow(bgm), %显示分割后的边界 title('(bgm)分水岭法分割线')
相关主题