简体   繁体   中英

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. 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?

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) . -1 is used as a placeholder for "figure out what the given dimension should be".

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 .

To get exactly what you want, just call

flattened = data.T.flatten()

instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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