Python图像库-将像素转换为2D列表
我需要对从图像读取的值的2D数组执行一些操作,然后使用生成的2D数组创建一个图像。我使用python列表来表示2D数组 一些非常奇怪的事情正在发生;2D数组(列表列表)中的值在我标记的两个打印调用之间的某个点上显示为“0”。也就是说,它们似乎是从图像中正确读取的。。。但后来不知怎么的被设置为零 代码: 但是,如果我把这行注释掉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 发生了什么事?我不是
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结构进行操作呢?数据稍后会通过算法进行适当修改。它还将包含复数。