2012-12-13 77 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]的數組,然後迭代這個,用計算結果填充一個空數組。