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,一经查实,立即删除!

相关文章

求字符串里里面字符出现的次数和出现哪些不同的字符的字符串

题目: 字符串里里面字符出现的次数和出现哪些不同的字符 such as 字符串“aaaabbbccd” 打印出出现a4次,b3次,c2次,d1次,出现的不同字符的字符串为“abcd”,或者按照规则打印字符串“4a3b2c1d” 代码: #include <stdio.h> #include <stdlib.h> #include &l…

[20140928]创建连接到MySQL的连接服务器

[20140928]创建连接到MySQL的连接服务器 首先要安装 mysql odbc然后 odbc下创建DSN&#xff0c;并且要在系统DSN下。最后执行exec sp_addlinkedserverserver XY,--这是链接服务器的名称srvproduct mysql,--这个你自己随便吧provider MSDASQL,--这是固定的&#xff0c;不能瞎填&…

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

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

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

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

[LeetCode]--20. Valid Parentheses

Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid. The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not. public boo…

人生如梦

人生就像一场虚无的梦&#xff0c;可是我已经醒了&#xff0c;我只想过得真实一点

C语言atoi()函数:将字符串转换成int(整数)和sprintf和memset

atoi()函数 #include <stdio.h> #include <stdlib.h>int main () {int i;char buffer[256];printf ("Enter a number: ");fgets (buffer, 256, stdin);i atoi (buffer);printf ("The value entered is %d.", i);system("pause");re…

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

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

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

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

3、AngularJS2 架构

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

Kubernetes:实现应用不停机更新

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

iOS 7 如何关闭已打开的应用(App)

刚升级了 iOS 7&#xff0c;感觉不太会用了。 在多任务状态下&#xff0c;看着一个个已被打开的应用&#xff0c;不知道如何关闭了。 问了下朋友才知道&#xff0c;在多任务状态下&#xff0c;将对应的应用 向上划 就行。 听说&#xff0c;和 Android 一样的 &#xff1f;&…

除掉字符串里面相同的字符

题目: 除掉字符串里面相同的字符 such as 字符串“aaaabbbccdd” 出去相同的字符就会变成“abcd” 代码: #include <stdio.h> #include <stdlib.h> #include <string.h>void grepString1(char a[]) {int length = strlen(a);int i = 0, j = 0;for (i=0; i…

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

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

httpModules 与 httpHandlers

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

uva10160(dfs+状态压缩)

题意&#xff1a;给出n个点&#xff0c;以及m条边&#xff0c;这些边代表着这些点相连&#xff0c;修一个电力站&#xff0c;若在某一点修一个站&#xff0c;那么与这个点相连的点都可以通电&#xff0c;问所有的点都通电的话至少要修多少个电力站........思路&#xff1a;最多…

CAD数据与ArcGIS数据的互转换(转载)

CAD数据往往是分层管理的&#xff0c;将CAD数据转成arcgis数据&#xff0c;最担心的莫过于丢失了属性数据&#xff0c;arcgis9.2提供了一种方法&#xff0c;可以将CAD数据完整的转换为personal geodatabase&#xff0c;属性信息不会丢失&#xff0c;方法如下&#xff1a;ArcToo…

愚人节的礼物-栈

题目: 四月一日快到了,Vayko想了个愚人的好办法――送礼物。嘿嘿,不要想的太好,这礼物可没那么简单,Vayko为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物。盒子里面可以再放零个或者多个盒子。假设放礼物的盒子里不再放其他盒子。 用()表示一个盒子,B表示礼物,…