数学形态学以图像的形态特征为研究对象,用具有一定形态的结构元素描述图像中元素与元素、部分与部分之间的关系,以达到对图像分析和识别的目的。数学形态学用于基于区域的图像分割最典型的例子就是分水岭(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’)