2011-10-13 38 views
6

Tôi đã tải một hình ảnh RGB với PIL/OpenCV và tôi muốn chuyển đổi tất cả các kênh thành một chuỗi 1x (3 * chiều rộng * chiều cao) thành thứ tự để cấp nó cho ANN. Tôi thấy rằng tôi có thể chỉ cần làm:Flatten OpenCV/Numpy Array

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 

Nhưng rõ ràng điều này cực kỳ kém hiệu quả. Có cách nào nhanh hơn với một số quy trình OpenCV/numpy nội bộ?

+0

Tôi rất tò mò. ANN là gì? –

+0

ANN == mạng nơron nhân tạo – Cerin

Trả lời

7

Như một ví dụ nhanh:

import Image 
import numpy as np 

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

print data.shape 
print flattened.shape 

sản lượng này:

(612, 812, 4) 
(1987776,) 

Cách khác, thay vì gọi data.flatten(), bạn có thể gọi data.reshape(-1). -1 được sử dụng làm trình giữ chỗ cho "tìm ra kích thước đã cho".

Lưu ý rằng điều này sẽ mang lại một véc tơ (flattened) của r0, g0, b0, r1, g1, b1, ... rn, gn, bn, trong khi bạn muốn có vectơ là r0, r1 ... rn, b0, b1, ... bn, g0, g1, ... gn.

Để có được chính xác những gì bạn muốn, chỉ cần gọi

flattened = data.T.flatten() 

để thay thế.

+0

Bạn có chắc chắn về dữ liệu.T.flatten() không? Thử nghiệm của tôi cho thấy data.flatten() trả về dữ liệu theo thứ tự [r1, r2 ..., g1, g2, ... b1, b2 ...] trong khi data.T.flatten() trả về dữ liệu theo thứ tự [r1 , g1, b1, r2, g2, b2, ...]. Tuy nhiên, tôi đã thử nghiệm bằng cách sử dụng các mảng đơn giản, không phải hình ảnh thực tế. – Cerin