将numpy.array对象转换为PIL图像对象

时间:2018-07-23 12:44:03

标签: python numpy python-imaging-library

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

  

回溯(最近一次通话最近):文件“ C:\ Users \ Shri1008 Saurav   Das \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ PIL \ Image.py”,   第2428行,在fromarray中       模式,rawmode = _fromarray_typemap [typekey] KeyError:((1、1、3062),'| u1')

     

在处理上述异常期间,发生了另一个异常:

     

回溯(最近通话最近一次):文件“ 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中       引发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。请帮助。

1 个答案:

答案 0 :(得分:0)

问题在于数据的形状。枕头的cellForItem函数只能执行MxNx3阵列(RGB图像)或MxN阵列(灰度)。要使灰度图像起作用,您必须将MxNx1阵列转换为MxN阵列。您可以使用func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let memosize = self.sections[indexPath.section].itemData[indexPath.row].size if memosize != .zero { return memosize } self.configure(self.modelCell, forIndexPath:indexPath) // in common with cellForItem var sz = self.modelCell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize) sz.width = ceil(sz.width); sz.height = ceil(sz.height) self.sections[indexPath.section].itemData[indexPath.row].size = sz // memoize return sz } 函数来完成此操作。这样会将数据弄平,然后将其放入其他数组形状。

fromarray

(将其添加到np.reshape()之前)