5

示された行で、次の Python3 コードからエラーが発生しています。x、y、および z はすべてプレーンな 2D numpy 配列であり、サイズは同じですが、同じように動作するはずです。それでも、x が正常に動作している間に y と z がクラッシュするなど、動作が異なります。

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 Enterprise マシンで Python 3.2.3 を使用しており、すべて 64 ビットです。

4

2 に答える 2

5

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pilで、Python 3.2.3、numpy 1.6.1、および PIL 1.1.7-for-Python 3 を使用して ubuntu 12.04 で再現できます。x の array_interface にはストライド値がありませんが、y と z にはあるため、違いが生じます。

>>> 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 への変換中に発生したエラーであると思われます。in に置き換えるだけtobytes()で動作するはずです:tostring()Image.py

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!
>>> 
于 2012-06-01T18:43:37.090 に答える
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)

できます!イメージ名の「.png」を忘れないでください。

于 2013-05-01T11:23:48.670 に答える