如何在python中提取skimage骨架信息到NetworkX节点和边以进行进一步的高级分析

2024-06-25

目前,我在Python中使用skimage从一些二值化地图中提取开放空间的骨架,如下图所示,

使用以下 python 代码:

from skimage.morphology import skeletonize
from skimage import draw
from skimage.io import imread, imshow
from skimage.color import rgb2gray

# load image from file
img_fname=os.path.join('images','mall1_2F_schema.png') 
image=imread(img_fname)

# Change RGB color to gray 
image=rgb2gray(image)

# Change gray image to binary
image=np.where(image>np.mean(image),1.0,0.0)

# perform skeletonization
skeleton = skeletonize(image)

现在我想从骨架中提取端点和交叉点作为 Networkx 图对象的节点,同时计算相邻节点之间的距离作为 Networkx 图对象的边。目前,我必须手动获取点坐标并输入到 NetworkX 对象初始化过程中,我们是否有更智能的方法来自动完成所有操作?

顺便说一句,我发现亚龙·卡汉诺维奇 https://stackoverflow.com/users/1811651/yaron-kahanovitch的回答stackoverflow上的问题 https://stackoverflow.com/questions/27648195/how-to-find-the-length-of-a-path-curve-in-a-picture#提出了类似的方法。不过,没有给出更多的实现建议,我认为 NetworkX 可能是一种方法。

非常感谢您的任何建议。


干得好。

这段代码适用于 2D 骨架图像,您可以轻松地将其扩展到 3D。

import networkx as nx
import numpy as np

def skeleton_image_to_graph(skeIm, connectivity=2):
    assert(len(skeIm.shape) == 2)
    skeImPos = np.stack(np.where(skeIm))
    skeImPosIm = np.zeros_like(skeIm, dtype=np.int)
    skeImPosIm[skeImPos[0], skeImPos[1]] = np.arange(0, skeImPos.shape[1])
    g = nx.Graph()
    if connectivity == 1:
        neigh = np.array([[0, 1], [0, -1], [1, 0], [-1, 0]])
    elif connectivity == 2:
        neigh = np.array([[0, 1], [0, -1], [1, 0], [-1, 0], [1, 1], [1, -1], [-1, 1], [-1, -1]])
    else:
        raise ValueError(f'unsupported connectivity {connectivity}')
    for idx in range(skeImPos[0].shape[0]):
        for neighIdx in range(neigh.shape[0]):
            curNeighPos = skeImPos[:, idx] + neigh[neighIdx]
            if np.any(curNeighPos<0) or np.any(curNeighPos>=skeIm.shape):
                continue
            if skeIm[curNeighPos[0], curNeighPos[1]] > 0:
                g.add_edge(skeImPosIm[skeImPos[0, idx], skeImPos[1, idx]], skeImPosIm[curNeighPos[0], curNeighPos[1]], weight=np.linalg.norm(neigh[neighIdx]))
    g.graph['physicalPos'] = skeImPos.T
    return g
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在python中提取skimage骨架信息到NetworkX节点和边以进行进一步的高级分析 的相关文章

  • del 在 Python 中什么时候有用?

    我实在想不出为什么 Python 需要del关键字 大多数语言似乎没有类似的关键字 例如 我们可以分配一个变量 而不是删除一个变量None到它 当从字典中删除时 del可以添加方法 有理由保留吗del在Python中 还是Python前垃圾
  • 设置面积图 openpyxl 的透明度(alpha)

    我想使用 openpyxl 设置面积图背景的透明度 我的图表代码是 from openpyxl drawing fill import PatternFillProperties ColorChoice c2 AreaChart c2 gr
  • Python生成随机数时出现属性错误

    我早些时候就同一段代码提出了类似的问题 但我再次发现自己陷入困境 特别是生成包含两个字母 两个数字 然后两个字母的车牌 我希望这个问题不是重复的 但在这种情况下 我非常不知道该怎么做 这是到目前为止的代码 我希望你能找出我哪里出错了 fro
  • 使用seaborn,我如何在散点图上画一条我选择的线?

    我希望能够在seaborn 生成的图中画出一条符合我规范的线 我选择的图是 JointGrid 但任何散点图都可以 我怀疑seaborn可能不容易做到这一点 以下是绘制数据的代码 来自 Iris 数据集的花瓣长度和花瓣宽度的数据帧 impo
  • Python2 math.fsum 不准确?

    我正在使用 python2 数学模块来计算 fsum 的总和 据我所知 0 1通常不能存储二进制 据我了解 math fsum 应该以某种方式解决这个问题 import math math fsum 0 0 0 1 0 1 math fsu
  • 来自 yahoo 的 python lxml etree 小程序信息

    雅虎财经更新了他们的网站 我有一个 lxml etree 脚本 用于提取分析师建议 然而现在 分析师的建议已经存在 但只是以图表的形式出现 你可以看到一个例子这一页 https finance yahoo com quote CSX ana
  • 在ubuntu中安装pyinterval

    我正在尝试安装 python 库 pyinterval 它需要 crlibm C 标头 我已安装该标头 没有错误 但似乎是问题的根源 当我跑步时 sudo easy install pyinterval 我得到以下信息 Searching
  • Tastypie:GET 的身份验证和 POST 的匿名

    我使用 Django Tastypie 来管理我的用户集合 是否可以允许匿名用户在 API 中发布 在某个端点创建新用户时 并限制经过身份验证的用户仅获取自己的用户 而不是所有用户 感谢您的帮助 我发现最简单的事情就是对我正在使用的身份验证
  • 如何从数据存储区刷新 NDB 实体?

    我希望能够在我的代码调用的测试中断言Model put 对于已修改的实体 不幸的是 似乎正在进行一些缓存 例如以下代码 from google appengine ext import ndb class MyModel ndb Model
  • matplotlib 示例代码不适用于 python 虚拟环境

    我正在尝试在 matplotlib 中显示图像的 x y z 坐标 示例代码 http matplotlib org examples api image zcoord html在全局 python 安装上工作得很好 当我移动光标时 x y
  • tkinter - 在askopenfile期间检索文件名

    我有一个用 Python 和 tkinter 制作的文本编辑器 这是我的 打开文件 方法 def onOpen self file askopenfile filetypes Text files txt txt file read sel
  • 如何在Python中生成0-1矩阵的所有可能组合?

    如何生成大小为 K N 的 0 1 矩阵的所有可能组合 例如 如果我取 K 2 和 N 2 我会得到以下组合 combination 1 0 0 0 0 combination 2 1 0 0 0 combination 3 0 1 0 0
  • 当使用 cx_Freeze 和 tkinter 时,我得到:“DLL 加载失败:找不到指定的模块。” (Python 3.5.3)

    当使用 cx Freeze 和 Tkinter 时 我收到以下消息 File C Users VergilTheHuragok AppData Local Programs Python Python35 32 lib tkinter in
  • 无法通过蓝牙读取心率服务

    我希望创建一个简单的 python 脚本 通过蓝牙从 Polar 传感器读取心率数据 我已经阅读了很多其他帖子 但找不到我能够成功执行的简单内容 我有 Polar 可穿戴设备的设备 MAC 地址 我知道我想要读取的值的服务 UUID HR
  • Python 中 Javascript 的 reduce()、map() 和 filter() 的等价物是什么?

    Python 的等价物是什么 Javascript function wordParts currentPart lastPart return currentPart lastPart word Che mis try console l
  • Python Blowfish 加密

    由于我对 Java 的了解不完整 我正在努力将此加密代码转换为 Python 代码 两者应该得到完全相同的结果 帮助将不胜感激 Java函数 import javax crypto Cipher import javax crypto sp
  • 二进制补码扩展 python?

    我想知道是否有一种方法可以像在 Python 中的 C C 中一样使用标准库 最好在位数组上 进行二进制补码符号扩展 C C Example program include
  • 在 AWS ec2 实例上使用“sudo pip”时出现错误

    我正在尝试在 aws ec2 实例上运行一个小型 python 代码 需要 pytz 和其他一些包 当我尝试安装 pytz 时 出现一些错误 ec2 user ip 172 31 28 178 pip install pytz Collec
  • Android Systrace 没有这样的文件或目录

    这是错误消息 D Programming Tools ADT bundle sdk platform tools systrace gt python systrace py Traceback most recent call last
  • 命名空间与常规包

    命名空间 Python 包之间有什么区别 没有 init py 和一个常规的Python包 有一个 init py 特别是当 init py普通包裹是空的吗 我很好奇 因为最近我忘记了 init py在我制作的包中 我从未注意到任何问题 事

随机推荐