【OpenCV 例程200篇】224. 特征提取之提取骨架

OpenCV 例程200篇 总目录


【youcans 的 OpenCV 例程200篇】224. 特征提取之提取骨架


目标特征的基本概念

通过图像分割获得多个区域,得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标,目标所处的区域就是目标区域。
特征通常是针对于图像中的某个目标而言的。图像分割之后,还要对目标区域进行适当的表示和描述,以便下一步处理。
“表示”是直接具体地表示目标,以节省存储空间、方便特征计算。目标的表示方法,有链码、多边形逼近(MPP)、斜率标记图、边界分段、区域骨架。
“描述”是对目标的抽象表达,在区别不同目标的基础上,尽可能对目标的尺度、平移、旋转变化不敏感。


提取骨架

骨架与目标区域的形状有关。

骨架可以由区域的边界计算。提取骨架的常用方法是用重建开运算来实现,在保持端点和线的连通性的同时持续细化目标区域。

S(A)=⋃k=0KSk(A)Sk(A)=(A⊖kB)−(A⊖kB)∘BS(A) = \bigcup ^K_{k=0} S_k(A)\\ S_k(A) = (A \ominus kB) - (A \ominus kB) \circ B S(A)=k=0KSk(A)Sk(A)=(AkB)(AkB)B

基于重建开运算的提取骨架算法步骤如下:

(1)对图像进行腐蚀,腐蚀后的物体变得更窄细;
(2)对腐蚀后图像做开运算,开运算处理时被删除的像素就是骨骼的一部分,将其添加骨骼图像;
(3)重复以上过程,直到图像被完全腐蚀。

skimage 中提供了函数 skimage.morphology.skeletonize 可以获取图像的骨骼。


例程 12.13:特征提取之提取骨架

例程的图像来自 R.C.Gonzalez 《数字图像处理(第四版)》P598-599 例11.5。原始图像是分割后的血管图像,过连续细化获得了图像的骨架。

    #  12.13 特征提取之提取骨架img = cv2.imread("../images/bloodvessels.tif", flags=1)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)dst = binary.copy()skeleton = np.zeros(gray.shape, np.uint8)  # 创建空骨架图kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))while (True):dst = cv2.erode(dst, kernel, None, None, 1)  # 腐蚀opening = cv2.morphologyEx(dst, cv2.MORPH_OPEN, kernel)  # 开运算subSkeleton = cv2.subtract(dst, opening)  # 获得骨架子集skeleton = cv2.bitwise_or(skeleton, subSkeleton)  # 将删除的像素添加到骨架图if cv2.countNonZero(dst) == 0:breakresult = cv2.bitwise_xor(gray, skeleton)plt.figure(figsize=(9, 6))plt.subplot(131), plt.axis('off'), plt.title("origin")plt.imshow(gray, cmap='gray')plt.subplot(132), plt.axis('off'), plt.title("skeleton")plt.imshow(skeleton, cmap='gray')plt.subplot(133), plt.axis('off'), plt.title("result")plt.imshow(result, cmap='gray')plt.tight_layout()plt.show()

在这里插入图片描述


【本节完】

说明:例程的图像来自 R.C.Gonzalez 《数字图像处理(第四版)》。

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125600888)
Copyright 2022 youcans, XUPT
Crated:2022-6-30

222. 特征提取之弗里曼链码
223. 特征提取之多边形拟合
224. 特征提取之提取骨架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

inuri .php id=,php常用函数(遇见就补充)

preg_match()preg_match(string pattern, string subject [, array matches [, int flags]])在subject字符串中搜索与 pattern给出的正则表达式相匹配的内容。如果提供了 matches,则会被搜索的结果所填充。$matches[0]将包含于整个模式匹配的文本,$match…

【OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率 特征通常是针对于图像中的某个目标而言的。 我们把感兴趣的人或物称为目标,目标所处的区域就是目标区域。图像分割之后,还要对目标区域进…

Java常见的几种设计模式

单例模式 指一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。 getInstance()的返回值是一个对象的引用,并不是一个新的实例&a…

【OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子 特征通常是针对于图像中的某个目标而言的。 针对目标所在区域的特征描述符(Region descriptors),称为区域特征描述子。 4.2 纹…

php日志数据统计,awk 进行php日志累计报错统计

问题线上服务器一百多台通过tail -f /var/log/error_web* 方式来查看,速度滚动刷新太快,而且不方便定位问题按照前辈的『观察法』,作为新人实在是有难度,所以使用awk命令对输出格式格式化了一下。思路将每一行tail得到的日志通过a…

【OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子 特征通常是针对于图像中的某个目标而言的。针对目标所在区域的特征描述符(Region descriptors),称为区域特征描述子。 局部…

Java设计模式汇总详解

设计模式 设计模式是很多程序员总结出来的最佳实践。曾经在刚开始写项目的时候学习过设计模式,在开发过程中,也主动或者被动的使用过。现在写代码虽说不会特意明确在用哪种设计模式,但潜移默化的写出来公认的最佳实践代码,毕竟看…

php中reset函数,PHP reset()函数

实例 1所有相关方法的演示:$people array("Peter", "Joe", "Glenn", "Cleveland");echo current($people) . ""; // The current element is Peterecho next($people) . ""; // The next element of …

【OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage) 局部二值模式(LBP,Local binary patterns)是一种用来描述图像局部纹理特征的算子,它具…

Java多线程的使用

无论在我们的工作中还是在我们的生活中,我们都会用到多线程的知识,今天就给大家讲一下如何使用多线程。 序幕 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 我们首先要知道进程和线程分别是什么? 进程 - 进…

oracle 存储过程 db,oracle数据库的存储过程是什么?

oracle数据库的存储过程:一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。存储过程(Stored Procedur…

【OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图 局部二值模式(LBP,Local binary patterns)是一种用来描述图像局部纹理特征的算子,它具有旋转不变性和灰度不变性的优点…

论单线程和多线程

在我们日常的项目开发过程中进场会接触到单线程或多线程的知识,那么到底多线程好还是单线程好呢?单线程和多线程的区别又是什么呢?下面我们来看看它们的区别以及优缺点分析及实例展示。 一、线程的含义 线程:每一个任务称为一个…

oracle 表空间初始分配,在 Oracle 中创建用户时,若未提及 DEFAULT TABLESPACE 关键字,则 Oracle 就将 ( )表空间分配给用户作为默认表空间。...

【多选题】现代职业高尔夫运动,主要有如下构成要素,即:高水平的职业球员、( )、观众的积极参与、( )和( )。【判断题】凝点较高的含蜡原油,凝点附近粘温曲线很陡,经济进站油温常略高于凝点。( )【单选题】以下哪项不是固有免疫的物理屏障作用【多选题】下列各项中不属于“木”的…

【OpenCV 例程200篇】232. 特征描述之频谱方法

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】232. 纹理特征之频谱方法 4.3 纹理特征之频谱方法 傅里叶谱可以描述图像中的周期性或半周期性二维模式的方向性,因此可以基于傅里叶变换对纹理进行频谱分析。 纹理与图像频谱中的高频分…

并发编程的目的和挑战

并发编程的目的与挑战 并发编程的目的是为了让程序运行得更快。启动更多的线程并不一定就能让程序最大限度地并发执行。 希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战。比如: 上下文切换的问题死锁的问题硬件和软件的资源限制问题上下文…

java制作oracle程序,Java程序操作Oracle两种方式之简单实现

Java程序操作Oracle两种方式之简单实现1.通过JDBC-ODBC桥连接Oracle数据库(1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名为wangtao,选择一个Service,输入用户名密码,测试连接,若通过说明成功;(注意&…

【OpenCV 例程200篇】233. 区域特征之矩不变量

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】233. 区域特征之矩不变量 4.4 区域特征之矩不变量 矩是概率与统计中的一个概念,是随机变量的一种数字特征。矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、图像编…

oracle ip策略,ip rule -- 路由策略数据库管理命令

ip rule -- 路由策略数据库管理命令.8.ip rule -- 路由策略数据库管理命令8.1.缩写rule、ru8.2.对象路由策略数据库的规则用于控制选择路由的算法。Internet上采用的路由算法一般是基于数据包目的地址的。理论上,也可以由TOS域决定,不过这没有实际应用。…

【OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM) 4.2.4 灰度共生矩阵(GLCM) 灰度共生矩阵(Gray level co-occurrence matrix,GLCM&#xff…