Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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中将列表另存为图像_Python_Image Processing_Python Imaging Library - Fatal编程技术网

在python中将列表另存为图像

在python中将列表另存为图像,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,我试图将2D列表保存为python中的图像(灰度图像),因此数组中的0值将为黑色,255值将为白色。例如: 255 255 255 255 0 255 255 0 255 255 0 255 255 255 255 将保存一个类似l的形状。 我使用PIL库尝试了以下代码,正如关于堆栈溢出的其他问题所建议的: WIDTH, HEIGHT = img.size imgData = list(img.getdata()) imgData = [imgData[offset:offse

我试图将2D列表保存为python中的图像(灰度图像),因此数组中的0值将为黑色,255值将为白色。例如:

255 255 255
255  0  255
255  0  255
255  0  255
255 255 255 
将保存一个类似l的形状。 我使用PIL库尝试了以下代码,正如关于堆栈溢出的其他问题所建议的:

WIDTH, HEIGHT = img.size
imgData = list(img.getdata()) 
imgData = [imgData[offset:offset + WIDTH] for offset in range(0, WIDTH * HEIGHT, WIDTH)]
#to print the image 
for row in data:
    print(' '.join('{:3}'.format(value) for value in row))
imgData = np.array(imgData)
**IMG VALUES AUGMENTED HERE**
newimg = Image.new('L', (WIDTH, HEIGHT), 'white')
newimg.putdata(imgData)
newimg.save('C:/File/Name.png')
但是,这样创建的图像根本不反映列表。如果我将0和255放在不同的位置,就会创建相同的图像。有人知道解决方案吗?

而不是:

newimg.putdata(imgData)
你需要排队:

newimg.putdata([j[0] for i in imgData for j in i])
灰度数据在1d列表中指定,而不是在2d列表中指定

这将创建以下列表:

>>> [j[0] for i in imgData for j in i]
[255, 255, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 255, 255]
即:

[255, 255, 255,
 255,  0 , 255, 
 255,  0 , 255, 
 255,  0 , 255, 
 255, 255, 255]
编辑 如果使用
imgData[0][0]=[0,0,0,255]
编辑
imgData,则上述解决方案有效。如果您正在使用
imgData[0][0]=0
编辑
imgData
,则需要将行设置为:

[j[0] if hasattr(j, '__iter__') else j for i in imgData for j in i]
或者,您可以通过以下方式让它变得更好:

imgData = np.array([[j[0] for j in i] for i in imgData])
imgData[0][0] = 0
newimg.putdata(imgData.flatten())

由于您的示例缺少任何输入数据,我只是按照您的描述键入它,制作图像,然后将其放大。我还人为添加了一个红色边框,以便您可以在StackOverflow的白色背景上看到它的范围:

#!/usr/bin/env python3

from PIL import Image
import numpy as np

pixels = [[255,255,255],
          [255,0,255],
          [255,0,255],
          [255,0,255],
          [255,255,255]]

# Make list of pixels into Image
im = Image.fromarray(np.array(pixels,dtype=np.uint8))
im.save('result.png')

imgData的确切结构是什么?它是
[[255,255,255],[255,0,255],…
,还是[255,255,255,0,255,…]`?所以对于我使用的代码,它是一个更大的列表,大约是40 x 60,我使用的代码是:
WIDTH,HEIGHT=img.size
imgData=list(img.getdata())
imgData=[imgData[offset:offset+WIDTH]表示范围内的偏移量(0,WIDTH*HEIGHT,WIDTH)]
这有帮助吗?你能将该代码编辑到问题中吗?并将for循环的其余部分放入其中吗?很抱歉,在那里对答复的格式设置有问题。你是对的,最好将此添加到主问题中,即现在添加了所有相关代码。希望这有帮助!谢谢你的建议,尽管我收到了错误消息“IndexError:标量变量的索引无效。”对于这一新行。有什么解决方法吗?我仍然遇到'imgData=np.array([[j[0]表示I中的j]表示imgData中的I]表示I]的错误)现在,这个错误是“iTo Objor”不是订阅的,只是为了确保我能正确地将代码拼合在一起:“JavaSooLoad,代码在我的系统上工作。它必须是我们的代码> IMG.GETDATABOS/Code >输出是不同的。你是如何加载图像的?非常好-请考虑接受它作为Co。点击计票旁边的勾号(复选标记)来更正答案。谢谢你,祝你的项目好运。