小言_互联网的博客

【图像分割】基于分水岭算法的图像分割matlab源码

398人阅读  评论(0)

一、简介

分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点:

极小值点,该点对应一个盆地的最低点,当我们在盆地里滴一滴水的时候,由于重力作用,水最终会汇聚到该点。注意:可能存在一个最小值面,该平面内的都是极小值点。
盆地的其它位置点,该位置滴的水滴会汇聚到局部最小点。
盆地的边缘点,是该盆地和其它盆地交接点,在该点滴一滴水,会等概率的流向任何一个盆地。

明白上述三种点之后,我们开始往盆地的极小值点注水,然后随着注水的深入,每一个极小值点慢慢的向外扩展,然后知道两个盆地的水汇合,汇合处就是我们需要的分水岭。

从下图可以直观理解一下,首先这三块区域都含有极小值点

然后逐渐填充就能获得分水岭(即分界线)

得到分界线就能完成图像分割:

二、源代码


  
  1. clear, close all;
  2. clc;
  3. %1.读取图像并求取图像的边界。
  4. rgb = imread( 'tree.jpeg'); %读取原图像
  5. I = rgb2gray(rgb); %转化为灰度图像
  6. figure; subplot( 121) %显示灰度图像
  7. imshow(I)
  8. text( 732, 501, 'Image courtesy of Corel', 'FontSize', 7, 'HorizontalAlignment', 'right')
  9. hy = fspecial( 'sobel'); %sobel算子,应用sobel算子锐化图像
  10. hx = hy';
  11. Iy = imfilter(double(I), hy, 'replicate'); %滤波求y方向边缘
  12. Ix = imfilter(double(I), hx, 'replicate'); %滤波求x方向边缘
  13. gradmag = sqrt(Ix.^ 2 + Iy.^ 2); %求摸
  14. subplot( 122); imshow(gradmag,[]), %显示梯度
  15. title( 'Gradient magnitude (gradmag)')
  16. %2. 直接使用梯度模值进行分水岭算法:(往往会存在过的分割的情况,效果不好)
  17. L = watershed(gradmag); %直接应用分水岭算法
  18. Lrgb = label2rgb(L); %转化为彩色图像
  19. figure; imshow(Lrgb), %显示分割后的图像
  20. title( 'Watershed transform of gradient magnitude (Lrgb)') %过分割现象
  21. %3.分别对前景和背景进行标记:本例中使用形态学重建技术对前景对象进行标记,首先使用开操作,开操作之后可以去掉一些很小的目标。
  22. %开和闭这两种运算可以除去比结构元素小的特定图像细节,同时保证不产生全局几何失真。
  23. %开运算可以把比结构元素小的突刺滤掉,切断细长搭接而起到分离作用;
  24. %闭运算可以把比结构元素小的缺口或孔填充上,搭接短的间断而起到连接作用。
  25. se = strel( 'disk', 4); %圆形结构元素,STREL('disk',R,N),R is the specified radius, When N is greater than 0, the disk-shaped structuring
  26. %element is approximated by a sequence of N
  27. Io = imopen(I, se); %形态学开操作
  28. figure; subplot( 121)
  29. imshow(Io), %显示执行开操作后的图像
  30. title( 'Opening (Io)')
  31. Ie = imerode(I, se); %对图像进行腐蚀,基本参数:待处理的输入图像以及结构元素对象
  32. Iobr = imreconstruct(Ie, I); %形态学重建
  33. subplot( 122); imshow(Iobr), %显示重建后的图像
  34. title( 'Opening-by-reconstruction (Iobr)')
  35. Ioc = imclose(Io, se); %形态学关操作,首先膨胀,然后腐蚀,两个操作使用同样的结构元素
  36. figure; subplot( 121)
  37. imshow(Ioc), %显示关操作后的图像
  38. title( 'Opening-closing (Ioc)')
  39. Iobrd = imdilate(Iobr, se); %对图像进行膨胀,基本参数:待处理的输入图像和结构元素对象。
  40. Iobrcbr = imreconstruct(imcomplement(Iobrd), ...
  41. imcomplement(Iobr)); %形态学重建
  42. Iobrcbr = imcomplement(Iobrcbr); %图像求反
  43. subplot( 122); imshow(Iobrcbr), %显示重建求反后的图像,figure4
  44. title( 'Opening-closing by reconstruction (Iobrcbr)')
  45. %As you can see by comparing Iobrcbr with Ioc,
  46. %reconstruction-based opening and closing are more
  47. %effective than standard opening and closing at removing
  48. %small blemishes without affecting the overall
  49. %shapes of the objects. Calculate the regional maxima
  50. %of Iobrcbr to obtain good foreground markers.
  51. fgm = imregionalmax(Iobrcbr); %局部极大值
  52. figure; imshow(fgm), %显示重建后局部极大值图像,figure5
  53. title( 'Regional maxima of opening-closing by reconstruction (fgm)')
  54. I2 = I; %前景标记图与原图叠加
  55. I2(fgm) = 255; %局部极大值处像素值设为255
  56. figure; imshow(I2), %在原图上显示极大值区域,figure6
  57. title( 'Regional maxima superimposed on original image (I2)')
  58. se2 = strel(ones( 3, 3)); %结构元素
  59. fgm2 = imclose(fgm, se2); %关操作
  60. fgm3 = imerode(fgm2, se2); %腐蚀
  61. fgm4 = bwareaopen(fgm3, 20); %开操作
  62. I3 = I;
  63. I3(fgm4) = 255; %前景处设置为255
  64. figure; subplot( 121)
  65. imshow(I3) %显示修改后的极大值区域,figure7
  66. title( 'Modified regional maxima')
  67. bw = im2bw(Iobrcbr, graythresh(Iobrcbr)); %转化为二值图像
  68. subplot( 122); imshow(bw), %显示二值图像,figure7
  69. title( 'Thresholded opening-closing by reconstruction')
  70. %4. 进行分水岭变换并显示:
  71. D = bwdist(bw); %计算距离
  72. DL = watershed(D); %分水岭变换
  73. bgm = DL == 0; %求取分割边界

三、运行结果









四、备注

完整代码或者仿真咨询添加QQ1575304183


转载:https://blog.csdn.net/weixin_50197058/article/details/117050136
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场