PIL图像转换为数组然后再转回去

4

编辑:抱歉,代码的第一个版本很烂,我试图删除无用的信息,结果犯了一个错误。问题仍然存在,但现在这是我实际使用过的代码。

我认为我的问题可能非常基础,但我找不到解决方法。我只是想用PIL玩一下,将图像转换为数组并反向转换,然后保存图像。它应该看起来相同,对吧?在我的情况下,新图像只是一些乱码,它似乎有一些结构,但它不像应该是一个飞机的图片:

def array_image_save(array, image_path ='plane_2.bmp'):
  image = Image.fromarray(array, 'RGB')
  image.save(image_path)
  print("Saved image: {}".format(image_path))

im = Image.open('plane.bmp').convert('L')
w,h = im.size
array_image_save(np.array(list(im.getdata())).reshape((w,h)))

你用什么扩展名保存了 some_path 图像?你的 save() 调用似乎没有指定扩展名。 - DarkCygnus
那段代码没有意义。im是一个PIL图像对象,但是Image.fromarray期望它的参数是一个数组,并且它会从该数组创建一个图像。我猜你想要一个Numpy数组。是这样吗?请参见https://dev59.com/smsz5IYBdhLWcg3wn5ba#7769424。 - PM 2Ring
“玩弄PIL库的问题在于您没有明确的问题陈述,因此您正在使用API未设计的功能并感到困惑。找到一个实际需要使用PIL解决的问题,例如加载图像并使用新扩展名保存它,然后尝试使其正常工作。目前而言,这并不是真正的问题。” - user955340
1个回答

3

我不是很确定你想要实现什么,但如果你只是想将图像转换为 numpy 数组再转回来,可以使用以下代码:

from PIL import Image
import numpy as np

def array_image_save(array, image_path ='plane_2.bmp'):
  image = Image.fromarray(array)
  image.save(image_path)
  print("Saved image: {}".format(image_path))

im = Image.open('plane.bmp')
array_image_save(np.array(im))

你可以将PIL图像直接传递给np.array,它会自动处理正确的形状。你之所以得到扭曲的数据是因为你将pil图像转换为灰度图(.convert('L')),但是却尝试将其保存为RGB格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接