对二值图进行细化(骨架提取),也就是把每根线条细化到一个像素的宽度。有两个比较成熟的算法实现此功能,分别是Zhang-Suen算法和Guo-Hall算法。

我们下面使用OpenCVSharp,使用C#实现上述两个算法:

private static Mat ThinningIteration(Mat img, int iter, int thinningType)
{Mat marker = Mat.Zeros(img.Size(), MatType.CV_8UC1);int rows = img.Rows;int cols = img.Cols;marker.Col(0).SetTo(1);marker.Col(cols - 1).SetTo(1);marker.Row(0).SetTo(1);marker.Row(rows - 1).SetTo(1);//THINNING_ZHANGSUENif (thinningType == 1){marker.ForEachAsByte((byte* value, int* position) =>{int i = position[0];int j = position[1];if (i == 0 || j == 0 || i == rows - 1 || j == cols - 1)return;var ptr = (byte*)img.Ptr(i, j).ToPointer();// p9 p2 p3// p8 p1 p4// p7 p6 p5byte p2 = ptr[-cols];byte p3 = ptr[-cols + 1];byte p4 = ptr[1];byte p5 = ptr[cols + 1];byte p6 = ptr[cols];byte p7 = ptr[cols - 1];byte p8 = ptr[-1];byte p9 = ptr[-cols - 1];int neighbors = p9 | (p2 << 1) | (p3 << 2) | (p4 << 3) | (p5 << 4) | (p6 << 5) | (p7 << 6) | (p8 << 7);if (iter == 0)*value = lut_zhang_iter0[neighbors];else*value = lut_zhang_iter1[neighbors];});}//THINNING_GUOHALLelse if (thinningType == 2){marker.ForEachAsByte((byte* value, int* position) =>{int i = position[0];int j = position[1];if (i == 0 || j == 0 || i == rows - 1 || j == cols - 1)return;var ptr = (byte*)img.Ptr(i, j).ToPointer();// p9 p2 p3// p8 p1 p4// p7 p6 p5byte p2 = ptr[-cols];byte p3 = ptr[-cols + 1];byte p4 = ptr[1];byte p5 = ptr[cols + 1];byte p6 = ptr[cols];byte p7 = ptr[cols - 1];byte p8 = ptr[-1];byte p9 = ptr[-cols - 1];int neighbors = p9 | (p2 << 1) | (p3 << 2) | (p4 << 3) | (p5 << 4) | (p6 << 5) | (p7 << 6) | (p8 << 7);if (iter == 0)*value = lut_guo_iter0[neighbors];else*value = lut_guo_iter1[neighbors];});}img &= marker;return img;
}public static void Thinning(InputArray input, OutputArray output, int thinningType)
{Mat processed = input.GetMat().Clone();processed /= 255;Mat prev = processed.Clone();Mat diff = new Mat();do{processed = ThinningIteration(processed, 0, thinningType);processed = ThinningIteration(processed, 1, thinningType);Cv2.Absdiff(processed, prev, diff);if (diff.CountNonZero() == 0) break;processed.CopyTo(prev);}while (true);processed *= 255;processed.CopyTo(output);
}

我们的测试框图如下图所示:

原二值图如下图所示:

细化(提取骨骼)之后的结果图如下:

Zhang-Suen算法

Guo-Hall算法

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

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

相关文章

历史的迷雾与传承的使命:应对历史篡改,守护中华文明

在历史的浩瀚长河中&#xff0c;中国以悠久的文明与灿烂的文化屹立于世界东方。然而&#xff0c;满清时期与西方势力出于各自目的对中国历史进行篡改&#xff0c;在真实历史的画卷上蒙上了层层迷雾。深入探究其背后的动机&#xff0c;思考当代人守护历史文化的使命&#xff0c;…

【Qt】QTableWidget表格右键菜单

效果 1. 给QTableWidget组件添加customContextMenuRequested信号 2. 槽函数 void dataDetailForm::on_tableWidget_customContextMenuRequested(const QPoint &pos) {QMenu menu;QAction *setEnd menu.addAction(tr("设置"));connect(setEnd, SIGNAL(triggered…

MySQL 数据处理函数全面详解

MySQL 数据处理函数全面详解 MySQL 中的数据处理函数,包含字符串、数值、日期、条件判断等核心函数: 一、字符串处理函数 1. 基础操作函数 函数描述示例结果CONCAT()字符串连接CONCAT(My,SQL)‘MySQL’CONCAT_WS()带分隔符连接CONCAT_WS(-,2023,08,15)‘2023-08-15’LENGTH…

领域驱动设计(DDD)【1】之初步理解

文章目录 一 DDD概述二 从“沉寂”到“爆火”&#xff1a;DDD的兴起背景与原因2.1 DDD早期沉寂的原因2.2 DDD近年爆火的原因2.3 总结 三 DDD深入理解3.1 方法论本质3.2 系统化价值3.3 思想内核3.4 实践转化3.5 总结 四 传统面向对象方法学和DDD4.1 传统面向对象方法学的问题4.2…

人工智能学习57-TF训练

人工智能学习概述—快手视频 人工智能学习57-TF训练—快手视频 人工智能学习58-TF训练—快手视频 人工智能学习59-TF预测—快手视频 训练示例代码 #导入keras.utils 工具包 import keras.utils #导入mnist数据集 from keras.datasets import mnist #引入tensorflow 类库 …

MySQL(83)如何设置密码复杂度策略?

在 MySQL 中&#xff0c;可以通过配置密码策略来设置密码的复杂度要求。MySQL 提供了一些参数和插件来帮助管理员强制实施密码复杂度策略&#xff0c;确保数据库用户使用强密码。下面将详细介绍如何设置密码复杂度策略&#xff0c;并结合代码示例进行说明。 1. 使用 validate_…

如何使用postman做接口自动化测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文适合已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用Postman 进行模拟请求等基本操作。 工作环境与版本&#xff1a; …

面试-操作系统

用户态和内核态的区别 内核态&#xff1a;在内核态下&#xff0c;CPU可以执行所有的指令和访问所有的硬件资源。 用户态&#xff1a;在用户态下&#xff0c;CPU只能执行部分指令集&#xff0c;无法直接访问硬件资源。 内核态的底层操作主要包括&#xff1a;内存管理、进程管理…

【基础算法】二分(二分查找 + 二分答案)

文章目录 一、二分查找1. 【案例】在排序数组中查找元素的第一个和最后一个位置 ⭐(1) 二分查找的引入(2) 解题细节&#xff08;important&#xff09;(3) 代码示例(4) 【模板】二分查找(5) STL 中的二分查找 2. 牛可乐和封印魔法 ⭐⭐(1) 解题思路(2) 代码实现 3. A-B 数对 ⭐…

多协议物联网关的方案测试-基于米尔全志T536开发板

本文将介绍基于米尔电子MYD-LT536开发板&#xff08;米尔基于全志T536开发板&#xff09;的多协议物联网关方案的开发测试。 摘自优秀创作者-ALSET 米尔基于全志T536开发板 为了充分的应用该开发板&#xff0c;结合T536处理器的特点&#xff0c;这里进一步的进行软件开发&…

echarts的还原,下载图片失效(空白图片,还原白屏)

echarts的toolbox.feature. restore 和toolbox.feature. saveAsImage 失效 也没有任何报错, 只需要修改: // chart.setOption(op); chart.setOption(op,true);

56-Oracle SQL Tuning Advisor(STA)

各位小伙伴&#xff0c;一般都用哪些优化工具&#xff0c;Oracle SQL Tuning Advisor (STA)用的多吗&#xff0c;Profile就是它的其中1个产物&#xff0c;下一期再弄Profile&#xff0c;STA 的核心功能是自动化诊断高负载SQL的性能瓶颈​&#xff08;如全表扫描、缺失索引&…

修改element-plus的主题色css变量

提示&#xff1a;本文仅是记录我修改element-plus等组件库的css变量&#xff0c; 具体【实现主题色切换看这篇】即可 文章目录 1.文件划分2.src/style/index.scss入口文件3.src/style/theme.scss主题色切换维护4.src/style/_color-utils.scss动态生成element-plus的scss变量5.…

Vibe Coding - 进阶 Cursor Rules

文章目录 为什么要配置 .cursorrules使用 .cursorrules 的五大优势 如何创建与应用 .cursorrules✅ 基础步骤&#x1f6e0; 创建方式&#xff1a; 高质量 .cursorrules 文件&#xff0c;应包含以下内容配置示例Java 项目TypeScript React 项目总结 cursorrules 推荐网站 为什么…

腾讯云自动化助手(TAT)技术评估报告

摘要 腾讯云自动化助手&#xff08;TAT&#xff09;作为云服务器&#xff08;CVM&#xff09;与轻量应用服务器&#xff08;Lighthouse&#xff09;的原生运维工具&#xff0c;通过无密码批量命令执行&#xff08;Shell/Python/PowerShell&#xff09;、交互式会话管理及公共命…

【simulink】IEEE5节点系统潮流仿真模型(2机5节点全功能基础模型)

主要内容 该模型为simulink仿真模型&#xff0c;主要实现的内容如下&#xff1a; 模型是基于 Simulink 搭建的电力系统潮流计算仿真模型&#xff0c;围绕2 台发电机、5 个节点的拓扑结构构建&#xff0c;用于电力系统稳态分析&#xff0c;是电力系统研究、教学及工程实践中…

责任链模式详解

责任链模式 场景 顾名思义&#xff0c;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中&#x…

Taro 跨端应用性能优化全攻略:从原理到实践

引言&#xff1a;为什么需要性能优化&#xff1f; 在当今移动互联网时代&#xff0c;用户体验已经成为决定产品成败的关键因素。根据 Google 的研究&#xff0c;页面加载时间每增加 1 秒&#xff0c;移动端转化率就会下降 20%。对于使用 Taro 开发的跨端应用来说&#xff0c;性…

Git集成Jenkins通过Pipeline方式实现一键部署

Docker方式部署Jenkins 部署自定义Docker网络 部署Docker网络的作用&#xff1a; 隔离性便于同一网络内容器相互通信 # 创建名为jenkins的docker网络 docker network create --subnet 172.18.0.0/16 --gateway 172.18.0.1 jenkins# 查看docker网络列表 docker network ls# …

磐基PaaS平台MongoDB组件SSPL许可证风险与合规性分析(下)

#作者&#xff1a;任少近 3.7.条款六&#xff1a;非源代码形式分发 官方原文如下&#xff1a; 原文关键部分&#xff1a;“You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License.” 解读&#xff1a;“您不得…