Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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图像库-将像素转换为2D列表_Python_List_Python Imaging Library - Fatal编程技术网

Python图像库-将像素转换为2D列表

Python图像库-将像素转换为2D列表,python,list,python-imaging-library,Python,List,Python Imaging Library,我需要对从图像读取的值的2D数组执行一些操作,然后使用生成的2D数组创建一个图像。我使用python列表来表示2D数组 一些非常奇怪的事情正在发生;2D数组(列表列表)中的值在我标记的两个打印调用之间的某个点上显示为“0”。也就是说,它们似乎是从图像中正确读取的。。。但后来不知怎么的被设置为零 代码: 但是,如果我把这行注释掉 data[x][y] = pix[x, y] 和取消注释: data[x][y] = 77 然后,两个print语句显示数据中的所有元素都是77 发生了什么事?我不是

我需要对从图像读取的值的2D数组执行一些操作,然后使用生成的2D数组创建一个图像。我使用python列表来表示2D数组

一些非常奇怪的事情正在发生;2D数组(列表列表)中的值在我标记的两个打印调用之间的某个点上显示为“0”。也就是说,它们似乎是从图像中正确读取的。。。但后来不知怎么的被设置为零

代码:

但是,如果我把这行注释掉

data[x][y] = pix[x, y]
和取消注释:

data[x][y] = 77
然后,两个print语句显示数据中的所有元素都是77

发生了什么事?我不是python方面的专家,但我想不出任何合理的理由来解释为什么列表值会发生这样的变化

如果像素存取器正在执行一些异常操作,我尝试了以下行:

data[x][y] = 0 + int(pix[x, y])
但仍然得到同样的结果。我也尝试过用RGB图像代替灰度


我应该明确表示,我绝对不会对这两次打印通话之间的数据进行任何处理。上面的代码正是我将原始程序缩减为的代码(在发现我所有的“结果”图像文件都是黑色后)。

您的问题在于这一行:

data = [ [255] * image.size[1] ] * image.size[0]
这将创建一个长度
图像的列表。大小[1]
填充值
255
。然后创建对同一列表的
image.size[0]
引用,并将所有这些引用打包到另一个列表中。因此,当您更改
a[1][1]
时,您也会更改
a[0][1]
a[2][1]
等。因为
a[0]
a[1]
a[2]
都是对同一列表的引用

下面是一个简单的例子:

a = [[255]*10]*10
a[1][1] = 77
print (a)
最简单的解决方法是:

a = [[255]*10 for _ in range(10)]

这将创建10个新列表,而不是同一列表的引用列表。

您遇到的问题是这一行:

data = [ [255] * image.size[1] ] * image.size[0]
这将创建一个长度
图像的列表。大小[1]
填充值
255
。然后创建对同一列表的
image.size[0]
引用,并将所有这些引用打包到另一个列表中。因此,当您更改
a[1][1]
时,您也会更改
a[0][1]
a[2][1]
等。因为
a[0]
a[1]
a[2]
都是对同一列表的引用

下面是一个简单的例子:

a = [[255]*10]*10
a[1][1] = 77
print (a)
最简单的解决方法是:

a = [[255]*10 for _ in range(10)]

这将创建10个新列表,而不是同一列表的引用列表。

您最好将
数据更改为
数据=[]
,并追加每一行

data = []
pix = image.load()
for y in xrange(image.size[1]):
    data.append([pix[x, y] for x in xrange(image.size[0])])

您最好将
data
更改为
data=[]
并追加每一行

data = []
pix = image.load()
for y in xrange(image.size[1]):
    data.append([pix[x, y] for x in xrange(image.size[0])])

在python中,变量
\uu
并不特别——只是习惯性地使用它来表示“从语法上讲,我需要一个变量,但我永远不会真正使用它”。我想补充一点:虽然这个答案是正确的,但提前创建一个完整的列表并不是一个好主意。如果事先知道数据大小,则最好使用numpy.array。否则,如@halex在下面指出的那样,动态地附加到列表中。@Dhara——如果您要立即填充数据结构,我认为提前创建数据结构没有任何问题。(你有什么理由说这不是一个好主意?)如果项目的其他部分需要numpy,numpy数组肯定会更好,但如果你计划让其他人使用你的代码,有时最好避免外部依赖(但肯定是一个值得考虑的问题)。因为您在列表中迭代了两次—一次创建列表,然后在添加每个数据项时再次进行。我认为简单地附加到一个空列表中更有效(而且我肯定更优雅)。如果您想避免外部依赖性,我知道内置的数组模块也可以非常方便。在python中,变量
\uuu
并不特别——只是有点习惯用它来表示“从语法上讲,我这里需要一个变量,但我永远不会真正使用它”,我想补充一句:虽然这个答案是正确的,提前创建一个完整的列表不是一个好主意。如果事先知道数据大小,则最好使用numpy.array。否则,如@halex在下面指出的那样,动态地附加到列表中。@Dhara——如果您要立即填充数据结构,我认为提前创建数据结构没有任何问题。(你有什么理由说这不是一个好主意?)如果项目的其他部分需要numpy,numpy数组肯定会更好,但如果你计划让其他人使用你的代码,有时最好避免外部依赖(但肯定是一个值得考虑的问题)。因为您在列表中迭代了两次—一次创建列表,然后在添加每个数据项时再次进行。我认为简单地附加到一个空列表中更有效(而且我肯定更优雅)。如果您想避免外部依赖性,我知道内置阵列模块也非常方便。图像阵列是否像numpy阵列一样支持切片?如果是这样的话,您可以执行
data.append(list(pix[:,y]))
图像数组是否像numpy数组一样支持切片?如果是这样的话,您可以执行
data.append(list(pix[:,y]))
为什么不能简单地对image.load()返回的2D结构进行操作?稍后,数据会通过算法进行适当的修改。此外,它还将包含复数。为什么不能简单地对image.load()返回的2D结构进行操作呢?数据稍后会通过算法进行适当修改。它还将包含复数。