灰度 .png 到 numpy 数组

Grayscale .png to numpy array

确实,这个问题已经回答了很多次了。但是,由于 "too low" 声誉不允许我在答案中添加评论,因此我想讨论 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 - 如果您建议我如何不 post 重复问题而是直接讨论答案 - 将不胜感激。

试试看!

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 的灰度图像),而您的方法将生成彩色图像。

我正在做类似的事情,但我不确定为什么 运行 遇到了一堆问题。最后,这对我来说非常有效,没有丢失任何数据。

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 阵列