将OpenCV/Numpy数组展平

6

我使用PIL/OpenCV加载了一张RGB图像,并希望将其所有通道转换为单个1x(3*width*height)序列,以便将其提供给ANN。我发现我可以简单地执行以下操作:

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程序呢?

ANN代表人工神经网络。 - Cerin
1个回答

8
作为一个快速的例子:
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.reshape(-1)而不是调用data.flatten()-1被用作“找出应该是什么给定维度”的占位符。

请注意,这将产生一个向量(flattenedr0,g0,b0,r1,g1,b1,... rn,gn,bn,而您想要一个向量r0,r1 ... rn,b0,b1,... bn,g0,g1,... gn

要获得您想要的内容,请调用

flattened = data.T.flatten()

而不是。

你确定要使用 data.T.flatten() 吗?我的测试显示 data.flatten() 按顺序返回数据 [r1,r2...,g1,g2,...b1,b2...],而 data.T.flatten() 按顺序返回数据 [r1,g1,b1,r2,g2,b2,...]。但是,我使用的是简单的 numpy 数组,而不是实际的图像。 - Cerin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接