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:
This yields:
Alternately, instead of calling
data.flatten(), you could calldata.reshape(-1).-1is used as a placeholder for “figure out what the given dimension should be”.Note that this will yield a vector (
flattened) ofr0, g0, b0, r1, g1, b1, ... rn, gn, bn, while you want a vector ofr0, r1 ... rn, b0, b1, ... bn, g0, g1, ... gn.To get exactly what you want, just call
instead.