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')
方法,我将只对灰度图片进行操作。最后,再次感谢你!很酷,很高兴它能工作。请注意,如果你在回答的投票数旁边点击空心记号(校验标记),你的名声(你在你的问题中提到)会得到改善,提高或没有改善——你应得的。