【问题标题】:Unable to see the image from a .npy file无法从 .npy 文件中查看图像
【发布时间】:2021-08-15 16:15:39
【问题描述】:

尝试使用下面的代码读取 .npy 文件的图像,但出现以下错误

输入This is the link to download the images where the file size is >10GB

import numpy as np
from matplotlib import pyplot as plt
import matplotlib
import glob


for filename in glob.glob("*.*"):
    if '.npy' in filename:
        img_array = np.load(filename, allow_pickle=True)
        plt.imshow(img_array, cmap="gray")
        img_name = filename+".png"
        matplotlib.image.imsave(img_name, img_array)
        print(filename)

输出

TypeError: Invalid shape (601, 660, 14) for image data

【问题讨论】:

  • 文件是如何保存的?正如您从错误中看到的那样,图像是不规则的形状,并且可能被错误地保存/加载
  • 图像是一个.npy文件,我正在将它转换为一个.png文件,当我们看到图像的形状时,图像的尺寸是14,当我试图读取.npy 文件,它由数字数组组成
  • 问题与machine-learningartificial-intelligence无关,请不要发送无关标签(已删除)。
  • 来自imshow 文档:支持的数组形状为 (M, N) 或 (M, N, 3) 或 (M, N, 4)。但是您的 img_array 是 (M,N,14)。也许您的img_array 包含 14 个不同的 601x660 图像的数据?
  • 根据数据集,它不是一个单一的图像,它的图像对,我们还有一个 csv 文件,这些信息有助于解决这个问题吗??

标签: python python-3.x opencv matplotlib image-processing


【解决方案1】:

我最好的理解是,您想为每个数据集绘制 14 个(或其他...)图像,这可以按如下方式完成

norm = plt.Normalize(np.min(img_array), np.max(img_array))
for n, xy in enumerate(np.transpose(img_array, (2,1,0))):
    plt.imshow(xy, cmap='gray', norm=norm)
    fname = base+"%2.2d"%n+".png'
    ...

如果你想让每个图像独立于其他图像缩放,请省略所有 norm 东西,如果你想交换图像中的列和行,请使用 np.transpose(img_array, (2,0,1)))


示例:

import numpy as np
import matplotlib.pyplot as plt

X, Y, Z = 11, 13, 3
images = np.arange(X*Y*Z).reshape(Z,Y,X).transpose((1,2,0))
cm = 'gray'
norm = plt.Normalize(np.min(images), np.max(images))
normalize = 0
fig, axes = plt.subplots(2, 3, constrained_layout=True)
fig.suptitle('''\
Top: each image is indipendently normalized.
Bottom: all images are equally normalized.''')
for row in axes:
    for ax, image in zip(row, images.transpose((2,0,1))):
        if normalize:
            im = ax.imshow(image, cmap=cm, norm=norm)
        else:
            im = ax.imshow(image, cmap=cm)
            plt.colorbar(im, ax=ax)
    if normalize:
        plt.colorbar(im, ax=row, location='bottom')
    normalize = 1
plt.show()

【讨论】:

  • 谢谢你的回答,输出 NameError: name 'base' is not defined as the image
  • base 代表输出文件的基本名称,我不知道究竟你想要/需要做什么,但我希望你可以填写在空白处,你不能吗?
  • 有没有办法可以使用 opencv 进行排序??
  • 没用过opencv,无法回答。
猜你喜欢
  • 2016-02-02
  • 2021-05-28
  • 2013-09-29
  • 2016-01-07
  • 2022-11-04
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多