Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Grayscale.png到numpy数组_Python 3.x_Numpy_Png_Grayscale_Image Conversion - Fatal编程技术网

Python 3.x Grayscale.png到numpy数组

Python 3.x Grayscale.png到numpy数组,python-3.x,numpy,png,grayscale,image-conversion,Python 3.x,Numpy,Png,Grayscale,Image Conversion,事实上,这个问题已经被回答了很多次。但是,由于声誉“太低”,我不允许在回答中添加评论,因此我想讨论中提出的解决方案 解决方案不是: 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 = n

事实上,这个问题已经被回答了很多次。但是,由于声誉“太低”,我不允许在回答中添加评论,因此我想讨论中提出的解决方案

解决方案不是:

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)和弗洛伊德抖动图像

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

试试看

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

非常好而且简单的答案,谢谢。我不知道np.array_equal,但我肯定会喜欢的。事实上,我制作了彩色图像,但是我的程序无法预测给定图片的调色板。它稍后会测试它是彩色的还是灰色的,然后调整代码以修改图像。如果我使用
convert('L')
方法,我将只对灰度图片进行操作。最后,再次感谢你!很酷,很高兴它能工作。请注意,如果你在回答的投票数旁边点击空心记号(校验标记),你的名声(你在你的问题中提到)会得到改善,提高或没有改善——你应得的。