【问题标题】:Convert numpy.array object to PIL image object将 numpy.array 对象转换为 PIL 图像对象
【发布时间】:2018-12-30 22:13:42
【问题描述】:

我一直在尝试使用 Image.fromarray 将 numpy 数组转换为 PIL 图像,但它显示以下错误。

Traceback(最近一次调用最后一次):文件“C:\Users\Shri1008 Saurav Das\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PIL\Image.py", 第 2428 行,在 fromarray 中 mode, rawmode = _fromarray_typemap[typekey] KeyError: ((1, 1, 3062), '|u1')

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件“C:/Users/Shri1008 Saurav Das/AppData/Local/Programs/Python/Python36-32/projects/try.py", 行 13、在 img = Image.fromarray(IMIR) 文件 "C:\Users\Shri1008 Saurav Das\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PIL\Image.py", 第 2431 行,在 fromarray 中 raise TypeError("无法处理此数据类型") TypeError: 无法处理此数据类型

我从 hdf5 文件中提取矩阵并将其转换为 numpy 数组。然后我做了一些基本的转换来增强对比度(最可能的错误原因)。这是代码。

import tkinter as tk
import h5py as hp
import numpy as np
from PIL import Image, ImageTk

hf = hp.File('3RIMG_13JUL2018_0015_L1C_SGP.h5', 'r')
IMIR = hf.get('IMG_MIR')
IMIR = np.uint8(np.power(np.double(np.array(IMIR)),4)/5000000000)
IMIR = np.array(IMIR)

root = tk.Tk()
img = Image.fromarray(IMIR)
photo = ImageTk.PhotoImage(file = img)
cv = tk.Canvas(root, width=photo.width(), height=photo.height())
cv.create_image(1,1,anchor="nw",image=photo)

我在 Windows 10 上运行 Python 3.6。请帮助。

【问题讨论】:

  • PIL 需要合理数据类型的 MxN(x3) 个数组。你在传递什么?
  • 它是一个 M*N*1 矩阵(因此是灰度),我已将其调低(使用 /5000000000)到 0-255 限制,适用于 uint8 类型
  • 如果有帮助,这里是 dset DATASET LINK

标签: python numpy python-imaging-library


【解决方案1】:

问题在于数据的形状。 Pillow 的fromarray 函数只能做一个MxNx3 数组(RGB 图像),或者一个MxN 数组(灰度)。要使灰度图像工作,您必须将 MxNx1 数组转换为 MxN 数组。您可以使用np.reshape() 函数来执行此操作。这会将数据展平,然后将其放入不同的数组形状。

IMIR = IMIR.reshape(M, N) #let M and N be the dimensions of your image

(在img = Image.fromarray(IMIR)之前添加这个)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多