记录一下图像骨架提取算法,转载至 两种图像骨架提取算法的研究(1)原理部分

基于OpenCV的实现代码如下,代码部分参考 opencv骨架提取/图像细化

void thinImage(Mat & srcImg) {vector<Point> deleteList;int neighbourhood[9];int nl = srcImg.rows;int nc = srcImg.cols;bool inOddIterations = true;while (true) {for (int j = 1; j < (nl - 1); j++) {uchar* data_last = srcImg.ptr<uchar>(j - 1);uchar* data = srcImg.ptr<uchar>(j);uchar* data_next = srcImg.ptr<uchar>(j + 1);for (int i = 1; i < (nc - 1); i++) {if (data[i] == 255) {int whitePointCount = 0;neighbourhood[0] = 1;if (data_last[i] == 255) neighbourhood[1] = 1;else  neighbourhood[1] = 0;if (data_last[i + 1] == 255) neighbourhood[2] = 1;else  neighbourhood[2] = 0;if (data[i + 1] == 255) neighbourhood[3] = 1;else  neighbourhood[3] = 0;if (data_next[i + 1] == 255) neighbourhood[4] = 1;else  neighbourhood[4] = 0;if (data_next[i] == 255) neighbourhood[5] = 1;else  neighbourhood[5] = 0;if (data_next[i - 1] == 255) neighbourhood[6] = 1;else  neighbourhood[6] = 0;if (data[i - 1] == 255) neighbourhood[7] = 1;else  neighbourhood[7] = 0;if (data_last[i - 1] == 255) neighbourhood[8] = 1;else  neighbourhood[8] = 0;for (int k = 1; k < 9; k++) {whitePointCount += neighbourhood[k];}if ((whitePointCount >= 2) && (whitePointCount <= 6)) {int ap = 0;if ((neighbourhood[1] == 0) && (neighbourhood[2] == 1)) ap++;if ((neighbourhood[2] == 0) && (neighbourhood[3] == 1)) ap++;if ((neighbourhood[3] == 0) && (neighbourhood[4] == 1)) ap++;if ((neighbourhood[4] == 0) && (neighbourhood[5] == 1)) ap++;if ((neighbourhood[5] == 0) && (neighbourhood[6] == 1)) ap++;if ((neighbourhood[6] == 0) && (neighbourhood[7] == 1)) ap++;if ((neighbourhood[7] == 0) && (neighbourhood[8] == 1)) ap++;if ((neighbourhood[8] == 0) && (neighbourhood[1] == 1)) ap++;if (ap == 1) {if (inOddIterations && (neighbourhood[3] * neighbourhood[5] * neighbourhood[7] == 0)&& (neighbourhood[1] * neighbourhood[3] * neighbourhood[5] == 0)) {deleteList.push_back(Point(i, j));}else if (!inOddIterations && (neighbourhood[1] * neighbourhood[5] * neighbourhood[7] == 0)&& (neighbourhood[1] * neighbourhood[3] * neighbourhood[7] == 0)) {deleteList.push_back(Point(i, j));}}}}}}if (deleteList.size() == 0)break;for (size_t i = 0; i < deleteList.size(); i++) {Point tem;tem = deleteList[i];uchar* data = srcImg.ptr<uchar>(tem.y);data[tem.x] = 0;}deleteList.clear();inOddIterations = !inOddIterations;}
}

原图和细化结果如下:

         

Zhang-Suen 图像骨架提取算法的原理和OpenCV实现相关推荐

  1. 两种图像骨架提取算法的研究原理及实现

    图像骨架提取,实际上就是提取目标在图像上的中心像素轮廓.说白了就是以目标中心为准,对目标进行细化,一般细化后的目标都是单层像素宽度.比如输入图像是这样: 输出骨架图像(红色) 关于骨架提取,现存的算法 ...

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

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

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

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

  4. 图像直方图正规化(Normalization)数学原理和纯C语言实现

    图像处理入门系列文章 C语言生成RGB24格式图像纯C语言实现 图像缩放之最近邻内插法数学原理和纯C语言实现 图像直方图均衡化(Equalization)数学原理和纯C语言实现 图像直方图规定化(Sp ...

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

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

  6. 图像轮廓提取算法(Opencv基于C++实现)

    Opencv图像轮廓提取 0. 实现结果如下: 1. 打开图像代码 2. 轮廓提取函数 3. 代码实现 本文主要实现了图像的轮廓提取,首先先给出直观的轮廓实现结果: 0. 实现结果如下: 1. 打开图 ...

  7. 近期论文内容:ISAR图像目标提取算法-【2】重心法

    上一节中最大值法存在目标信息丢失的问题,这里将采用一种更好的算法去定位选框的中心点,即采用图像灰度重心的方法. 灰度重心的计算可以从纵向横向两个方向分别进行. 以下是代码: clc; clear al ...

  8. 近期论文内容:ISAR图像目标提取算法-【1】最大值法

    所有代码及运算思路均为编者独立编写,转载请注明出处.此论文即将发表,引用请参照此算法最后一章的最后寻找地址.算法虽然简单但还希望尊重别人劳动成果,谢谢大家. ISAR成像源于目标回波,那么在无噪声或低 ...

  9. zhang-Suen图像骨架提取(原理和代码)

    转自东方fan的博客,感谢! 该算法有四个条件,若满足,则该点置为0. 或: 其中(a)(b)的意思为: 中心像素P1周围的目标像素(二值中的1)的个数之和在2和6之间. 8邻域像素中,按顺时针方向, ...

最新文章

  1. python 语言教程(4)列表常用方法
  2. [转]VSTO Office二次开发应用程序键盘鼠标钩子
  3. java 观察者模式_Java技术干货分享:深入理解观察者模式原理与技术
  4. php curl_error源码,PHP curl_error函数
  5. springboot日志的实现方式(两种log4j2.properties和log4j2.yml)
  6. matlab 的字符类型转换,数据类型转换 - MATLAB Simulink - MathWorks 中国
  7. 中下游大学毕业如何在大城市和各种985大学生厮杀?
  8. linux后台运行命令和杀除命令
  9. nfc和红外线的区别_红外,蓝牙,WiFi,NFC区别及优缺点
  10. ES(Elasticsearch)基本查询总结(含docker安装,python操作)
  11. 人工智能知识体系的学习路线(南京大学人工智能学院本科生培养体系)
  12. java aes加密_springboot.X手册:防抓包?快速实现API接口数据加密
  13. 如何利用ansible callback插件对执行结果进行解析
  14. DISCUZ!论坛管理员无法登录后台的各种解决方法总结
  15. 用c语言制作简易的个人通讯录管理系统
  16. 从春运迁徙图看疫情变化
  17. USB Type-C和USB PD
  18. 八千字,带你看示波器的发展史。
  19. 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 /返回这三个数的和。
  20. ASP与ASP .net

热门文章

  1. File类的createNewFile、mkdir和mkdirs
  2. ziperello破解zip加密
  3. 苹果开发者 邓白氏号码 免费申请
  4. 机器人“攻占”北京亦庄 华为Wi-Fi网络保驾护航
  5. 程序化广告定量评估收益指标——eCPM
  6. Multiqc(转录组分析之质量评估)
  7. Python办公自动化 5.2 Python操作ppt:python-pptx 使用教程 操作ppt PowerPoint 添加文字 形状图表
  8. Linux系统安装JDK8
  9. 数据库一,二,三级缓存详解
  10. js实现简易数码时钟