首页 > 解决方案 > “RuntimeError: No surface found at the given iso value” 将 3d numpy 数组转换为网格时出错

问题描述

该程序是对给定的 CT 扫描进行分段。为此,我创建了一个深度学习模型。我在 python 中将 CT 扫描读取为 .nrrd 文件,将其转换为 numpy 数组,然后在此基础上训练我的模型。与使用此模型相比,我预测了一个正常工作的 numpy 数组。当我尝试将此 3d numpy 数组转换为网格并最终转换为 .stl 格式时,会出现此问题。

predImg = predictVolume(imgTarget)
vertices,faces,_,_ = marching_cubes_lewiner(predImg)

def dataToMesh(vert, faces):
mm = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
    for j in range(3):
        mm.vectors[i][j] = vert[f[j],:]
return mm


mm = dataToMesh(vertices, faces)
mm.save('tooth-segmented.stl')

标签: pythonimagenumpyscikit-image

解决方案


我也遇到了这个问题。我花了一点时间才弄清楚,但这与 scikit-image 的行进立方体算法中的“级别”参数有关(我假设这是您正在使用的包,而不是另一个包)。

所讨论的“iso 值”是“isolevel”值,它是函数的级别参数。如果您不提供任何内容,该函数将选择图像数组的平均体素值。例如,如果您提供了 0 和 1 的掩码,则默认值为 0.5。然后,行进立方体算法将创建一个表面,将高于和低于 0.5 的体素彼此分开。

根据我的经验,当我错误地为一个零数组运行行进立方体算法时,我遇到了这个错误。因为所有的体素都为零,所以水平也为零,算法实际上无法绘制表面。

我建议检查您的数据数组输入的样子以及您预期的默认级别参数是什么。如果事实证明你的问题和我的一样,那么你需要以某种方式调整输入数组。否则,您可以将级别值调整为适合您的数据的值(例如,如果您想在 CT 图像中分割骨骼,您可能希望为您的级别选择 1000 左右的 HU 值。


推荐阅读