python - “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')
解决方案
我也遇到了这个问题。我花了一点时间才弄清楚,但这与 scikit-image 的行进立方体算法中的“级别”参数有关(我假设这是您正在使用的包,而不是另一个包)。
所讨论的“iso 值”是“isolevel”值,它是函数的级别参数。如果您不提供任何内容,该函数将选择图像数组的平均体素值。例如,如果您提供了 0 和 1 的掩码,则默认值为 0.5。然后,行进立方体算法将创建一个表面,将高于和低于 0.5 的体素彼此分开。
根据我的经验,当我错误地为一个零数组运行行进立方体算法时,我遇到了这个错误。因为所有的体素都为零,所以水平也为零,算法实际上无法绘制表面。
我建议检查您的数据数组输入的样子以及您预期的默认级别参数是什么。如果事实证明你的问题和我的一样,那么你需要以某种方式调整输入数组。否则,您可以将级别值调整为适合您的数据的值(例如,如果您想在 CT 图像中分割骨骼,您可能希望为您的级别选择 1000 左右的 HU 值。
推荐阅读
- python - 列表弹出默认
- python - matplotlib 绘制一个共享的 x 轴多图图形 - 每个图形由多条线组成
- javascript - JS 函数在 .js 文件中不起作用,但在写入 .html 文件时起作用
- javascript - 使用模板文字类型 ${} 的 GraphQL 突变
- javascript - 我应该如何使用上传的文件更新表单?
- arrays - 尝试在结构字符串中编辑字符串时出错
- java - 对象无法映射到 POJO 类
- laravel - 我如何通过在 laravel 中给出特定日期来获得周末日期?
- r - 删除 geom_bar 中的空白类别
- r - 边界(奇异)拟合:参见 ?isSingular