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
解决方案建议
- 版本兼容调整:skan 0.10.0属于旧版本,与numpy 1.23.x的类型处理逻辑存在冲突。可选择:
- 降级numpy到1.21.x及以下版本,匹配skan 0.10.0的兼容范围
- 升级skan到0.16.x及以上版本,新版本修复了与高版本numpy的兼容问题
- 调整数组类型:将骨架图像转换为
uint8类型后再传入Skeleton,需先导入numpy:import numpy as np # ... 原有代码 ... skeleton0 = morphology.skeletonize(img).astype(np.uint8) - 更新numba:当前numba 0.50.1版本过旧,无法很好适配numpy 1.23.x,可升级numba到0.56.x版本(与numpy 1.23兼容),再配合skan版本更新使用
内容的提问来源于stack exchange,提问作者mats_student_olie
相关产品推荐
相关产品推荐

