2017-09-28 59 views
1

嘗試在OpenCV中進行單應矩陣的向前變形。你不必知道這是什麼意思來理解這個問題。使用像素數組設置opencv圖像/ numpy數組值

假設有2個圖像(圖像是像素值的2D numpy的陣列)中,A和B,並且看起來像

[[ 6.96122642e+01 -1.06556338e+03 1.02251944e+00] 
[ 6.92265938e+01 -1.06334423e+03 1.02246589e+00] 
[ 6.88409234e+01 -1.06112508e+03 1.02241234e+00] 
... ] 

第一列是X,第二Y-陣列match,和第三是標量。這些XY值圖像的像素指標和對應imageB指標

[[0,0], 
[0,1], 
[0,2] 
... ] 

我想用這個信息來快速從imageA設置imageB值。我有這個工作,但它是沒有那麼快,因爲我想

yAs = np.int32(np.round(match[:, 0]/match[:, 2]) 
xAs = np.int32(np.round(match[:, 1]/match[:, 2]) 
it = np.nditer(pixelsImageB[0], flags=['f_index']) 
while not it.finished: 
    i = it.index  
    xA = xAs[i] 
    yA = yAs[i] 
    if in_bounds(xA, yA, imageA): 
     yB = pixB[0][i] 
     xB = pixB[1][i] 
     imageB[xB,yB] = imageA[xA,yA] 

    it.iternext() 

但我不知道如何與NumPy使這個快速,天真地做這個循環是很慢的。在高級索引,廣播等方面,我是一個徹底的磨合。有任何想法嗎?

+0

'x'和'y'看起來像第一個候選人移出循環。例如'x = np.int32(np.round(match [:,0]/match [:,2]))' –

+0

什麼是'in_bounds'? – Divakar

+0

x或y> 0且<寬度,高度。你會如何使用這些x,y陣列丹? –

回答

1

最快的方法是不推倒重來,並使用cv.WarpPerspective功能。

或者,您可以用枕頭Image.transform方法,根據文檔,它也支持雙三次插值,它應該生產出質量更好的輸出有超過OpenCV的微弱優勢。

+0

這絕對是最好的選擇,如果你真的想要得到的東西完成。我執行它只是爲了瞭解它是如何工作的,並希望能有點了解numpy的這裏也 –

+0

確定,然後1)通過創建一個面具移動狀態(in_bounds)外循環:只需更換X/Y在您使用xAs和yAs編寫的表達式,將其保存到掩碼變量中; 2)然後執行廣播簡單地是這樣的:imageB [PIXB [1,掩模],PIXB [0,掩蔽] = imageA [XAS [掩模],YAS [掩模]] – lomereiter