黑暗之魂3罗蕾塔:17.5 分水岭分割算法(1) - 51CTO.COM

来源:百度文库 编辑:九乡新闻网 时间:2024/04/20 12:50:05

17.5 分水岭分割算法(1)

http://book.51cto.com  2009-06-24 13:35  张强/王正林  电子工业出版社  我要评论(0)
  • 摘要:《精通MATLAB图像处理》第17章MATLAB图像分割实战,本章主要讲述了图像分割方面的7大实例,读者通过这些实例,能够熟练掌握MATLAB在图像分割方面的应用。本节为大家介绍分水岭分割算法。
  • 标签:MATLAB  图像处理  精通MATLAB图像处理
  • Oracle帮您准确洞察各个物流环节

17.5  分水岭分割算法(1)

分水岭分割算法的基本步骤如下:

读取图像;

求取图像的边界,在此基础上可直接应用分水岭分割算法,但效果不佳;

对图像的前景和背景进行标记,其中每个对象内部的前景像素值都是相连的,背景里面的每个像素值都不属于任何目标物体;

计算分割函数,应用分水岭变换。

下面我们通过一个例子来看一下分水岭分割算法的实现。

例17-6   标记分水岭分割算法。

如果图像中的目标物体是连接在一起的,则分割起来会更困难,分水岭分割算法经常用于处理这类问题,通常会取得比较好的效果。

分水岭分割算法把图像看成一幅"地形图",其中亮度比较强的地区像素值较大,而比较暗的地区像素值较小,通过寻找"汇水盆地"和"分水岭界限",对图像进行分割。

【本例要点】直接应用分水岭分割算法的效果往往并不好,如果在图像中对前景对象和背景对象进行标注区别,再应用分水岭算法会取得较好的分割效果。这个例子用到了很多图像处理工具箱的函数,例如fspecial、imfilter、watershed、label2rgb、imopen、imclose、imreconstruct、imcomplement、imregionalmax、bwareaopen、graythresh和imimposemin函数等。

本例的基本步骤如下:

读取图像并求其边界。

代码如下:

  1. rgb = imread('pears.png');%读取原图像  
  2. I = rgb2gray(rgb);%转化为灰度图像  
  3. figure; subplot(121)%显示灰度图像  
  4. imshow(I)  
  5. text(732,501,'Image courtesy of Corel',...  
  6.      'FontSize',7,'HorizontalAlignment','right')  
  7. hy = fspecial('sobel');%sobel算子  
  8. hx = hy';  
  9. Iy = imfilter(double(I), hy, 'replicate');%滤波求y方向边缘  
  10. Ix = imfilter(double(I), hx, 'replicate');%滤波求x方向边缘  
  11. gradmag = sqrt(Ix.^2 + Iy.^2);%求模  
  12. subplot(122); imshow(gradmag,[]), %显示梯度  
  13. title('Gradient magnitude (gradmag)') 

在这一步骤中,首先读取一幅真彩色图像,然后把真彩色图像转化为灰度图像,如图17-19中左边图像所示。

  (点击查看大图)图17-19  原图和梯度图像

使用sobel边缘算子对图像进行水平和垂直方向的滤波,然后求取模值,sobel算子滤波后的图像在边界处会显示比较大的值,在没有边界处的值会很小,如图17-19中右边图像所示。

直接使用梯度模值进行分水岭算法。

代码如下:

  1. L = watershed(gradmag);%直接应用分水岭算法  
  2. Lrgb = label2rgb(L);%转化为彩色图像  
  3. figure; imshow(Lrgb), %显示分割后的图像  
  4. title('Watershed transform of gradient magnitude (Lrgb)') 
直接使用梯度模值图像进行分水岭算法得到的结果往往会存在过度分割的现象,如图17-20所示。因此通常需要分别对前景对象和背景对象进行标记,以获得更好的分割效果。   图17-20  直接对梯度图像进行分水岭分割 分别对前景和背景进行标记。
  1. se = strel('disk', 20);%圆形结构元素  
  2. Io = imopen(I, se);%形态学开操作  
  3. figure; subplot(121)  
  4. imshow(Io), %显示执行开操作后的图像  
  5. title('Opening (Io)')  
  6. Ie = imerode(I, se);%对图像进行腐蚀  
  7. Iobr = imreconstruct(Ie, I);%形态学重建  
  8. subplot(122); imshow(Iobr), %显示重建后的图像  
  9. title('Opening-by-reconstruction (Iobr)')  
  10. Ioc = imclose(Io, se);%形态学关操作  
  11. figure; subplot(121)  
  12. imshow(Ioc), %显示关操作后的图像  
  13. title('Opening-closing (Ioc)')  
  14. Iobrd = imdilate(Iobr, se);%对图像进行膨胀  
  15. Iobrcbr = imreconstruct(imcomplement(Iobrd), ...  
  16.     imcomplement(Iobr));%形态学重建  
  17. Iobrcbr = imcomplement(Iobrcbr);%图像求反  
  18. subplot(122); imshow(Iobrcbr), %显示重建求反后的图像  
  19. title('Opening-closing by reconstruction (Iobrcbr)')  
  20. fgm = imregionalmax(Iobrcbr);%局部极大值  
  21. figure; imshow(fgm), %显示重建后局部极大值图像  
  22. title('Regional maxima of opening-closing by reconstruction (fgm)')  
  23. I2 = I;  
  24. I2(fgm) = 255;%局部极大值处像素值设置为255  
  25. figure; imshow(I2), %在原图上显示极大值区域  
  26. title('Regional maxima superimposed on original image (I2)')  
  27. se2 = strel(ones(5,5));%结构元素  
  28. fgm2 = imclose(fgm, se2);%关操作  
  29. fgm3 = imerode(fgm2, se2);%腐蚀  
  30. fgm4 = bwareaopen(fgm3, 20);%开操作  
  31. I3 = I;  
  32. I3(fgm4) = 255;%前景处设置为255  
  33. figure; subplot(121)  
  34. imshow(I3)%显示修改后的极大值区域  
  35. title('Modified regional maxima')  
  36. bw = im2bw(Iobrcbr, graythresh(Iobrcbr));%转化为二值图像  
  37. subplot(122); imshow(bw), %显示二值图像  
  38. title('Thresholded opening-closing by reconstruction')