使用numpy数组列表创建mozaic的问题

时间:2017-03-18 18:03:25

标签: python arrays image numpy

所以,我正在尝试进行这种图像处理练习。我必须在16个相同大小的块中分离512px图像,将它们以预先安排的配置混合,创建** mozaic **。为此,我使用** numpy **库并运行一些**测试**以查看它是如何工作的。那就是说,我有这个代码:

$t1

如您所见,我将图像与索引分开并将其全部放入列表中。然后我试图用这个代替一个“块”:

import numpy as np
from scipy import misc
from scipy import ndimage
import matplotlib.pyplot as plt

img = misc.imread("test.png")

list = [(img[0:128, 0:128]), (img[0:128, 128:256]), (img[0:128, 256:384]), (img[0:128, 384:512]),
        (img[128:256, 0:128]), (img[128:256, 128:256]), (img[128:256, 256:384]), (img[128:256, 384:256]),
        (img[256:384, 0:128]), (img[256:384, 128:256]), (img[256:384, 256:384]), (img[256:384, 384:512]),
        (img[384:512, 0:128]), (img[384:512, 128:256]), (img[384:512, 256:384]), (img[384:512, 384:512])]

list[0] = list[1]
print list[0], '\n\n\n', list[1]
plt.imshow(img)
plt.show()

问题出在我打印时

list[0] = list[1]

他们是平等的,但如果我这样做

print list[0], '\n\n\n', list[1]

我可以看到真正的阵列根本没有改变。 **如何将这些数据库应用于图像数组而不仅仅是列表?**或者有一种简单的方法可以做到这一点?我看了一下numpy的分割功能,但这些功能似乎都没有帮助。

PS:我知道这有效,但我需要处理该列表。

print img[0:128, 0:128],'\n\n', img[0:128, 128:256]

2 个答案:

答案 0 :(得分:0)

我不清楚你究竟在问什么 - 你能否设置

img[0:128, 0:128] = img[128:256, 128:256]

或者您正在寻找别的东西吗?

另外,请小心在Python中调用列表list - list是Python中的内置类型,更改它可能会让以后在轨道上引起混淆。

答案 1 :(得分:0)

所以你有一个views的{​​{1}}列表(不需要())

img

alist = [img[0:128, 0:128], img[0:128, 128:256], img[0:128, 256:384], ...]

相当于将列表更改为:

alist[0] = alist[1]

因为该操作只是将alist = [img[0:128, 128:256], img[0:128, 128:256], img[0:128, 256:384], ...] 中的指针更改为alist[0]中的指针。现在前两个元素是一样的。

alist[1]

会更改alist[0][...] = alist[1] 数组的内容而不更改它指向的对象。换句话说,alist[0]是一个可变对象,img[0:128, 128:256]更改内容(如果正确完成)。

这种行为有点棘手。你必须匹配尺寸。我首先写了img[0:128, 128:256][...]=...然后意识到alist[0][:] = alist[1]是一个二维数组,所以我需要使用alist[0][:,:]

说明较小的数组

[...]