2012-12-13 76 views
1

Hy! 我有两个图像(相同尺寸)作为numpy的阵列IMGA - IMGB 我想迭代每个行和列,并获得somenthing这样的:使用numpy数组遍历多维数组(图像) - python

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)。所以现在我需要一个新的三角洲,但与不同的x轴,像imgRl(0,0)中的像素,我想在imgLl中添加像素(0 + k,0)

你会得到更多我的问题吗?

+0

难道你不是指imgA [i] [j] - imgB [i-k [i]] [j]? –

+0

是的抱歉,我写错了,但我的意思是。 我的图像是384x288,但它进入无限循环,我也不能写最后的[i] [j],但只是最终的,因为我得到: valueError:输出操作数需要减少,但减少未启用。 – Gianfra

+0

imgA [i] [j]里面有什么?它是一个元组吗?如果是这样,那可能是你的问题。该任务需要一个值。 –

回答

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)) 

将在像素的imgLabL(r, c)和像素的imgLAbR(r - k, c)之间的位置(r, c)的DeltaE值。那是你要的吗?

+0

谢谢!这很有用! 我确实试图解释我自己:) – Gianfra

+0

在这k我有两个图像的差距。我m立体图像工作,我发现差距(http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#stereosgbm) 所以,现在我想使deltaE与匹配的点和我应该使用这种差距。如果我正确的话,imgA(x,y)中的点在imgB(x + disp,y)中有一个匹配点。因此我必须沿着x轴移动。 我要去试试这个np.roll! btw deltaE方法工作非常好!谢谢! – Gianfra

+0

使用np.roll我得到这个错误:只有长度为1的数组可以转换为python标量 – Gianfra

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]的数组,然后迭代这个,用计算结果填充一个空数组。