如何将坐标绘制到3D图像上并显示它

时间:2019-01-28 19:07:42

标签: python image matplotlib multidimensional-array plot

我有一个3D图像作为分层的tif文件,其二进制体积显示了特定位置的斑点。我还有一个预测算法的输出,可以预测图像中所述斑点的坐标。

到目前为止,我一直在使用imageio.volreadimageio.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会生成以下图像:

enter image description here

我不能正确使用marching_cubes函数吗?为什么情节如此扭曲?原始的斑点是干净的球体,根本没有拉伸。

此外,如果这是绘制图像的唯一方法,我将如何在此图像上绘制[x,y,z]坐标?

0 个答案:

没有答案