我有一个3D图像作为分层的tif文件,其二进制体积显示了特定位置的斑点。我还有一个预测算法的输出,可以预测图像中所述斑点的坐标。
到目前为止,我一直在使用imageio.volread
和imageio.volwrite
读取和写入tif文件,但是我想看看预测算法的工作效率如何,所以我想将坐标绘制到图片。坐标是[x,y,z]
值,其中行数等于斑点数。
我搜索并发现python没有简单的方法可以在3D中实现这一目标。从这里获取指导:https://www.raddq.com/dicom-processing-segmentation-visualization-in-python/,我所做的尝试是利用skimage.measure.marching_cubes
将图像转换为2D表面网格,以便可以使用matplotlib
对其进行绘制,然后使用该图像进行绘制我的图片。
def make_mesh(image):
print('Transposing surface')
p = image.transpose(2, 1, 0)
print('Calculating surface')
verts, faces, norm, val = measure.marching_cubes_lewiner(p, allow_degenerate=True)
return verts, faces
def plt_3d(verts, faces):
print('Drawing')
x, y, z = zip(*verts)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
# Fancy indexing: `verts[faces]` to generate a collection of triangles
mesh = Poly3DCollection(verts[faces], linewidths=0.05, alpha=1)
face_color = [1, 1, 0.9]
mesh.set_facecolor(face_color)
ax.add_collection3d(mesh)
ax.set_xlim(0, max(x))
ax.set_ylim(0, max(y))
ax.set_zlim(0, max(z))
# ax.set_axis_bgcolor((0.7, 0.7, 0.7))
plt.show()
img_gt = io.volread(gt_path)
v, f = make_mesh(img_gt)
plt_3d(v, f)
图像为[21,512,1024]
,由5个“斑点”组成,但是plot_3d
会生成以下图像:
我不能正确使用marching_cubes
函数吗?为什么情节如此扭曲?原始的斑点是干净的球体,根本没有拉伸。
此外,如果这是绘制图像的唯一方法,我将如何在此图像上绘制[x,y,z]
坐标?