2011-10-13 85 views
6

我已經加載了PIL/OpenCV的RGB圖像,並且我想將它的所有通道轉換爲單個1x(3 *寬*高)序列,以便將其饋送給ANN。我發現我可以簡單地做:平展OpenCV/Numpy陣列

rlist = [] 
glist = [] 
blist = [] 
for i in xrange(im.width): 
    for j in xrange(im.height): 
     r,g,b = im[i,j] 
     rlist.append(r) 
     glist.append(g) 
     blist.append(b) 
img_vec = rlist + blist + glist 

但顯然這是非常低效率。有一些內部OpenCV/numpy例程有更快的方法嗎?

+0

我很好奇。什麼是ANN? –

+0

ANN ==人工神經網絡 – Cerin

回答

7

作爲一個簡單的例子:

import Image 
import numpy as np 

im = Image.open('temp.png') 
data = np.array(im) 
flattened = data.flatten() 

print data.shape 
print flattened.shape 

這產生了:

(612, 812, 4) 
(1987776,) 

或者,而不是調用data.flatten(),你可以調用data.reshape(-1)-1被用作「找出給定維度應該是什麼」的佔位符。

請注意,這將產生一個向量(flattenedr0, g0, b0, r1, g1, b1, ... rn, gn, bn,而你想要一個向量r0, r1 ... rn, b0, b1, ... bn, g0, g1, ... gn

爲了得到你想要什麼,只是叫

flattened = data.T.flatten() 

代替。

+0

您確定關於data.T.flatten()?我的測試顯示data.flatten()以[r1,r2 ...,g1,g2,... b1,b2 ...]的順序返回數據,而data.T.flatten()以[r1 ,G1,B1,R2,G2,B2,...]。但是,我測試使用簡單的numpy陣列,而不是實際的圖像。 – Cerin