cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线

cd7e35ed667a0e9ac96d498632749feb.gif

点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

问题

前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:

293ec6aacb4d3fa1ba9b2ecc71e86044.png

怎么得到白色Blob中心线,他希望的效果如下:

061ef7ad6eec7847eccc41e3ff0b7ec2.png

显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本质上这个问题是如何提取二值对象的骨架,提取骨架的方法在OpenCV的扩展模块中,另外skimage包也支持图像的骨架提取。这里就分别基于OpenCV扩展模块与skimage包来完成骨架提取,得到上述图示的中心线。

01

安装skimage与opencv扩展包

Python环境下安装skimage图像处理包与opencv计算机视觉包,只需要分别执行下面两行命令:

pip install opencv-contrib-pythonpip install skimage

导入使用

from skimage import morphology import cv2 as cv

02

使用skimage实现骨架提取

有两个相关的函数实现二值图像的骨架提取,一个是基于距离变换实现的medial_axis方法;另外一个是基于thin的skeletonize骨架提取方法。两个方法的代码实现分别如下:

 1def skeleton_demo(image):
2    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
3    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
4    binary[binary == 255] = 1
5    skeleton0 = morphology.skeletonize(binary)
6    skeleton = skeleton0.astype(np.uint8) * 255
7    cv.imshow("skeleton", skeleton)
8    cv.waitKey(0)
9    cv.destroyAllWindows()
10
11
12def medial_axis_demo(image):
13    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
14    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
15    binary[binary == 255] = 1
16    skel, distance = morphology.medial_axis(binary, return_distance=True)
17    dist_on_skel = distance * skel
18    skel_img = dist_on_skel.astype(np.uint8)*255
19    contours, hireachy = cv.findContours(skel_img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
20    cv.drawContours(image, contours, -1, (0, 0, 255), 1, 8)
21
22    cv.imshow("result", image)
23    cv.waitKey(0)
24    cv.destroyAllWindows()

03

使用OpenCV实现骨架提取

OpenCV的图像细化的骨架提取方法在扩展模块中,因此需要直接安装opencv-python的扩展包。此外还可以通过形态学的膨胀与腐蚀来实现二值图像的骨架提取,下面的代码实现就是分别演示了基于OpenCV的两种骨架提取方法。代码分别如下:

 1def morph_find(image):
2    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
3    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
4    kernel = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))
5    finished = False
6    size = np.size(binary)
7    skeleton = np.zeros(binary.shape, np.uint8)
8    while (not finished):
9        eroded = cv.erode(binary, kernel)
10        temp = cv.dilate(eroded, kernel)
11        temp = cv.subtract(binary, temp)
12        skeleton = cv.bitwise_or(skeleton, temp)
13        binary = eroded.copy()
14
15        zeros = size - cv.countNonZero(binary)
16        if zeros == size:
17            finished = True
18
19    contours, hireachy = cv.findContours(skeleton, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
20    cv.drawContours(image, contours, -1, (0, 0, 255), 1, 8)
21    cv.imshow("skeleton", image)
22    cv.waitKey(0)
23    cv.destroyAllWindows()
24
25
26def thin_demo(image):
27    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
28    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
29    thinned = cv.ximgproc.thinning(binary)
30    contours, hireachy = cv.findContours(thinned, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
31    cv.drawContours(image, contours, -1, (0, 0, 255), 1, 8)
32    cv.imshow("thin", image)
33    cv.waitKey(0)
34    cv.destroyAllWindows()

运行结果如下:

402b83ff7811cf2cfac1c1fb454170cb.png

因依老宿发心初

半学修心半读书

 推荐阅读 

OpenCV4系统化学习路线图-视频版本!

Tensorflow + OpenCV4 安全帽检测模型训练与推理

汇总 | OpenCV DNN模块中支持的分类网络

OpenCV中支持的人脸检测方法整理与汇总

详解ENet | CPU可以实时的道路分割网络

从Pytorch 的ONNX到OpenVINO中IR中间层

OpenCV 基于Inception模型图像分类

OpenCV4.4 + YOLOv4 真的可以运行了…..

05a2e7bfc2af52398c8d83e63882b3df.png

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

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

相关文章

又砸又烧,还要泼脏水,这谣言到底什么时候才没人信?发生这样的事真没想到.........

全世界只有3.14 % 的人关注了爆炸吧知识曾经看到一条新闻,说的是漂亮国人民怀疑口罩上的那个鼻梁条是5G天线,它不仅能控制人,还能致癌。“所以这就是他们计划杀死我们的方式,他们把5G电线放在了这里,就在这。”一名女子…

如何使用ASP.NET Core Web API实现短链接服务

前言在前面的文章中,我们介绍了hashids.net,可以将数值型Id加密成无意义的字符串。今天,我们来利用这一特点,实现短链接服务。原理短链接,顾名思义就是在形式上比较短的链接网址。借助短链接,可以用简短的网…

python 写入excel_一行一行整理EXCEL表太麻烦,试试python脚本,1秒写入数据

最近工作中,要整理数据,本来是以sql脚本录入,但是id、barcode等数据不好整理,因为这几个字段要唯一。所以想到用EXCEL表整理数据,再导入数据库中。整理的过程中,发现EXCEL一行一行的修改也挺麻烦&#xff0…

ORACLE 数据库安装后,PL/SQL的登录问题完美解决

windows7 64位系统 安装完oracle 后的用法如下分享链接:http://www.2cto.com/database/201307/226853.html#comment_iframe安装完PL/SQL后 。当你登陆时。你会遇到各种那个疼的问题。 例如:监听程序在CONNECT_DATA 中未获得SERVICE_NA 无监听程序 无法解…

3、AngularJS2 架构

2019独角兽企业重金招聘Python工程师标准>>> Angular 2 应用程序应用主要由以下 8 个部分组成: 1、模块 (Modules)2、组件 (Components)3、模板 (Templates)4、元数据 (Metadata)5、数据绑定 (Data Binding)6、指令 (Directives)7、服务 (Services)8、依…

Kubernetes:实现应用不停机更新

本篇主要讨论如何实现滚动更新和回滚,任意更换版本并且回滚以前的版本(版本更新),而下一章会讨论到 Pod 缩放,根据机器资源自动拓展和收缩应用(自动扩容实例)。本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源&#x…

inner join 和 exists 效率_一个in、exists、join的简单测试

创建两张表先单独插入两条数据然后批量插入部门号为10,20,30,40的数据各10499099条然后dept表也插些干扰数据测试语句开始验证in和exists和join 先比较个占比多的部门,再比较占比少的 1、 in 占比多 select count(*) from scott.EMP_TEST e where e.deptno in (sele…

httpModules 与 httpHandlers

httpModules 与 httpHandlers ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI.dll,ASPNET_…

多比Web 3D展示(3D机房/3D监控)中间件多比Web 3D展示(3D机房/3D监控)中间件免费下载购买地址...

多比3D是实现3D场景搭建的软件开发包,可以创建广泛的3D应用,适用于高端制造、能源、国防军工、教育科研、城市规划及建筑环艺、生物医学等领域的虚拟仿真,应用于虚拟展示、虚拟设计、方案评审、虚拟装配、虚拟实训等工作环节。 特点与优势 支…

python 工资管理软件_智慧职教云课堂2020Python程序设计(深圳信息职业技术学院)题目答案...

智慧职教云课堂2020Python程序设计(深圳信息职业技术学院)题目答案 更新时间:2020-11-23 20:41点击: 智慧职教云课堂2020Python程序设计(深圳信息职业技术学院)题目答案 更多相关问题 【判断题】在声明类的成员属性时必须要用关键…

中国已消失的九所世界级大学

全世界只有3.14 % 的人关注了爆炸吧知识众所周知,我们国家的大学数量在世界范围内数一数二,但是有很多赫赫有名的大学却在历史中被人们遗忘,下面我们一起回顾一下那些不该被忘记的大学。>>>>▌燕京大学燕京大学(Yench…

IOS Table中Cell的重用reuse机制分析

2019独角兽企业重金招聘Python工程师标准>>> 解决代码: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *CellIdentifier [NSString stringWithFormat:"Cell%d%d", …

VS2017/2019 F12无法导航到定义

今天对项目里某个对象点F12转到定义,无法跳转,研究了一会儿,找到如下解决方案:首先确认该函数是否能够正确被跳转到..就是是否真实定义了,然后确保要跳转的定义源码在项目文件下(而不是直接引用的DLL)接下来关闭VS2017…

unable to launch什么意思_都表示太...以至于,so … that…?与too… to …有着明显区别...

【2019年12月8日 百天英语-Day135】【华东师范大学-林森撰写】昨日内容复习提要:昨天学习了主要学习了 ①be able to …与can的区别。②如何通过不认识的单词,猜到作者表达的含义。昨天文章如下:表示有能力做某事,be able to …与…

求指教、。。。关于调用so文件

问题描述今天同事给我发来一个文件&#xff0c;说让我通过android调用里面的函数文件是&#xff1a;里面的内容是&#xff1a;call_so.cpp文件的内容&#xff1a;#pragma pack(1) //非常重要的申明&#xff0c;内存对齐的方法&#xff0c;影响sizeof()的结果#include <stdio…

人类历史上最伟大的物理学家

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

DevToys - 开发人员的瑞士军刀

DevToys 是一个适用于开发人员的工具箱, 基于 UWP 开发, DevToys 旨在拥抱 Windows 生态系统, 免费并且开源, 拥有现代化的界面, 支持中文, 有深色/浅色主题可选, 并且它是离线化的, 所以你完全可以在无网络环境中使用。你可以使用它处理与开发相关的一些任务, 它提供 了14…