Python PIL/numpy 转换

Python PIL/numpy conversion

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

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 和不转换为 uint8,我还尝试只将 RGB 通道保留在整个 RGBA 数据之外。没有任何效果。

我可能不会给你一个完整的解释,(为此,你可以阅读 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 倍 'faded' 图像,非常接近黑色..

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)

这应该可以解决。

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)