【发布时间】:2012-10-09 19:33:19
【问题描述】:
我需要对从图像中读取的二维数组值执行一些操作,然后使用生成的二维数组创建图像。我正在使用 python 列表来表示二维数组。
发生了一些非常奇怪的事情;二维数组(列表列表)中的值在我标记的两个打印调用之间的某个时间点似乎变为“0”。也就是说,它们似乎可以从图像中正确读取......但后来不知何故被设置为零。
代码:
image = Image.open("test.png").convert("L")
data = [ [255] * image.size[1] ] * image.size[0]
pix = image.load()
for x in range(0, image.size[0]):
for y in range(0, image.size[1]):
data[x][y] = pix[x, y]
#data[x][y] = 77
print "1. data[x][y] = " + str(data[x][y]) + " .vs. " + str(pix[x, y]) # Prints correct values
for x in range(0, image.size[0]):
for y in range(0, image.size[1]):
print "2. data[x][y] = " + str(data[x][y]) + " .vs. " + str(pix[x, y]) # Always prints "0 .vs. [correct value]"
但是,如果我注释掉该行
data[x][y] = pix[x, y]
然后取消注释:
data[x][y] = 77
那么两个print语句显示data中的所有元素都是77
发生了什么事?我不是 python 专家,但我想不出任何合理的理由为什么列表值会这样改变。
我已经尝试了以下行,以防像素访问器做一些奇怪的事情:
data[x][y] = 0 + int(pix[x, y])
但仍然得到相同的结果。我也尝试过使用 RGB 图像而不是灰度图像。
我应该明确表示,我绝对不会对这两个打印调用之间的数据做任何事情。上面的代码正是我将原始程序简化为的代码(在发现我所有的“结果”图像文件都是黑色之后)。
【问题讨论】:
-
为什么不能简单的对image.load()返回的二维结构进行操作?
-
数据稍后会被算法修改。它还将包含复数。
标签: python list python-imaging-library