分
分
水
水
岭
岭
算
算
法
法
演
演
示
示
顾一清 付叶亮
直接应用分水岭分割算法,但效果不佳
• clear, close all;
• clc;
• %1.读取图像并求取图像的边界。
• rgb = imread('tree.jpeg');%读取原图像
• I = rgb2gray(rgb);%转化为灰度图像
• figure; subplot(121)%显示灰度图像
• imshow(I)
• text(732,501,'Image courtesy of Corel','FontSize',7,'HorizontalAlignment','right')
• hy = fspecial('sobel');%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('Gradient magnitude (gradmag)')
• %2. 直接使用梯度模值进行分水岭算法:(往往会存在过的分割的情况,效
果不好)
• L = watershed(gradmag);%直接应用分水岭算法
• Lrgb = label2rgb(L);%转化为彩色图像
• figure; imshow(Lrgb), %显示分割后的图像
• title('Watershed transform of gradient magnitude (Lrgb)')%过分割现象
使用形态学重建技术对前景对象进行标记
• %开和闭这两种运算可以除去比结构元素小的特定图像细节,同时保
%证不产生全局几何失真。
• se = strel('disk', 4);%圆形结构元素
• Io = imopen(I, se);%形态学开操作,去掉一些很小的目标
• figure; subplot(121)
• imshow(Io), %显示执行开操作后的图像
• title('Opening (Io)')
• Ie = imerode(I, se);%对图像进行腐蚀
• Iobr = imreconstruct(Ie, I);%形态学重建
• subplot(122); imshow(Iobr), %显示重建后的图像
• title('Opening-by-reconstruction (Iobr)')