Свести OpenCV / Numpy Array - PullRequest
       4

Свести OpenCV / Numpy Array

6 голосов
/ 13 октября 2011

Я загрузил изображение RGB с помощью PIL / OpenCV, и я хотел бы преобразовать все его каналы в одну последовательность 1x (3 * ширина * высота), чтобы передать ее в ANN. Я обнаружил, что могу просто сделать:

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

Но, очевидно, это ужасно неэффективно. Есть ли более быстрый способ с какой-нибудь внутренней подпрограммой OpenCV / numpy?

1 Ответ

7 голосов
/ 13 октября 2011

В качестве быстрого примера:

import Image
import numpy as np

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

print data.shape
print flattened.shape

Это дает:

(612, 812, 4)
(1987776,)

В качестве альтернативы, вместо вызова data.flatten(), вы можете позвонить data.reshape(-1).-1 используется в качестве заполнителя для «выяснения, каким должно быть данное измерение».

Обратите внимание, что это даст вектор (flattened) r0, g0, b0, r1, g1, b1, ... rn, gn, bn, в то время как вам нужен вектор r0, r1 ... rn, b0, b1, ... bn, g0, g1, ... gn.

Чтобы получить именно то, что вы хотите, просто позвоните

flattened = data.T.flatten()

вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...