You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

skan.Skeleton返回整数而非骨架对象,调用summarize触发类型错误

解决skan库Skeleton初始化时的TypeError问题

问题背景

已通过scikit-image的morphology.skeletonize完成图像骨架化,可通过skan的draw.overlay_skeleton_2d正常查看骨架,但调用Skeleton类和summarize方法统计分支长度时触发类型错误。

错误信息

TypeError                                 Traceback (most recent call last)
<ipython-input-3-5924e1b8ffc8> in <module>
      4 # fig, ax = plt.subplots()
      5 # draw.overlay_skeleton_2d(img, skeleton0, dilate=1, axes=ax)
----> 6 branch_data = summarize(Skeleton(skeleton0))
      7 branch_data.head()

~\AppData\Roaming\Python\Python38\site-packages\skan\csr.py in __init__(self, skeleton_image, spacing, source_image, _buffer_size_offset, keep_images, junction_mode, unique_junctions)
    383         self.nbgraph = csr_to_nbgraph(graph, pixel_values)
    384         self.coordinates = coords
--> 385         self.paths = _build_skeleton_path_graph(
    386                 self.nbgraph, _buffer_size_offset=_buffer_size_offset
    387                 )

~\AppData\Roaming\Python\Python38\site-packages\skan\csr.py in _build_skeleton_path_graph(graph, *, _buffer_size_offset=None)
    259 def _build_skeleton_path_graph(graph, *, _buffer_size_offset=None):
    260     if _buffer_size_offset is None:
--> 261         max_num_cycles = graph.indices.size // 4
    262         _buffer_size_offset = max_num_cycles
    263     degrees = np.diff(graph.indptr)

TypeError: expected dtype object, got 'numpy.dtype[int32]'

代码示例

import cv2
from skan import draw, skeleton_to_csgraph, Skeleton, summarize
from skimage import morphology
# import numpy as np

from matplotlib import pyplot as plt
%matplotlib notebook

# load image and convert to bool
img = cv2.imread(save_p + "\\" + img_name + ".png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = img.astype(bool)

# skeletonize
skeleton0 = morphology.skeletonize(img)

### check skeleton
# fig, ax = plt.subplots()
# draw.overlay_skeleton_2d(img, skeleton0, dilate=1, axes=ax)

### from Documentation
branch_data = summarize(Skeleton(skeleton0))      # ignoring scaling for now
branch_data.head()

# Skel_obj = Skeleton(skeleton0)        # testing this but same problem
# Skel_obj.path_lengths(0)

环境版本

  • numpy 1.23.4
  • scikit-image 0.19.3
  • pandas 1.3.4
  • skan 0.10.0
  • numba 0.50.1
  • Windows 10

解决方案建议

  1. 版本兼容调整:skan 0.10.0属于旧版本,与numpy 1.23.x的类型处理逻辑存在冲突。可选择:
    • 降级numpy到1.21.x及以下版本,匹配skan 0.10.0的兼容范围
    • 升级skan到0.16.x及以上版本,新版本修复了与高版本numpy的兼容问题
  2. 调整数组类型:将骨架图像转换为uint8类型后再传入Skeleton,需先导入numpy:
    import numpy as np
    # ... 原有代码 ...
    skeleton0 = morphology.skeletonize(img).astype(np.uint8)
    
  3. 更新numba:当前numba 0.50.1版本过旧,无法很好适配numpy 1.23.x,可升级numba到0.56.x版本(与numpy 1.23兼容),再配合skan版本更新使用

内容的提问来源于stack exchange,提问作者mats_student_olie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:25:53