控制标记符分水岭分割算法

(2011-01-10 04:44:39)

转载▼
标签:

控制标记符

分水岭

 

//示例流程

①原图像及默认的分水岭变换:

>> f=imread('rice_tophat.png');
>> h=fspecial('sobel')
h =
     1     2     1
     0     0     0
    -1    -2    -1
>> fd=double(f);
>> g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%梯度,具体参《梯度》博文
>> L=watershed(g);
>> wr=L==0;%分水岭脊线
>> subplot(121),imshow(f),subplot(122),imshow(wr)


从图中看到,过分割现象特别严重。这样的结果完全没有意义。
②计算图像中大量局部最小区域的位置:

>> rm=imregionalmin(f);whos rm
  Name        Size             Bytes  Class      Attributes

rm        253x251            63503  logical

>> figure,imshow(rm)


其中,白点标记的小区域均为“局部最小区域”——这块区域的亮度值相同且其周围的亮度值都比它大。

③计算图像的“扩展的最小变换”,即通过一个阈值来扩展“局部最小区域”(让更多的与最小区域相似的像素合并到最小区域里边来):

>> im2=imextendedmin(f,45);%试了多次,阈值为45左右效果较好

>> figure,imshow(im2)
>>fim=f;fim(im2)=175;figure,imshow(fim)%以灰色来显示这些“局部最小区域”

(此时,所有亮的区域均为扩展的“局部最小区域”)
 
可以看到,将扩展的局部最小区域叠加到原图像上后的效果。灰度区域灰度值为175.

这个“扩展的局部最小区域”作为内部标记符集合。

//不对,内部标记应选在要提取的目标上,这幅图像中要提取的是米粒图像,故作如下修改:

>>im2=~im2;%im2是 二值矩阵,取反即可

>>fim=f;fim(im2)=175;figure,imshow(fim,[])


可见,已将米粒区域修改为对应的“扩展最小区域”——这个作为内部标记符
④寻找外部标记符:

>> temp=bwdist(im2);%距离变换

>>figure,imshow(temp,[])


>>Lim=watershed(temp);

>>em=Lim==0;
>>figure,imshow(em) %em=external marker,外部标记符


结果显示一片黑,进一步查看:

>> whos em
  Name        Size             Bytes  Class      Attributes

em        253x251            63503  logical

>> max(em(:))
ans =
     0

原因:距离变换后得到的一些孤立的亮区域,那些区域包含分水岭脊线,而所有的黑色区域对应汇水盆地。em包含在所有亮区域内,不能连通。求出的分水岭变换全为1:没找到合适的分水岭脊线(不能形成对图像有效分割的分水岭脊线)。
实际上,应该对im2的补求分水岭变换,这样求得的分水岭脊线就在米粒之间,这个作为外部标记符。

下面对“扩展局部最小区域(im2)”的补求分水岭变换:

>> temp=bwdist(~im2);figure,imshow(temp,[])


和预料的一样,目标区域为汇水盆地。最亮的地方对应分水岭脊线。

>> Lim=watershed(temp);em=Lim==0;figure,imshow(em)
 
这些脊线应该作为外部标记才对!

⑤仿二值图像分水岭分割的方法,将此区域叠加到原图像上:

>> f(em)=255;figure,imshow(f,[])


可看到,过分割现象已不存在了,但出现了一点误分割(右下角处)。

⑥对于标记分水岭方法来说,第⑤步应该修改为:给出内部和外部标记后,就可以使用它们来修改梯度图像——使用称为“强制最小”的过程。方法如下:

>> g2=imimposemin(g,im2 | em);%im2为内部标记,em为外部标记
>> L2=watershed(g2);

>> f2=f;f2(L2==0)=255;figure,imshow(f2,[])


分割到的结果比较理想,但为什么会有一部分没有被分割??
总结一下整个程序:

f=imread('rice_tophat.png');

h=fspecial('sobel');

fd=double(f);

g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);

rm=imregionalmin(f);

im2=imextendedmin(f,45);%阈值要通过观察来定

im2=~im2;

temp=bwdist(im2);

Lim=watershed(temp);em=Lim==0;

g2=imimposemin(g,im2|em);

L2=watershed(g2);

f2=f;f2(L2==0)=255;

figure,imshow(f2,[])

//要根据实际情况来定,如中间不一定要经过im2=~im2;的转换。总体流程是这样的。

控制标记符分水岭分割算法 此博文包含图片相关推荐

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

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

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

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

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

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

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

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

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

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

  6. Latex使用技巧:双栏模式下的跨栏长公式(APS期刊,PRL,PRA,PRB...) 此博文包含图片 (2017-03-16 16:41:49)转载▼

    Latex使用技巧:双栏模式下的跨栏长公式(APS期刊,PRL,PRA,PRB-) 此博文包含图片 (2017-03-16 16:41:49)转载▼ 标签: latex ctec 论文写作 技巧 长公 ...

  7. OpenCV分水岭分割算法2

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

  8. TortoiseSVN日常使用指南 此博文包含图片

      本文目的在与描述TortoiseSVN客户端的日常使用.不是一个版本控制系统指南,也不是Subversion (SVN)的指南.本文档的价值在于,当你知道大概要做什么,却又记不起应该怎么做的时候, ...

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

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

  10. C4.5决策树 此博文包含图片 (2011-10-20 23:22:19)转载▼ 标签: 分类树

    C4.5决策树 (2011-10-20 23:22:19) 转载▼ 标签: 分类树 决策树 c4.5 机器学习 数据挖掘 分类: 数据挖掘 1. 算法背景介绍 分类树(决策树)是一种十分常用的分类方法 ...

最新文章

  1. 纯js制作的弹球游戏
  2. Flink SQL Client注册JAVA UDF完整流程
  3. 自动生成web服务器日志解析规则
  4. 接口自动化- 基于 Python
  5. python开源嵌入式_Neo4j 推出基于 Python 的嵌入式图数据存储
  6. (26)计数器verilog与VHDL编码(学无止境)
  7. SQL Tuning 基础概述05 - Oracle 索引类型及介绍
  8. java备忘录模式应用场景_Java描述设计模式(24):备忘录模式
  9. java 植入 form_pdf form表单制作以及用java程序填充表单
  10. 消控中心人员配置_消控室的设置要求有哪些?
  11. Web前端零基础入门HTML5+CSS3学习笔记补充
  12. 如何改变图片尺寸?怎么调整图片大小?
  13. leetcode:954. 二倍数对数组
  14. html5 代码画兰博基尼跑车,6不6你说的算!
  15. 基于php学生社团活动报名系统
  16. 《卓有成效的管理者》——学习心得(八)
  17. 光敏二极管血氧仪方案设计研发
  18. Win10开启和使用Hyper-V功能
  19. 《汇编语言》王爽(第四版)第八章 实验7
  20. 一些OpenGL 问题记录

热门文章

  1. CMake 使用总结(转载)
  2. 每日一道剑指offer-替换空格
  3. android httpclient webview,android – 访问WebView中的http响应头?
  4. android中修饰void的类型,方法添加Android中
  5. exxi6.7如何传文件到win7_win7系统被删除文件如何恢复 恢复被删除的文件操作方法【详解】...
  6. Java进阶:Spring
  7. Java基础:继承的综合案例 —— 群主发普通红包
  8. 实战CSS:小米商城静态实现
  9. 计算机应用基础实验报告册,大学计算机应用基础实验报告册 - 2010版 - (1)
  10. mysql5.7.22的配置说明_mysql 5.7.22 免安裝版Windows配置