2013-09-25 12 views
20

boyutlarını değiştirir. Yastık ve numpy kullanıyorum, ancak Pillow Image nesnesi ve numpy dizisi arasında dönüştürme sorunu yaşıyorum. Aşağıdaki kodu yürüttüğümde, sonuç gariptir.Yastık Image nesnesi ve numpy array arasındaki dönüşüm,

im = Image.open(os.path.join(self.img_path, ifname)) 
print im.size 
in_data = np.asarray(im, dtype=np.uint8) 
print in_data.shape 

sonuç boyut değiştirildiğinde Neden

(1024, 768) 
(768, 1024) 

mı? Numpy içinde

cevap

16

im belki kolon-majör ederken diziler satır majör

muhtemelen Resmi doğru göründüğünden emin olmak için matplotlib 'ın imshow ile in_data kontrol etmelisiniz piton Devrik dizi için in_data = in_data.T yapmak vardır.

Ancak matplotlib'in, doğrudan numpy dizileri veren kendi yükleme işlevleriyle birlikte geldiğini biliyor musunuz? Resim gri tonlama do ise http://matplotlib.org/users/image_tutorial.html

+0

np.asarray (im, order = 'F') 'ayrıca [mümkündür] (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.asarray.html # numpy.asarray) –

5

: Bkz

in_data = in_data.T 

ancak Rbg görüntülerle çalışıyorsanız sizin devrik işlemi sadece iki eksende olduğundan emin olmak için:

in_data = np.transpose(in_data, (1,0,2)) 
0

Aslında bu, çoğu görüntü kitaplığının size, saydam dizilere kıyasla aktarılan görüntüleri vermesidir. (bence), görüntü dosyalarını satır satırına yazdığınız için, ilk dizin (x diyelim) satır numarasına atıfta bulunur (bu nedenle x dikey eksendir) ve ikinci dizin (y) sonraki piksele karşılık gelir. satır (böylece y yatay eksen), bu bizim günlük koordinat anlamındadır. Eğer doğru işleyecek istiyorsanız

yazmayı unutmamak gerekir: dolayısıyla

image = library.LoadImage(path) 
array = (library.FromImageToNumpyArray(image)).T 

ve 3D görüntüler için de çalışır

image = library.FromNumpyArrayToImage(array.T) 
library.WriteImage(image, path) 

. Ama ben bunun TÜM resim kütüphaneleri için geçerli olduğunu ümit etmiyorum - sadece bunlarla çalıştım.