我使用matplotlib==3.3.4
绘制3D数据:
fig = plt.figure(figsize=(15, 10))
ax = fig.gca(projection="3d")
ax.view_init(30, 0)
# facecolors is a 3D volume with some processing
ax.voxels(
x, y, z, facecolors[:, :, :, -1] != 0, facecolors=facecolors, shade=False
)
fig.canvas.draw()
image_flat = np.frombuffer(fig.canvas.tostring_rgb(), dtype="uint8")
image_shape = (*fig.canvas.get_width_height(), 3) # (1500, 1000, 3)
ax.imshow(image_flat.reshape(*image_shape))
plt.show()
(我在BraTS20_3dUnet_3dAutoEncoder上做了一些改进,灵感来自Figure to image as a numpy array)。
然而,当我实际绘制图像时,有两个副本:
我做错了什么?我不知道第二个图像是从哪里来的。
1条答案
按热度按时间mrphzbgm1#
NumPy数组的排序是(rows,cols,ch)。代码
image_shape = (*fig.canvas.get_width_height(), 3)
切换了rows
和cols
,导致输出图像形状不正确,看起来像两个副本。将
image_shape = (*fig.canvas.get_width_height(), 3)
替换为:为了避免混淆,我们最好使用两行代码:
可重现的示例(使用来自here的数据):
修复代码之前的输出图像:
修复代码后的输出图像: