【问题标题】:Grayscale .png to numpy array灰度 .png 到 numpy 数组
【发布时间】:2020-06-15 03:52:28
【问题描述】:

确实,这个问题已经回答过很多次了。但是,由于“太低”的声誉,我不允许对答案添加评论,我想讨论the most comprehensive answer 中提出的解决方案。

解决办法:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt #Used in the comparison below

im = Image.open('file.png').convert('RGB') #Opens a picture in grayscale
pic = np.array(im)
im.close()

工作正常吗?我想知道是否会出现不可接受的质量变化。当我显示图像时,我注意到了一些差异(即 plt.imshow() 顶部的黑色行):

im.show() #Before closing
plt.imshow(pic)

但我不知道它们是否只是转换为 np.array 的必然结果。

PS - 如果它很重要,我会提到我为颜色量化 (KMeans) 和 Floyd 抖动准备图像。

PPS - 如果您建议我如何不要发布重复的问题,而是直接讨论答案 - 我们将不胜感激。

【问题讨论】:

    标签: python-3.x numpy png grayscale image-conversion


    【解决方案1】:

    试试看!

    from PIL import Image 
    import numpy as np
    
    # Other answer method
    im1 = Image.open('gray.png').convert('L')
    im1 = np.stack((im1,)*3, axis=-1)
    
    # Your method
    im2 = Image.open('gray.png').convert('RGB')                  
    im2 = np.array(im2) 
    
    # Test if identical
    print(np.array_equal(im1,im2))
    

    样本输出

    True
    

    我想说一个不同的方面是,即使输入图像是彩色的,另一个答案中的方法也可以工作(只要它实际上制作了 R=G=B 的灰度图像),而您的方法将生成彩色图像。

    【讨论】:

    • 非常好的和简单的答案,谢谢。我不知道np.array_equal,但我一定会喜欢的。实际上,我生成了彩色图像,但是我的程序并不能预测给定图片的调色板。它稍后会测试它是彩色还是灰色,然后调整代码以修改图像。如果我使用convert('L') 方法,我只会对灰度图片进行操作。最后,再次感谢您!
    • 改善或不改善 - 你应得的。
    【解决方案2】:

    我正在做类似的事情,我不知道为什么,但我遇到了一堆问题。最后,这对我来说效果很好,没有丢失任何数据。

    from PIL import Image
    import numpy as np
    img=np.array(Image.open(filename).convert('L'))
    

    并转换回来:

    import imageio
    array = array.astype(np.uint8)
    imageio.imwrite(newfilename, array)
    

    编辑:这仅适用于黑白图像。彩色图像需要 3D 数组而不是 2D 数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-07
      • 2017-04-06
      • 2012-02-07
      • 2013-01-12
      • 2014-06-02
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      相关资源
      最近更新 更多