2012-06-01 61 views
5

我收到了以下Python3代碼中的錯誤,在指示的行中。 x,y和z都是普通的二維numpy數組,但大小相同,並且應該可以工作。然而,他們的行爲不同,y和z崩潰而x正常工作。PIL fromarray函數中導致依賴維的AttributeError是什麼?

import numpy as np 
from PIL import Image 

a = np.ones((3,3,3), dtype='uint8') 
x = a[1,:,:] 
y = a[:,1,:] 
z = a[:,:,1] 

imx = Image.fromarray(x) # ok 
imy = Image.fromarray(y) # error 
imz = Image.fromarray(z) # error 

但這個工程

z1 = 1*z 
imz = Image.fromarray(z1) # ok 

的錯誤是:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python3\lib\site-packages\PIL\Image.py", line 1918, in fromarray 
    obj = obj.tobytes() 
AttributeError: 'numpy.ndarray' object has no attribute 'tobytes' 

那麼什麼是X,Y,Z之間的不同,Z1?沒有我能說的。

>>> z.dtype 
dtype('uint8') 
>>> z1.dtype 
dtype('uint8') 
>>> z.shape 
(3, 4) 
>>> z1.shape 
(3, 4) 

我在Windows 7企業機器上使用Python 3.2.3,所有內容都是64位。

+0

在Ubuntu 12.04與Python 2.7無誤差。 – user545424

回答

6

我可以在http://www.lfd.uci.edu/~gohlke/pythonlibs/#pil再現ubuntu上12.04與Python 3.2.3,1.6.1 numpy的,和PIL 1.1.7換Python 3中。所不同的是因爲x的array_interface沒有進步價值,但Y's和z的DO:

>>> x.__array_interface__['strides'] 
>>> y.__array_interface__['strides'] 
(9, 1) 
>>> z.__array_interface__['strides'] 
(9, 3) 

等不同的分支,在這裏:

if strides is not None: 
    obj = obj.tobytes() 

說明文檔中提到tostring,不tobytes

# If obj is not contiguous, then the tostring method is called 
# and {@link frombuffer} is used. 

和PIL 1.1.7的Python 2中源使用tostring

if strides is not None: 
    obj = obj.tostring() 

所以我懷疑這是在進行str/bytes更改的2至3轉換期間引入的錯誤。通過簡單地tostring()Image.py更換tobytes(),它應該工作:

Python 3.2.3 (default, May 3 2012, 15:54:42) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import numpy as np 
>>> from PIL import Image 
>>> 
>>> a = np.ones((3,3,3), dtype='uint8') 
>>> x = a[1,:,:] 
>>> y = a[:,1,:] 
>>> z = a[:,:,1] 
>>> 
>>> imx = Image.fromarray(x) # ok 
>>> imy = Image.fromarray(y) # now no error! 
>>> imz = Image.fromarray(z) # now no error! 
>>> 
+1

謝謝你。這指出了我的一個解決方法,即將數組的副本作爲'arr2 = arr.copy();返回Image.fromarray(arr2,'L')',即使'.fromarray(arr,...)'失敗,它也可以工作。 –

2

與DSM同意。我也遇到了與PIL 1.17相同的問題。

以我爲例,我需要轉移ndarray INT圖像並保存。

x = np.asarray(img[:, :, 0] * 255., np.uint8) 
image = Image.fromarray(x) 
image.save("%s.png" % imgname) 

我得到了和你一樣的錯誤。

我隨機嘗試過其他方法:scipy.msic.imsave直接保存圖像。

scipy.msic.imsave(imgname, x) 

它的工作原理!不要忘記imagename中的'.png'。

相關問題