cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线
点击上方蓝字关注我们
微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
问题
前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:
怎么得到白色Blob中心线,他希望的效果如下:
显然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()101112def 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] = 116 skel, distance = morphology.medial_axis(binary, return_distance=True)17 dist_on_skel = distance * skel18 skel_img = dist_on_skel.astype(np.uint8)*25519 contours, hireachy = cv.findContours(skel_img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)20 cv.drawContours(image, contours, -1, (0, 0, 255), 1, 8)2122 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()1415 zeros = size - cv.countNonZero(binary)16 if zeros == size:17 finished = True1819 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()242526def 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()
运行结果如下:
因依老宿发心初
半学修心半读书
推荐阅读
OpenCV4系统化学习路线图-视频版本!
Tensorflow + OpenCV4 安全帽检测模型训练与推理
汇总 | OpenCV DNN模块中支持的分类网络
OpenCV中支持的人脸检测方法整理与汇总
详解ENet | CPU可以实时的道路分割网络
从Pytorch 的ONNX到OpenVINO中IR中间层
OpenCV 基于Inception模型图像分类
OpenCV4.4 + YOLOv4 真的可以运行了…..
cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线相关推荐
- 基于OpenCV实战:提取中心线
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|AI算法与图像处理 问题 前几天有个人问了我一个问题,问 ...
- cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果
众所周知,最近大热的蔡徐坤蔡老师是一位非常全能的老师,喜欢唱.跳.Rap.篮球,但其实他还会用OpenCV!今天就让我们跟着蔡老师一起用OpenCV实现素描效果吧! OpenCV素描效果https:/ ...
- python 图像二值化
自适应二值化,高斯加权二值化: image =cv2.imread(r'E:\data\barcode\test\1009_11\test\blur\509915979678918664.jpg', ...
- [Python图像处理] 二十八.OpenCV快速实现人脸检测及视频中的人脸
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- ocr python opencv_如何使用(opencv/python)来实现OCR处
今天我们来介绍一下如何使用(opencv/python)来实现OCR处理银行票据.文末有代码和相关文档下载! 在第一部分中,我们将讨论两个主题: 1.首先,我们将了解MICR E-13B字体,美国,英 ...
- python图片二值化处理百度图api_Python+百度AI实现图像处理-附源码
开始的话:百度AI新增加了图像处理的api,相信不少朋友用PS处理图片,而今天我们用Python+百度ai来解决. ------------------------------------------ ...
- ostu阈值分割python实现_opencv python 图像二值化/简单阈值化/大津阈值法
1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. ...
- Python实验二:分析1996~2015年人口数据特征间的关系、分析并绘制鸢尾花数据的散点图和箱线图
人口数据下载链接:populations.npz 鸢尾花数据下载链接:鸢尾花 (下载积分已改为0,请下载) 目录 一.题目表述 1.分析1996~2015年人口数据特征间的关系 2.分析并绘制鸢尾花数 ...
- python定位二维码_图像中二维码的检测和定位
二维码 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部 ...
最新文章
- activity生命周期及数据保存
- 原文件内容更新及备份,特殊标量$^I和@ARGV学习笔记
- glVertexPointer
- pwdencrypt,pwdcompare
- SAP UI5 local sandbox bootstrap的执行细节
- mysql执行计划中的temp_MYSQL语句调优:GROUP BY ORDER BY语句中出现USING TEMPATORY
- HashSet存储自定义对象保证元素唯一性图解原理及代码优化
- el-select下拉框组件el-option如何使用v-for动态渲染问题 - 方法篇
- 计算机普通用户没有软件怎么回事,请教各位高手:单机多用户账户计算机,当管理员用户安装了程序,其它普通用户账户不能使用怎么处理?比如在管理...
- 湘潭大学计算机考研调剂,2017年湘潭大学硕士研究生调剂信息公告
- Linux常用软件包(常用命令)
- excel计算机一级打不开,excel打不开的原因及解决方法
- 20021年还需要学C语言吗?C语言成为专家的路径、方法、书籍推荐
- tplink的虚拟服务器功能,tplink 虚拟服务器设置
- 全面认识思科系列交换机型号
- MIGO为玩家带来接近无限的可能
- 今天是2019年最后一天,全球金融危机,离我们已经过去十年了
- zabbix通过插件percona进行监控MySQL
- 微信公众号(二)每日推送详细教程(AI回复助手)
- r7 7735h和r5 5560U差距 锐龙r77735h和r55560U对比
热门文章
- 数据结构与算法专题——第十题 输入法跳不过的坎-伸展树
- 初识ABP vNext(6):vue+ABP实现国际化
- 记一次EF Core连接MySql、Oracle
- TechEmpower Web 框架性能第19轮测试结果正式发布,ASP.NET Core在主流框架中拔得头筹...
- Asp.Net Core 中IdentityServer4 授权中心之应用实战
- 一文读懂开源许可证异同
- 与时俱进 | 博客现已运行在 .NET Core 3.0 及 Azure 上
- 程会玩 | 在.NET Core里操作Git
- [NewLife.XCode]数据模型文件
- .NET微服务方案调查