使用numpy数组迭代多维数组(图像) - python

时间:2012-12-13 16:24:36

标签: numpy python-2.7

HY! 我有两个图像(相同的维度)作为numpy数组imgA - imgB 我想迭代每一行和每一行,并得到这样的结论:

for i in range(0, h-1):
  for j in range(0, w-1):
    final[i][j]= imgA[i,j] - imgB[i-k[i],j]

其中h和w是图像的高度和宽度,k是和维度为[h * w]的数组。

我看过这个话题: Iterating over a numpy array 但它不能用于图像,我得到错误:解压缩的值太多了 用numpy和python 2.7有没有办法做到这一点?

感谢

编辑 我试着更好地解释自己。 我在LAB颜色空间中有2个图像。 这些图像是(288,384,3)。 现在我想制作deltaE所以我可以这样做(吐出2个数组):

 imgLabL=np.dsplit(imgL,3)
 imgLabR=np.dsplit(imgR,3)
 imgLl=imgLabL[0]
 imgLa=imgLabL[1]
 imgLb=imgLabL[2]
 imgRl=imgLabR[0]
 imgRa=imgLabR[1]
 imgRb=imgLabR[2]
delta=np.sqrt(((imgLl-imgRl)**2) + ((imgLa - imgRa)**2) + ((imgLb - imgRb)**2)   )

直到现在一切都很好。 但现在我有这个大小为k的阵列(288,384)。 所以现在我需要一个新的delta但是x轴不同,就像imgRl(0,0)中的像素一样,我想在imgLl(0 + k,0)中添加像素

你有更多我的问题吗?

2 个答案:

答案 0 :(得分:1)

我很确定无论你想要做什么,都可以进行矢量化并在没有任何循环的情况下运行。但是编写代码的方式,它不起作用就不足为奇了......

如果k是形状(h, w)的数组,则k[i]是形状(w,)的数组。当你做i-k[i]时,numpy会做它的广播魔术,你会得到一个形状(w,)的数组。因此,您使用形状imgB的数组和单个整数为(w,)编制索引。由于索引中的某个项目是数组,fancy indexing会启动。因此假设imgB的形状为(h, w, 1)imgB[i-k[i], j]的返回值将不是数组形状(1,),但形状为(w, 1)的数组。当您尝试从imgA[i, j](形状为(1,)的数组)中减去广告魔法时,广播魔法会再次生效,因此您会得到一个形状为(w, 1)的数组。

我们不知道final是什么。但如果它是一个形状为(h, w, 1)的数组,imgAimgB,则final[i][j]是一个形状为(1,)的数组,您正在尝试分配它是一个形状(w, 1)的数组,它不适合。因此operand requires a reduction,but reduction is not enabled错误消息。

修改

您实际上不需要拆分数组来计算DeltaE ...

def deltaE(a, b) :
    return np.sqrt(((a - b)**2).sum(axis=-1))

delta = deltaE(imgLabL, imgLabR)

在第二种情况下,我仍然不明白你想做什么...如果你想比较沿x轴移位的两个图像,我建议使用np.roll

deltaE(imgLabL, np.roll(imgLabR, k, axis=0))

位置(r, c)位于(r, c)的像素imgLabL(r - k, c)的像素imgLAbR之间的deltaE。这就是你想要的吗?

答案 1 :(得分:0)

我通常使用numpy.nditer,其文档为here并且有很多示例。简言之:

import numpy as np
a = np.ones([4,4])

it = np.nditer(a)
for elem in a:
    #do stuff

您也可以使用c样式迭代,即

while not it.finished:
    #do stuff
    it.iternext()

如果需要访问数组的索引。在你的情况下,我会将你的两个图像压缩在一起以创建一个形状[2,h,w]的数组,然后迭代它,用计算结果填充一个空数组。