Python PIL / numpy转换

时间:2017-03-29 18:52:58

标签: python numpy python-imaging-library

我在python PIL图像和numpy数组之间转换时遇到问题。我已经检查了现有的Stackoverflow帖子,但它没有解决问题:

import matplotlib.pyplot as plt
import numpy as np
import PIL

rgb_img = plt.imread('some-image.png')
PIL_rgb_img = PIL.Image.fromarray(np.uint8(rgb_img))

plt.imshow(PIL_rgb_img)

我得到一个黑屏。我尝试使用和不使用转换为uint8,我也尝试仅将RGB通道保留在整个RGBA数据之外。没有任何效果。

2 个答案:

答案 0 :(得分:1)

我可能不会给你一个完整的解释,(为此,你可以阅读matplotlib的函数文档),但很明显,有些测试会发生以下情况:

致电时:

rgb_img = plt.imread('img.png')

它给出了一个numpy浮点数组,它将读取[0 - 1]之间的颜色为白色和黑色(对于RGB也是如此)

致电时:

PIL_rgb_img = PIL.Image.fromarray(np.uint8(rgb_img))

将其转换为uint8值,它只需要应该为255并将其设为1这是完全错误的,

你知道uint8中的值应该在[0 - 255]

之间

当你把:

plt.imshow(PIL_rgb_img)

它只显示了255次'褪色'图像,非常接近黑色..

P上。 S。:

这只发生在'.png'文件中, 有plt.imread ..

的东西

解决刚才的问题:

img = 'some_img.png'
rgb_img = plt.imread(img)
if img.split('.')[-1]=='png':
    PIL_rgb_img = PIL.Image.fromarray(np.uint8(rgb_img*255))
else:
    PIL_rgb_img = PIL.Image.fromarray(np.uint8(rgb_img))

plt.imshow(PIL_rgb_img)

应该修复它。

答案 1 :(得分:1)

from PIL import Image
import numpy as np

#PIL to Numpy
pil_img = Image.open('some-image.png')
numpy_img = np.asarray(pil_img)

#Numpy to PIL
resultImage = Image.fromarray(numpy_img)