灰度.png到numpy数组

时间:2019-04-24 09:35:46

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

的确,这个问题已经回答了很多次。但是,由于“信誉太低”而不允许在评论中添加评论,因此我想讨论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-如果您建议我不要发布重复的问题,而直接讨论答案,将不胜感激。

2 个答案:

答案 0 :(得分: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的灰度图像),而您的方法将产生彩色图像。

答案 1 :(得分:0)

我正在做类似的事情,虽然不确定为什么,但是遇到了很多问题。最后,这对我很有效,而且没有丢失任何数据。

dask-cuda-worker

并转换回去:

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

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