点击上方蓝字关注我们

微信公众号: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如何提取中心线相关推荐

  1. 基于OpenCV实战:提取中心线

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|AI算法与图像处理 问题 前几天有个人问了我一个问题,问 ...

  2. cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果

    众所周知,最近大热的蔡徐坤蔡老师是一位非常全能的老师,喜欢唱.跳.Rap.篮球,但其实他还会用OpenCV!今天就让我们跟着蔡老师一起用OpenCV实现素描效果吧! OpenCV素描效果https:/ ...

  3. python 图像二值化

    自适应二值化,高斯加权二值化: image =cv2.imread(r'E:\data\barcode\test\1009_11\test\blur\509915979678918664.jpg', ...

  4. [Python图像处理] 二十八.OpenCV快速实现人脸检测及视频中的人脸

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  5. ocr python opencv_如何使用(opencv/python)来实现OCR处

    今天我们来介绍一下如何使用(opencv/python)来实现OCR处理银行票据.文末有代码和相关文档下载! 在第一部分中,我们将讨论两个主题: 1.首先,我们将了解MICR E-13B字体,美国,英 ...

  6. python图片二值化处理百度图api_Python+百度AI实现图像处理-附源码

    开始的话:百度AI新增加了图像处理的api,相信不少朋友用PS处理图片,而今天我们用Python+百度ai来解决. ------------------------------------------ ...

  7. ostu阈值分割python实现_opencv python 图像二值化/简单阈值化/大津阈值法

    1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. ...

  8. Python实验二:分析1996~2015年人口数据特征间的关系、分析并绘制鸢尾花数据的散点图和箱线图

    人口数据下载链接:populations.npz 鸢尾花数据下载链接:鸢尾花 (下载积分已改为0,请下载) 目录 一.题目表述 1.分析1996~2015年人口数据特征间的关系 2.分析并绘制鸢尾花数 ...

  9. python定位二维码_图像中二维码的检测和定位

    二维码 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部 ...

最新文章

  1. activity生命周期及数据保存
  2. 原文件内容更新及备份,特殊标量$^I和@ARGV学习笔记
  3. glVertexPointer
  4. pwdencrypt,pwdcompare
  5. SAP UI5 local sandbox bootstrap的执行细节
  6. mysql执行计划中的temp_MYSQL语句调优:GROUP BY ORDER BY语句中出现USING TEMPATORY
  7. HashSet存储自定义对象保证元素唯一性图解原理及代码优化
  8. el-select下拉框组件el-option如何使用v-for动态渲染问题 - 方法篇
  9. 计算机普通用户没有软件怎么回事,请教各位高手:单机多用户账户计算机,当管理员用户安装了程序,其它普通用户账户不能使用怎么处理?比如在管理...
  10. 湘潭大学计算机考研调剂,2017年湘潭大学硕士研究生调剂信息公告
  11. Linux常用软件包(常用命令)
  12. excel计算机一级打不开,excel打不开的原因及解决方法
  13. 20021年还需要学C语言吗?C语言成为专家的路径、方法、书籍推荐
  14. tplink的虚拟服务器功能,tplink 虚拟服务器设置
  15. 全面认识思科系列交换机型号
  16. MIGO为玩家带来接近无限的可能
  17. 今天是2019年最后一天,全球金融危机,离我们已经过去十年了
  18. zabbix通过插件percona进行监控MySQL
  19. 微信公众号(二)每日推送详细教程(AI回复助手)
  20. r7 7735h和r5 5560U差距 锐龙r77735h和r55560U对比

热门文章

  1. 数据结构与算法专题——第十题 输入法跳不过的坎-伸展树
  2. 初识ABP vNext(6):vue+ABP实现国际化
  3. 记一次EF Core连接MySql、Oracle
  4. TechEmpower Web 框架性能第19轮测试结果正式发布,ASP.NET Core在主流框架中拔得头筹...
  5. Asp.Net Core 中IdentityServer4 授权中心之应用实战
  6. 一文读懂开源许可证异同
  7. 与时俱进 | 博客现已运行在 .NET Core 3.0 及 Azure 上
  8. 程会玩 | 在.NET Core里操作Git
  9. [NewLife.XCode]数据模型文件
  10. .NET微服务方案调查