2016-04-02 28 views
2

numpy.array görüntülerini okumak için OpenCV kullanıyorum ve aşağıdaki şekle sahipler.Sayısal dizide boyutlar nasıl birleştirilir?

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) 

görüntünün her 718x686 piksel/boyuta sahiptir. 100 tane görüntü var.

718x686 üzerinde çalışmak istemiyorum, pikselleri tek bir boyutta birleştirmek istiyorum. Yani, şekil şöyle görünmelidir: (100,492548,3). OpenCV'de (ya da başka bir kütüphanede) ya da bunu yapmamı sağlayan Numpy'de zaten var mı?

+0

Eğer uç şekli nereden anlamıyorum: Burada bu şekilde kullanabiliriz, bu fonksiyon ile bu

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:]) 

yapmanın genel bir yoldur. Ama hepsini tek bir diziye koymadan önce yeniden şekillendirmeyi denediniz mi? Eğer X adında bir (718, 686) diziliş varsa, bu X.reshape ((1, -1)) gibi bir satır vektörü içine düzleştirebilirsiniz. –

cevap

4

:

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) 

Hile, yeniden şekillendirmek ve numpy dizisine eklemekti. Vektörün uzunluğunu (492548) kodlamak iyi bir uygulama değil, ben de olsaydım sen de bu sayıyı hesaplayan bir satır eklerdim ve senaryonun geri kalanında kullanmak için bir değişkene koyardım. Okuma fonksiyonunu değiştirerek olmadan

+0

'-1' kullanımı numpy'nin sizin için 492548 hesaplamasını yapar – Eric

0

durumda herkes bunu istiyor.

imgs = combine_dims(imgs, 1) # combines dimension 1 and 2 
# imgs.shape = (100, 718*686, 3) 
İlgili konular