文章目录

  • 1.基本步骤
  • 2.具体实现
    • 1.读取图像并求其边界
    • 2.直接使用梯度模值进行分水岭算法
    • 3.分别对前景和背景进行标记
    • 4.进行分水岭变换并显示。

1.基本步骤

➊读取图像;
❷求取图像的边界,在此基础上可直接应用分水岭分割算法,但效果不佳;
❸对图像的前景和背景进行标记,其中每个对象内部的前景像素值都是相连的,背景里面的每个像素值都不属于任何目标物体;
❹计算分割函数,应用分水岭变换。

2.具体实现

  如果图像中的目标物体是连接在一起的,则分割起来会更困难,分水岭分割算法经常用于处理这类问题,通常会取得比较好的效果。
  分水岭分割算法把图像看成一幅“地形图”,其中亮度比较强的地区像素值较大,而比较暗的地区像素值较小,通过寻找“汇水盆地”和“分水岭界限”,对图像进行分割。

1.读取图像并求其边界

代码如下:

rgb = imread('pears.png');%读取原图像
I = rgb2gray (rgb) ; %转化为灰度图像
figure; subplot (121) %显示灰度图像
imshow (I)
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);%求模
subplot(122) ; imshow (gradmag, []),%显示梯度
title ('Gradient magnitude (gradmag)')

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

图1

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

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

代码如下:

L = watershed (gradmag) ;%直接应用分水岭算法
Lrgb = label2rgb(L) ;%转化为彩色图像.
figure; imshow(Lrgb), %显示分割后的图像
title( 'Watershed transform of gradient magnitude (Lrgb) ')

  直接使用梯度模值图像进行分水岭算法得到的结果往往会存在过度分割的现象,如图2所示。因此通常需要分别对前景对象和背景对象进行标记,以获得更好的分割效果。

图2

3.分别对前景和背景进行标记

代码如下(示例):

se = strel('disk', 20) ; %圆形结构元素
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) ')
Ioc=imclose(Io,se);%形态学关操作
figure; subplot(121)
imshow(Ioc),%显示关操作后的图像
title('opening-closing (Ioc) ')
Iobrd = imdilate(Iobr, se) ; %对图像进行膨胀
Iobrcbr = imreconstruct(imcomplement (Iobrd),imcomplement(Iobr)) ;%形态学重建
Iobrcbr = imcomplement(Iobrcbr);%图像求反
subplot(122); imshow(Iobrcbr),%显示重建求反后的图像
title ('opening-closing by reconstruction (Iobrcbr) ')
fgm = imregionalmax(Iobrcbr) ; %局部极大值
figure; imshow(fgm), %显示重建后局部极大值图像
title ('Regional maxima of opening-closing by reconstruction (fgm) ')
I2=I;
I2(fgm) = 255;%局部极大值处像素值设置为255
figure; imshow(I2),%在原图上显示极大值区域
title (' Regional maxima superimposed on original image (I2) ')
se2 = strel (ones(5,5));%结构元素
fgm2 = imclose(fgm,se2);%关操作.
fgm3 = imerode (fgm2, se2) ; %腐蚀
fgm4 = bwareaopen (fgm3, 20) ;%开操作
I3=I;
I3 (fgm4) = 255;%前景处设置为255
figure; subplot (121)
imshow (I3) %显示修改后的极大值区域
title ( 'Modified regional maxima')
bw = im2bw (Iobrcbr, graythresh (Iobrcbr)) ; %转化为二值图像
subplot (122); imshow(bw), %显示二值图像
title ('Thresholded opening-closing by reconstruction')

  使用形态学重建技术对前景对象进行标记,首先使用imopen函数对图像进行开操作,如图3中左边图像所示,使用半径为20的圆形结构元素,开操作是膨胀和腐蚀操作的结合。另外一种方法是先对图像进行腐蚀,然后对图像进行形态学重建,处理后的图像如图3右边图像所示。

  在开操作之后进行关操作可以去除一些很小的目标,例如苹果上的茎干和一些污点等,如图4中左边图像所示。另外一种方法是先对图像进行腐蚀,然后对图像进行形态学重建,重建后的图像如图4右边图像所示,注意在重建之前需要先对图像求反,然后在重建之后再进行一次求反。

  对比两幅图像lobrcbr和loc,以重建为基础的开关操作(结果为lobrcbr)比一般的开关操作(结果为loc)在去除小的污点时会更有效,并且不会影响这个图像的轮廓。
计算Iobrcbr的局部极大值会得到比较好的前景标记,如图5所示。

  为了更好地理解这个结果,我们可以在原来图像的基础上,显示局部极大值,对前景图像进行标记,如图6所示。
  注意到图像中还有少部分目标物体,即苹果,未被正确地标记出,如果这些目标物体不能被正确地进行标记,则不能正确地进行分割。并且,少部分前景目标物体已经扩展到边缘,因此应该收缩一下边缘,可以先对图像进行关操作,然后再进行腐蚀来达到这样的效果。
  这个过程会产生一些孤立的像素点,可以使用bwareaopen函数来达到这样的效果,这个过程将像素点数量较少的孤立像素点去除,如图7左边图像所示。

  将图像Iobrcbr 使用合适的阈值转化成二值图像,其中淡颜色的值为背景,转化成的二值图像如图7右边图像所示。

4.进行分水岭变换并显示。

代码如下(示例):

D = bwdist(bw) ;%计算距离
DL = watershed(D) ;%分水岭变换
bgm = DL == 0;%取分割边界
figure; imshow(bgm),%显示分割后的边界
title('Watershed ridge lines (bgm)')
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')

  从图7中可以看出,背景像素是黑色的,但是理想情况下,我们不希望背景标记太靠近目标对象的边缘,可以通过“骨骼化”进行细化,对二值图像的距离进行分水岭变换,然后寻找分水岭的界限,分水岭的界限如图8所示。
  函数imimposenin可以用来对图像进行修改,使图像在-些特定的区域像素值最小。在本程序中,使用imimposemin函数修改梯度模值图像,使梯度模值图像在标记的前景对象和背景对象中有最小值,然后进行分水岭变换得到矩阵L。
  还有一种可视化的技术是在原图像中分别标记前景对象、背景对象和边界。为了使分割的边界更清楚,可以对图像进行膨胀操作,如图9左边图像所示。
  从图9左边图像中可以看出,对前景对象和背景对象标记后再进行分水岭变换比直接在梯度模值图像上进行分水岭变换的效果要好得多。
  另外一种显示分割后图像的方法是使用彩色图像显示,使用label2rgb函数将分水岭变换后的图像显示为彩色,如图9右边图像所示。

  同样也可以在原来图像的基础上,使用透明技术将图像显示为伪彩色图像,如图10所示。

MATLAB图像分割——标记分水岭分割算法相关推荐

  1. 基于matlab山脊线,基于Matlab的标记分水岭分割算法

    lyqmath 1 综述 Separating touching objects in an image is one of the more difficult image processing o ...

  2. 基于Matlab的标记分水岭分割算法(imreconstruct)

    1 综述 Separating touching objects in an image is one of the more difficult image processing operation ...

  3. 图像分割之分水岭分割算法

    基本思想 分水岭(watershed)是地形学中的一个经典概念,例如美国落基山脉分水岭,将美国分为两个区域,落在这个分水岭一边的雨滴,最终会到达大西洋,但是落在另一边的雨滴,最终回流到太平洋.为了提取 ...

  4. matlab迭代分水岭分割,matlab分水岭分割算法

    single [-1, 1] double 17-17 17-17 Normalized Difference Vegetation Index NDVI with Threshold Applied ...

  5. 基于标记的分水岭分割算法

    分水岭技术是一种众所周知的分割算法,特别适用于提取图片中的相邻或重叠对象.使用分水岭方法时,我们必须从用户定义的标记开始.这些标记可以使用点击手动定义,也可以使用阈值或形态学处理方法定义. 分水岭技术 ...

  6. matlab人工选择阈值进行分割,基于MATLAB的图像阈值分割算法的研究

    [摘要]:图像分割是一种重要的数字图像处理技术.本文首先介绍了图像分割技术,其次总结了目前图像分割技术中所用到的阈值.边缘检测.区域提取等方法以及分水岭算法.针对各种阈值分割算法,本文在最后做了详细的 ...

  7. OpenCV watershed分水岭分割算法的实例(附完整代码)

    OpenCV watershed分水岭分割算法的实例 OpenCV watershed分水岭分割算法的实例 OpenCV watershed分水岭分割算法的实例 #include <opencv ...

  8. 做形态学方法的团队_图像分割实战-分水岭分割方法和GrabCut 算法

    1. 分水岭分割方法 它是依赖于形态学的,图像的灰度等级不一样,如果图像的灰度等级一样的情况下怎么人为的把它造成不一样?可以通过距离变换实现,这样它们的灰度值就有了阶梯状的变换.风水岭算法常见的有三种 ...

  9. OpenCV分水岭分割算法2

    分水岭算法是用于分割的经典算法,在提取图像中粘连或重叠的对象时特别有用,例如上图中的硬币. 使用传统的图像处理方法,如阈值和轮廓检测,我们将无法从图像中提取每一个硬币,但通过利用分水岭算法,我们能够检 ...

  10. 图像处理实例--基于分水岭分割进行肺癌判断

    实例背景 为了帮助医生减少重复性工作,对肺部CT图像进行计算机辅助检测的技术被广泛应用于肺癌的诊断和治疗过程中.而图像处理是应用在,对CT图像中医生所关注的区域进行精确的分割和定位.因此需要选择一种合 ...

最新文章

  1. maven mybatis mysql_Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问...
  2. Android游戏开发笔记(一)
  3. 关于Qstring.replace传参Qstring.length为0引起程序退出的记录
  4. oo面向对象第一单元总结
  5. 维护旧项目_为什么您的旧版软件难以维护-以及如何处理。
  6. 数据库实验三 SQL查询数据
  7. vb读出二进制文件,合并两个文件
  8. 微信小程序unionid获取问题
  9. 抓包分析arp攻击Linux,从抓包分析角度分析arp攻击
  10. SOFABoot 扩展点初体验 | SOFALab 实践系列
  11. windows 端口映射
  12. Java实现读取文件夹下(包括子目录)所有文件的文件名
  13. 浅谈InnoDB存储引擎的MVCC机制
  14. python读取并显示图片
  15. 苹果自带的清理软件_为大家推荐几款苹果电脑清理软件中排名较高的软件
  16. Windows11 Windows安全中心无法打开 Windows Defender无法打开
  17. Ubuntu 16.04 安装Tensorflow Object Detection API (一)
  18. 【方便的Opencv】实现图片合成视频+附带图片生成gif
  19. cgns matlab,MATLABSimulink系统建模与仿真实验报告(详细解析)(word文档良心出品).docx...
  20. android 平台上的移动SNS (一)

热门文章

  1. 【Unity3D插件】MiniMap插件分享《小地图插件》
  2. matlab绘制均匀b样条曲线,MATLAB绘制B样条曲线
  3. xbox win10测试软件,UWP APP可通过Win10商店直接安装至XboxOne主机
  4. CVE-2020-11946 ManageEngine OpManager 命令执行
  5. brctl 设置ip_Linux 网桥配置命令:brctl | 学步园
  6. firefox火狐集成idm
  7. prelu()的 tf 代码
  8. 误删libcrypto.so.1.0.0
  9. 《凤凰项目》读书笔记二
  10. 软件设计模式学习笔记(八)