Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 543
Cerin Avatar asked Oct 13 '11 14:10

Cerin


1 Answers

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.

like image 126
Joe Kington Avatar answered Sep 23 '22 02:09

Joe Kington