如何从二值骨架化图像中找到分支点

2023-11-29

我使用 Python OpenCV 来骨架化图像,如下所示:

This is the skeletonized image

我想找到骨架的分支点

This is the point that I wanted

我不知道该怎么做。有什么想法吗?


这个问题已经很老了,但是如果其他人偶然发现了这个问题,并且希望得到一个不依赖其他软件包并使用简单形态操作的答案,您可能会发现以下内容很有帮助。

这个想法只是应用“命中或错过”变换来搜索满足分支点条件的像素。骨架中的分支点是连接到三个或四个其他像素的像素。给定适当的结构元素列表selems您可以在一个输出图像中优雅地组合多个命中或错过的变换,如下所示。

import numpy as np
import scipy.ndimage as ndi


branches = np.zeros_like(skeleton, dtype=bool)
for selem in selems:
    branches |= ndi.binary_hit_or_miss(skeleton, selem)

这是非常节省空间的,因为您直接将每个转换的结果添加到同一个结果数组中。现在的问题是如何创建结构元素列表。一种解决方案如下。

selems = list()
selems.append(np.array([[0, 1, 0], [1, 1, 1], [0, 0, 0]]))
selems.append(np.array([[1, 0, 1], [0, 1, 0], [1, 0, 0]]))
selems.append(np.array([[1, 0, 1], [0, 1, 0], [0, 1, 0]]))
selems.append(np.array([[0, 1, 0], [1, 1, 0], [0, 0, 1]]))
selems.append(np.array([[0, 0, 1], [1, 1, 1], [0, 1, 0]]))
selems = [np.rot90(selems[i], k=j) for i in range(5) for j in range(4)]

selems.append(np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]]))
selems.append(np.array([[1, 0, 1], [0, 1, 0], [1, 0, 1]]))

仅当您还想检测具有四个分支的分支点时才需要最后两行。如果您只对三个分支感兴趣,则可以省略最后两行。

完整的解决方案将是

import numpy as np
import scipy.ndimage as ndi


selems = list()
selems.append(np.array([[0, 1, 0], [1, 1, 1], [0, 0, 0]]))
selems.append(np.array([[1, 0, 1], [0, 1, 0], [1, 0, 0]]))
selems.append(np.array([[1, 0, 1], [0, 1, 0], [0, 1, 0]]))
selems.append(np.array([[0, 1, 0], [1, 1, 0], [0, 0, 1]]))
selems.append(np.array([[0, 0, 1], [1, 1, 1], [0, 1, 0]]))
selems = [np.rot90(selems[i], k=j) for i in range(5) for j in range(4)]

selems.append(np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]]))
selems.append(np.array([[1, 0, 1], [0, 1, 0], [1, 0, 1]]))

branches = np.zeros_like(skeleton, dtype=bool)
for selem in selems:
    branches |= ndi.binary_hit_or_miss(skeleton, selem)

同样,您可以使用以下结构元素列表来搜索端点。

selems = list()
selems.append(np.array([[0, 1, 0], [0, 1, 0], [0, 0, 0]]))
selems.append(np.array([[1, 0, 0], [0, 1, 0], [0, 0, 0]]))
selems = [np.rot90(selems[i], k=j) for i in range(2) for j in range(4)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从二值骨架化图像中找到分支点 的相关文章

随机推荐

  • jquery和bootstrap之间的冲突

    我有一个代码 其中包含 jquery 文件和 bootstrap 文件在 header php 中 我遇到的问题是 如果我在 bootstrap js 文件之前包含 jquery 文件 它会弄乱网页上的其他选项卡 基本上即使我单击其他选项卡
  • 使用循环将输出打印到 Knit 中

    为这个问题道歉 我确信答案很简单 我有几个包含对象的列表 我通过knitr 将它们运行到HTML 中 并希望控制输出的顺序 此代码打印所有 list1 输出 然后打印所有 list1 绘图 然后打印所有 list2 输出 然后打印所有 li
  • 需要 JButton 事件支持

    我最近回答了一个关于如何在另一个类的主方法中打开登录面板的问题 因为我还没有上过任何 Swing 课程 只有基本的 Java 编程 所以我已经偶然发现了另一个问题 我如何检测用户是否按下了 JPanel 中的按钮并使其执行某些操作 例如 用
  • 应用程序在前台运行时收到的 iOS 推送通知

    根据我的理解 当应用程序正在运行或在前台并收到推送通知时 应用程序不应显示任何警报 但应用程序委托将调用didReceiveRemoteNotification委托方法 我应该在该回调中处理推送通知 推送通知应仅在应用程序处于后台时显示警报
  • 在 awk 中使用两个字段分隔符[重复]

    这个问题在这里已经有答案了 我正在尝试用 bash 解析这样的字符串 OPS all 1234 ip port1 name state number id phone 123 zip 123 state AB city seattle OP
  • php 中从右到左的语言支持

    我正在开发一个网站 人们可以用阿拉伯语发表评论 我的网站是用 php 构建的 有谁知道如何添加从右到左的语言支持以用英语编写文本吗 尝试指定在你的标记中 我会读 http www w3 org International tutorials
  • 在Python中,如何在不更改命名空间的情况下以宏样式将一个文件包含(而不是导入)另一个文件中?

    首先我确实了解 导入 当我尝试 导入 时 它不起作用 我想做的是将一个模块分成两部分 其中一个部分可以由一组编辑 而另一个则不能 我希望该小组编写定义明确的 检索函数 而不会受到诱惑或无法编辑运行它们的后端代码 即使是意外 导入 时命名空间
  • Openstack - 更改仪表板的管理员密码

    在哪里可以更改 Openstack 中仪表板的管理员密码 我使用 packstack 安装程序安装了 openstack keystonerc admin 文件中的密码也不起作用 我使用 CentOS 6 3 并且我可以访问配置文件 用户名
  • .NET core - 将连接字符串读入 Entity Framework Core

    我的项目结构非常标准 within EFData EFData是一个 Entity Framework Core 类库 它隔离了所有数据库交互 数据库模型和我的DBContext 我以这种方式构建它 使其与数据库环境无关 API项目当然有参
  • C# 自定义列表框 GUI

    我有一个类列表 但不同的子项有不同的属性需要显示 我想要实现的是在 gui 中拥有一个列表框类型的控件 它使每个子项都可以按照自己想要的方式显示其属性 因此不要为每个类使用相同的预定义列 我设想类似传输界面 如下 的东西 每个类都可以绘制自
  • 在 PIL 中创建棋盘

    背景 我一直在尝试在 PIL 模块中创建一个棋盘 并且已经获得了前两行的一般模式 但无法弄清楚如何将其应用到整个棋盘 正如你所看到的 我创建了一个图像 from PIL import Image img Image new RGB 15 1
  • 导入常量类字段的简称

    我有一个带有数百个配置常量的java程序 public static final String C1 C1 public static final String C2 C2 由于数量太多 我把它们分到一个单独的类中 MyClassConst
  • 将秒转换为天:小时:分钟:秒

    我想将秒转换为小时分钟和秒R Example 86400seconds 1day gmdate d H i s 86400 我就是这样尝试的 你可以尝试 library lubridate seconds to period 86400 1
  • 替换空手道中的 Json 密钥 [重复]

    这个问题在这里已经有答案了 我需要将 Json 发送到端点 但需要用变量替换键 我有这个代码 def idJson response id Given path
  • 自动增量字段在另一个字段更改后重置

    您能否提供一个非常简单的 SQL 示例 说明如何创建一个自动递增的 计数 或 顺序 字段 但在不同字段的每次更改后重新启动 在下表中 每次 餐食 字段发生变化时 订单 字段都会从 1 重新开始 谢谢 用餐 时间 订单午餐 10 30 1午餐
  • 如何在 bash 中对具有特定扩展名的文件递归运行命令?

    我想从根文件夹递归运行命令 这将影响该根文件夹下具有特定扩展名的所有文件 这是命令 blender b03 blend background python myScript py 我想为每个具有 blend 扩展名的文件运行此命令 而不是
  • Ruby 中的“map”方法有什么作用?

    什么是 map do in params 0 param count map The map方法接受一个可枚举对象和一个块 并为每个元素运行块 输出块中的每个返回值 原始对象不会改变 除非您使用map 1 2 3 map n n n gt
  • CakePHP:绑定模型不起作用

    我有用户 HABTM 职业 在用户编辑中 有一个职业复选框列表 当我在用户模型中定义 HABTM 关系时 它起作用了 但由于这种关系中断了其他功能 我将其删除并将其放入用户控制器中 this gt User gt bindModel arr
  • 将复杂字典放入返回队列时,多处理进程不会加入

    给定一个非常标准的读 写多线程进程 带有读队列和写队列 8 times worker done被打印 但 join 语句从未被传递 但如果我更换queue out put r 通过 queue out put 1 它可以工作 这让我的大脑融
  • 如何从二值骨架化图像中找到分支点

    我使用 Python OpenCV 来骨架化图像 如下所示 我想找到骨架的分支点 我不知道该怎么做 有什么想法吗 这个问题已经很老了 但是如果其他人偶然发现了这个问题 并且希望得到一个不依赖其他软件包并使用简单形态操作的答案 您可能会发现以