骨架_to_csgraph(python)的坐标错误

Posted

技术标签:

【中文标题】骨架_to_csgraph(python)的坐标错误【英文标题】:Error with coordinates of skeleton_to_csgraph (python) 【发布时间】:2021-07-29 15:14:53 【问题描述】:

我正在使用skeleton-to-csgraph() 来分析我获得的骨架,这个函数应该向我发送一些数据,其中包括矩阵中骨架所有点的所有坐标[(N+ 1) x 2] 与 N 的点数。但是,在一种情况下,此函数无缘无故地给了我一个带有一些错误的坐标矩阵。 有人知道错误可能来自哪里吗?

这里有更多关于函数和包的信息: https://jni.github.io/skan/

Lines of the coordinates matrix given by skeleton-to-csgraph function. At the line 326 an unexplained error, it should be an int and not a float value because it is a pixel index

使用网格,int32 [200,100] 的 ndarray,值为 1 或 0。此链接中的文件: https://drive.google.com/drive/folders/12xwZBv3RKQ4Q802jXPAhtYZXHrsMytMl?usp=sharing

skeleton, distance = medial_axis(grid, return_distance=True)
graph, coordinates, degrees = skeleton_to_csgraph(skeleton)

如图所示,我没有得到一个坐标的整数值

【问题讨论】:

请添加您的代码和完整的错误跟踪日志。谢谢 我的错误来自我的代码的另一部分,但这是由于我在这里描述的错误,skeleton_to_csgraph 函数应该向我发送一些它没有的东西。我在这里描述的错误不会产生错误,这就是问题 我是这个平台的新手,我不知道如何与您分享导致此错误的输入 当我跑的时候,我能够得到图表,最后能够生成图像draw.overlay_skeleton_networkx(graph,coordinates, image=skeleton,axis=ax),并且在坐标中接收到的值都不是零。图像是你的目标吗? 我想要下一个只有整数值的坐标矩阵 【参考方案1】:

您遇到的问题是因为 skan 需要将连接像素折叠到它们的质心才能生成连贯的图形。有关详细信息,请参阅https://doi.org/10.7717/peerj.4312/supp-2。抱歉,这没有更好的记录。我已经提出了一个问题以在将来改进它:

https://github.com/jni/skan/issues/121

这个问题也有关系:坐标数组包含所有节点坐标,但也包含一些垃圾坐标:

https://github.com/jni/skan/issues/108

欢迎继续在 github 上讨论! ?

【讨论】:

感谢您的回答!我去github上查一下,之前没查过也没反应过来。 但是如果我很好理解的话,得到这个错误值是不正常的?它应该是索引而不是浮点坐标? 不,是节点坐标,可以是浮点数(“亚像素”)。 但有时我也会获得两次坐标(在我的第一个帖子/问题中,它是节点 328 ),这也正常吗? 也正常,只是 less 正常?基本上,对于每个节点 ID 都有一个坐标...但是也有来自折叠像素的“剩余”坐标。有时折叠和“摘要”坐标匹配。我们将来会尝试通过删除“垃圾”坐标来解决这个问题。但规则是:您应该只查看节点 ID 中的坐标数组。无法保证该数组中的所有坐标都是“真实的”。【参考方案2】:

在某些特定情况下,函数skeleton-to-csgraph() 存在问题。但是为了克服这个错误,下面的代码提供了你应该得到的结果:

a = np.where(skeleton == 1 )
b = np.array([a[0], a[1]]).transpose()
coordinates = np.vstack(([0,0],b))

带有骨架,带有骨架图像和坐标的numpy数组,您应该使用skeleton-to-csgraph()获得的结果,其中包含骨架点的所有坐标。

【讨论】:

【参考方案3】:

遵循以下步骤: 注意:我在 jupyter notebook 上运行了这个,所以你会看到!安装开始时

!pip install git+https://github.com/jni/skan # install latest version github

加载数据并进行处理。

import numpy as np
from skimage.morphology import medial_axis
from skan import skeleton_to_csgraph
from skan import _testdata
from skan import draw
from matplotlib import pyplot as plt
grid = np.load('grid.npy') # this is the file you shared through google drive

skeleton, distance = medial_axis(grid, return_distance=True)
graph, coordinates, degrees = skeleton_to_csgraph(skeleton)
fig, ax = plt.subplots()
draw.overlay_skeleton_networkx(graph,coordinates, image=skeleton,axis=ax)

fig, ax = plt.subplots()
draw.overlay_skeleton_2d(grid, skeleton, dilate=1, axes=ax);

Complete code screen snap

【讨论】:

你能看看你的坐标矩阵线 325 吗?因为它在那里我有2个我不应该有的值(不是整数的值)!我也可以运行并绘制它,但奇怪的是我们在坐标矩阵中没有整数值,我们应该只有整数,因为它指的是矩阵中的位置,所以如果我想操作这些数据(坐标),我不能因为这个错误 这些是基于网格的值(float - [115.33333333 11.33333333])。如果你想覆盖它,你可以做coordinates[325]=[115,11],然后将它输入到下一个处理中。 我有一个解决这个问题的方法是:a = np.where(skeleton == 1) / b = np.array([a[0], a[1]]) .transpose() / coordinates = np.vstack(([0,0],b)) / 但我们同意这个函数有问题!它不应该返回浮点值 太棒了!由于这是 skan 的库,请查看是否可以向 lib 的作者记录问题。 我会看到的。感谢您的时间和您的确认。 :)

以上是关于骨架_to_csgraph(python)的坐标错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥网格在编辑模式下没有跟随骨架,如何获得骨架变形的网格上的点坐标?

Python_Web_App_Day_1:编写Web App骨架

python 创建项目

python_海龟绘图_坐标系问题_画笔各种方法-python工作笔记013

Maven入门项目创建

python互相转换位置坐标(百度坐标WGS_84火星坐标)