【问题标题】:Python matplotlib, invalid shape for image dataPython matplotlib,图像数据的形状无效
【发布时间】:2020-08-12 07:11:34
【问题描述】:

目前我有这段代码来显示三个图像:

imshow(image1, title='1')
imshow(image2, title='2')
imshow(image3, title='3')

而且效果很好。但我试图将它们全部放在一行而不是列中。

这是我尝试过的代码:

f = plt.figure()
f.add_subplot(1,3,1)
plt.imshow(image1)
f.add_subplot(1,3,2)
plt.imshow(image2)
f.add_subplot(1,3,3)
plt.imshow(image3)

它抛出

TypeError:无法将 CUDA 张量转换为 numpy。首先使用 Tensor.cpu() 将张量复制到主机内存。

如果我这样做了

f = plt.figure()
f.add_subplot(1,3,1)
plt.imshow(image1.cpu())
f.add_subplot(1,3,2)
plt.imshow(image2.cpu())
f.add_subplot(1,3,3)
plt.imshow(image3.cpu())

它抛出

TypeError:图像数据的形状(1、3、128、128)无效

我应该如何解决这个问题或者有更简单的方法来实现它?

【问题讨论】:

  • 使用 Matplotlib 的subplots 函数,通过ncols 参数指定你想要的行数。
  • @Lith 我已尝试使用此代码:fig, axs = plt.subplots(nrows=1, ncols=3) axs[0].imshow(image1.cpu()) axs[1].imshow(image2.cpu()) axs[2].imshow(image3.cpu()),但仍然得到TypeError: Invalid shape (1, 3, 128, 128) for image data
  • 我不了解 Pytorch,但似乎 cpu() 方法正在将具有(我想)维度 (128,128) 的数组 image 转换为另一个维度 (1,3,128,128) ,对imshow函数无效。该函数的参数必须是一个二维数组(如果使用 RGB 数据,则为 3 维),表示图像像素的数据值。

标签: python python-3.x matplotlib pytorch


【解决方案1】:

matplotlib 函数 'imshow' 获取 3 通道图片为 (h, w, 3),如您在 documentation 中所见。

您似乎传递了图像的三个通道(第二维)的单个图像(第一维)的“批次”(h 和 w 是第三和第四维)。

你需要reshape或者查看你的图片(转换成cpu后,尝试使用:

image1.squeeze().permute(1,2,0)

结果将是所需形状的图像 (128, 128, 3)。

squeeze() 函数将删除第一个维度。 premute() 函数将转置维度,其中第一个将移动到第三个位置,另外两个将移动到开头。

此外,请查看此处以进一步了解 GPU 和 CPU 问题: link

希望对您有所帮助。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多