2016-04-02 4 views
2

Ich verwende OpenCV, um Bilder in numpy.array zu lesen, und sie haben die folgende Form.Wie werden Dimensionen in einem numply-Array kombiniert?

import cv2 

def readImages(path): 
    imgs = [] 
    for file in os.listdir(path): 
     if file.endswith('.png'): 
      img = cv2.imread(file) 
      imgs.append(img) 
    imgs = numpy.array(imgs) 
    return (imgs) 

imgs = readImages(...) 
print imgs.shape # (100, 718, 686, 3) 

Jedes Bild hat 718x686 Pixel/Dimension. Es gibt 100 Bilder.

Ich möchte nicht auf 718x686 arbeiten, möchte ich die Pixel in einer einzigen Dimension zu kombinieren. Das heißt, die Form sollte wie folgt aussehen: (100,492548,3). Gibt es sowieso in OpenCV (oder einer anderen Bibliothek) oder Numpy, die mir das erlauben?

+0

Ich verstehe nicht, wo Sie die Endform aus bekommen. Aber hast du schon mal versucht, alles neu zu gestalten? Wenn Sie ein (718, 686) Array namens X haben, können Sie es zB in einen Zeilenvektor wie X.reshape ((1, -1)) reduzieren. –

Antwort

4

Ohne Ihre Lesefunktion zu ändern:

imgs = readImages(...) 
print imgs.shape # (100, 718, 686, 3) 

# flatten axes -2 and -3, using -1 to autocalculate the size 
pixel_lists = imgs.reshape(imgs.shape[:-3] + (-1, 3)) 
print pixel_lists.shape # (100, 492548, 3) 
2
import cv2 
import os 
import numpy as np 

def readImages(path): 
    imgs = np.empty((0, 492548, 3)) 
    for file in os.listdir(path): 
     if file.endswith('.png'): 
      img = cv2.imread(file) 
      img = img.reshape((1, 492548, 3)) 
      imgs = np.append(imgs, img, axis=0) 
    return (imgs) 

imgs = readImages(...) 
print imgs.shape # (100, 492548, 3) 

war Der Trick, um eine numpy Array neu zu gestalten und anzufügen. Es ist nicht gut, die Länge des Vektors zu codieren (492548). Wenn ich Sie wäre, würde ich auch eine Zeile hinzufügen, die diese Zahl berechnet und in eine Variable schreibt, die im Rest des Skripts verwendet wird.

+0

Mit '-1' wird numpy 492548 für Sie berechnen – Eric

0

Falls es will jemand. Hier ist eine allgemeine Art und Weise, dies zu tun

import functools 
def combine_dims(a, i=0, n=1): 
    """ 
    Combines dimensions of numpy array `a`, 
    starting at index `i`, 
    and combining `n` dimensions 
    """ 
    s = list(a.shape) 
    combined = functools.reduce(lambda x,y: x*y, s[i:i+n+1]) 
    return np.reshape(a, s[:i] + [combined] + s[i+n+1:]) 

Mit dieser Funktion können Sie es wie folgt verwenden:

imgs = combine_dims(imgs, 1) # combines dimension 1 and 2 
# imgs.shape = (100, 718*686, 3) 
Verwandte Themen