简体   繁体   English

展平OpenCV / Numpy阵列

[英]Flatten OpenCV/Numpy Array

I've loaded an RGB image with PIL/OpenCV, and I'd like convert all its channels into a single 1x(3*width*height) sequence into order to feed it to an ANN. 我已经加载了带有PIL / OpenCV的RGB图像,我想将其所有通道转换为单个1x(3 *宽*高)序列,以便将其提供给ANN。 I found I can simply do: 我发现我可以做到:

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

But obviously this is horribly inefficient. 但显然这是非常低效的。 Is there a faster way with some internal OpenCV/numpy routine? 有一些内部OpenCV / numpy例程有更快的方法吗?

As a quick example: 作为一个简单的例子:

import Image
import numpy as np

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

print data.shape
print flattened.shape

This yields: 这会产生:

(612, 812, 4)
(1987776,)

Alternately, instead of calling data.flatten() , you could call data.reshape(-1) . 或者,您可以调用data.reshape(-1)而不是调用data.flatten() data.reshape(-1) -1 is used as a placeholder for "figure out what the given dimension should be". -1用作占位符,用于“确定给定维度应该是什么”。

Note that this will yield a vector ( flattened ) of r0, g0, b0, r1, g1, b1, ... rn, gn, bn , while you want a vector of r0, r1 ... rn, b0, b1, ... bn, g0, g1, ... gn . 注意,这将产生r0, g0, b0, r1, g1, b1, ... rn, gn, bn的向量(展flattened ),而你想要一个r0, r1 ... rn, b0, b1, ... bn, g0, g1, ... gn的向量r0, r1 ... rn, b0, b1, ... bn, g0, g1, ... gn

To get exactly what you want, just call 要得到你想要的,只需打电话

flattened = data.T.flatten()

instead. 代替。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM