2011-10-13 70 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