图像骨架提取,实际上就是提取目标在图像上的中心像素轮廓。说白了就是以目标中心为准,对目标进行细化,一般细化后的目标都是单层像素宽度。比如输入图像是这样:

输出骨架图像(红色)

关于骨架提取,现存的算法有一千种以上(论文[1]中谈到,There are more than one thousand algorithms that have been published on this topic)。论文[1]中提到,所有的骨架提取算法无外乎分为迭代和非迭代两大类。在迭代算法中,又分为并行迭代和顺序迭代两种。

本文分别介绍两种提取算法,它们分别来源于论文[1](K3M顺序迭代)、[2](Zhang-Suenalgorithm,并行迭代)。

这两种方法都是对二值图像操作的,思想都是从目标外围往目标中心,利用以待检测像素为中心3*3像素窗口的特征,对目标不断腐蚀细化,直至腐蚀到不能再腐蚀(单层像素宽度),就得到了图像的骨架。下面详细介绍一下两种骨架提取算法。

一 K3M

该算法的思想是,提取目标外围轮廓,然后利用轮廓腐蚀目标图像边界(这是一次迭代过程),直至腐蚀到不能再腐蚀。

算法分为两块

第一块,不断腐蚀,提取出伪骨架(部分区域有两层像素宽度,但已经很接近真实骨架)。

第二块,从伪骨架中提取真实骨架。

  • 第一块:提取出伪骨架

每次迭代共有6步。不断迭代,直至某次迭代的过程,目标边界中没有新的像素被腐蚀,那么此时,剩余的目标图像像素就很接近于真实骨架(称之为伪骨架)。

<1>提取最新目标轮廓(初始为原目标轮廓)并记录这些轮廓点。

<2>依次检测这些轮廓点的8像素邻域,是否只含有3连通像素,如果有,把此点从轮廓点删除,并在目标图像中删除(腐蚀掉)对应点。

<3>依次检测<2>中剩余轮廓点的8像素邻域,是否只含有3 or 4连通像素,如果有,把此点从轮廓点删除,并在目标图像中删除(腐蚀掉)对应点。

<4>依次检测<3>中剩余轮廓点的8像素邻域,是否只含有3 or 4 or 5连通像素,如果有,把此点从轮廓点删除,并在目标图像中删除(腐蚀掉)对应点。

<5>依次检测<4>中剩余轮廓点的8像素邻域,是否只含有3 or 4 or 5 or 6连通像素,如果有,把此点从轮廓点删除,并在目标图像中删除(腐蚀掉)对应点。

<6>依次检测<5>中剩余轮廓点的8像素邻域,是否只含有3 or 4 or 5 or 6 or 7连通像素,如果有,把此点从轮廓点删除,并在目标图像中删除(腐蚀掉)对应点。

这是一次迭代过程的最后一步,如果在这步骤中仍有像素被腐蚀,说明除了真实骨架还有”肉”,仍需继续腐蚀边界。这一步骤是算法迭代的终止条件

  • 第二块 从伪骨架中提取真实骨架

算法第一块得到的伪骨架有部分区域是两个像素宽度,而目标骨架是单层像素宽度。所以,通过下面这一步骤提取最终骨架:

依次检测目标图像中,伪骨架的8像素邻域,是否只含有2 or 3 or 4 or 5 or 6 or 7连通像素,如果有,把此点从伪骨架中删除(腐蚀),就得了最终的骨架。

该论文对像素p的8邻域进行了权重编码:对判断像素点p周围8邻域的最大连通区域,是否只含有n(2<n<7)连通像素,进行加速。如下图

比如判断点p的8邻域是否只含有2连通的区域,可以这样实现:

把相邻2连通像素两两相加,会得到一个这样的集合c2{3,6,12,24,48,96,192,129},

由于操作的是二值图像,在判断p的8邻域的最大连通域是否只含有2连通域时,只需要对p的8邻域进行加权相加得到一个值,记作p2,然后去c2里查询,如果c2里有p2,则点p周围的8邻域只含有2连通的区域。比如:

这样的加权方式,使得每个可能出现的n(2<n<7)连通邻域像素区域都对应一个不同的值。

原文中查询集合:

A1=3连通,{}

A2=3or4连通,

A3=3 or 4 or 5连通,

A4=3 or 4 or 5 or 6连通,

A5=3 or 4 or 5 or 6 or 7连通

A0=2 or3 or 4 or 5 or 6 or 7连通

需要注意的是,每次迭代中的每一小步顺序不能变,否则会在腐蚀拐点的时候出现漏网之鱼,随着迭代的次数增加,效果就会和真实的骨架偏差越来越大。

二 Zhang-Suen algorithm

这个算法是论文[2]提出的,该算法每一次的迭代步骤是对符合特定条件的目标像素,进行腐蚀,效果就是目标变得越来越细。不断的迭代,直到在上一次腐蚀后的目标在本轮操作中,没有新的像素点被腐蚀,算法结束。

下面说一下此算法的四个条件:

条件(a):中心像素P1周围的目标像素(二值中的1)的个数之和在2和6之间。

条件(b): 8邻域像素中,按顺时针方向,相邻两个像素出现0->1的次数。

比如,下面这个例子,A(P1)=2。

条件(c)(d)有两种模式,一种上面提到过,下面是另一种。

Zhang-Suen thinning steps:

While points are deleted do

For all pixels p(i,j) do

if (a)2 ≤ B(P1) ≤ 6
(b) A(P1) = 1
(c) Apply oneof the following:
1. P2 x P4 x P6 = 0 in odd iterations
2. P2 x P4 x P8 = 0 in even iterations
(d) Apply oneof the following:
1. P4 x P6 x P8 = 0 in odd iterations
2. P2 x P6 x P8 = 0 in even iteration

then

Deletepixel p(i,j)

endif

end for

end while

算法代码实现https://github.com/ExtremeMart/SkeletonExtraction

参考论文

[1]K3M: A UNIVERSAL ALGORITHM FOR IMAGE SKELETONIZATION AND A REVIEW OF THINNING TECHNIQUES

[2]A fast parallel algorithm for thinning digital patterns

两种图像骨架提取算法的研究原理及实现相关推荐

  1. Zhang-Suen 图像骨架提取算法的原理和OpenCV实现

    记录一下图像骨架提取算法,转载至 两种图像骨架提取算法的研究(1)原理部分 基于OpenCV的实现代码如下,代码部分参考 opencv骨架提取/图像细化 void thinImage(Mat & ...

  2. 一种新型鱼眼图像轮廓提取算法

    from: http://www.scimao.com/read/2307651     摘 要:提取鱼眼图像轮廓是利用鱼眼图像的前提.传统提取鱼眼图像轮廓的扫描线逼近法对噪点抑制能力不强,精度差.本 ...

  3. 去毛边 叶片图像_一种用于植物叶片图像骨架提取的去毛刺方法.PDF

    一种用于植物叶片图像骨架提取的去毛刺方法 第 27 卷 第 1 期 电子测量与仪器学报 Vol. 27 No. 1 · 52 · JOURNAL OF ELECTRONIC MEASUREMENT A ...

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

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

  5. python视频提取关键帧_一种视频关键帧提取算法的制作方法

    本发明属于信息安全技术领域,涉及视频内容信息的提取,具体来说,是一种视频关键帧提取算法. 背景技术: 随着Internet的应用和普及,多媒体信息检索系统对社会各领域产生越来越大的影响.传统的信息检索 ...

  6. Matlab舌体分割,中医舌体图像自动分割算法的研究

    中医舌体图像自动分割算法的研究 目的:由于目前在舌体分割中,存在诸多的分割方法如灰度阈值法.区域生长法.边缘检测法.分水岭算法等,各有各的优缺点,灰度阈值法对于类别较多的图像分割难度大,区域生长法自动 ...

  7. 计算机设计复合材料,两种复合材料几何建模算法-计算机辅助设计与图形学学报.PDF...

    两种复合材料几何建模算法-计算机辅助设计与图形学学报 第27 卷 第 1 期 计算机辅助设计与图形学学报 Vol. 27 No.1 2015 年 1 月 Journal of Computer-Aid ...

  8. LoRa终端两种入网方式OTAA与ABP工作原理的区别

    在之前的文章中介绍了"LoRa终端如何以OTAA方式入网TTN服务器",现在为大家介绍LoRa终端两种入网方式OTAA与ABP工作原理的区别,此文来自微信公众号"小七说L ...

  9. 单像素骨架提取算法c语言实现,【图像】骨架提取与分水岭算法

    1.骨架提取 骨架提取,也叫二值图像细化.这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示. morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize ...

最新文章

  1. ASP.NET2.0 永恒密码之戒【月儿原创】
  2. 请求合并的三种方式,大大提高接口性能!
  3. 云路由 vyatta 体验(四)web代理
  4. java web一: xml
  5. 最常用的Eclipse快捷键
  6. 启动物料帐后不可更改物料价格的处理方法
  7. 铁矿怎么来_铁矿期货今日创出新高908.5点 为何老有人错过行情
  8. 未来计算机打蜡机,电脑洗车机的未来发展方向:多样化or精简化?
  9. 30万手表推荐_今年六十岁生日,儿子说要送只30万的手表,请问有哪些推荐?...
  10. 前端学习(2951):上午回顾
  11. [js] 实现一个函数记忆的方法
  12. SQL Server中的数据库表分区
  13. 文件校验和(checksum或Hash)计算工具
  14. vue3.0实现jsoneditor组件
  15. python手机壁纸_【python日常学习】爬取各种图片(电脑、手机壁纸,美女、明星图片,头像等等)...
  16. 同步调用、异步调用、回调的简单理解
  17. selenium+python自动化(完整脚本一)
  18. 积水成渊——数据中心用水效率分析
  19. android 谷歌定位demo,android实现定位与目的地的导航示例代码
  20. java基于微信小程序校园二手闲置商品交易跳蚤市场 uniapp 小程序

热门文章

  1. python学习需要多久?三个月够吗?
  2. 华为FreeBuds 5耳机声音变小怎么办?
  3. AS3.0实现扎气球游戏
  4. 能够做到亚马逊月销售额50w以上的运营,他们有什么共同点 和技巧
  5. picker多选 vant_Vant picker 多级联动操作
  6. 旅游指南之九----风景看尽大西北
  7. vue报错Navigating to current location (/login) is not allowed
  8. 服务器系统和操作系统的区别
  9. mysql auto increment 插入_MySQL里AUTO_INCREMENT表里插入0值的问题
  10. 3dmax制作电视机