坐标为 skeleton_to_csgraph 的错误 (python)

Error with coordinates of skeleton_to_csgraph (python)

提问人:Eloi Schlegel 提问时间:5/7/2021 最后编辑:Eloi Schlegel 更新时间:5/14/2021 访问量:485

问:

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

有关函数和软件包的更多信息,请访问:https://jni.github.io/skan/

由 skeleton-to-csgraph 函数给出的坐标矩阵的线。在第 326 行处出现无法解释的错误,它应该是 int 而不是浮点值,因为它是一个像素索引

使用 Grid,则为 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)

就像在图片上一样,我没有得到一个坐标的整数值

python 协调 错误报告

评论

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

答:

0赞 simpleApp 5/9/2021 #1

按照以下步骤操作: 注意:我在 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);

enter image description here

完整的代码屏幕快照

评论

0赞 Eloi Schlegel 5/10/2021
你能看看你的坐标矩阵线 325 吗?因为它在那里,我有 2 个我不应该拥有的值(不是整数的值)!我也能够运行和绘制它,但奇怪的是,我们在坐标矩阵中没有整数值,我们应该只有整数,因为它指的是矩阵中的位置,所以如果我想操作这个数据(坐标),我不能由于这个错误
0赞 simpleApp 5/10/2021
这些值(float - [115.33333333 11.33333333])基于网格。如果要重写它,可以执行,然后将其馈送到下一个处理中。coordinates[325]=[115,11]
0赞 Eloi Schlegel 5/10/2021
我有一个解决方案来克服这个问题,那就是: a = np.where(skeleton == 1 ) / b = np.array([a[0], a[1]]).transpose() / coordinates = np.vstack(([0,0],b)) / 但我们同意该函数有问题!它不应该返回浮点值
0赞 simpleApp 5/10/2021
伟大!由于这是 SKAN 的 lib,请查看您是否可以与 lib 的作者一起记录问题。
0赞 Eloi Schlegel 5/11/2021
我拭目以待。感谢您的时间和确认。:)
0赞 Eloi Schlegel 5/11/2021 #2

在某些特定情况下,它接缝了功能存在问题。但为了克服此错误,以下代码提供了您应该具有的结果:skeleton-to-csgraph()

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

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

0赞 Juan 5/14/2021 #3

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

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

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

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

欢迎在 github 上继续讨论!🙏

评论

0赞 Eloi Schlegel 5/15/2021
谢谢你的回答!我会在 github 上检查,我以前没有检查过,我也没有条件反射去。
0赞 Eloi Schlegel 5/15/2021
但是如果我很好地理解了,得到这个误差值是不正常的吗?它应该是索引而不是浮点坐标?
0赞 Juan 5/17/2021
不,它们是节点坐标,可以是浮点(“子像素”)。
0赞 Eloi Schlegel 5/17/2021
但是有时我也获得了两次坐标(在我的第一个帖子/问题中,它是节点 328),这也是正常的吗?
0赞 Juan 5/18/2021
也很正常,只是不太正常 😂 基本上,每个节点 ID 都有一个坐标......但也有折叠像素的“剩余”坐标。有时,折叠坐标和“摘要”坐标匹配。我们将来会尝试通过删除“垃圾”坐标来解决这个问题。但规则是:您应该只查看节点 ID 中的坐标数组。不能保证该数组中的所有坐标都是“真实的”。