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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With