【问题标题】:Python PIL/numpy conversionPython PIL/numpy 转换
【发布时间】:2017-08-23 10:23:58
【问题描述】:

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

【问题讨论】:

  • 如果不进行测试,您可能有色彩空间问题(是黑色 0 和白色 1 / 黑色 0 白色 255 等...)
  • 可能是 matplotlib 后端问题?我无法用躺在身边的 jpeg 进行复制..

标签: python numpy python-imaging-library


【解决方案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)

这应该解决它。

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 2017-06-25
      • 2010-09-27
      • 1970-01-01
      • 2012-08-25
      • 2019-11-29
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多