简体   繁体   English

TypeError:/不支持的操作数类型/:'Image'和'int'

[英]TypeError: unsupported operand type(s) for /: 'Image' and 'int'

I wanted to convert the PIL Image object into a numpy array. 我想将PIL Image对象转换为numpy数组。 I tried using the following codes it showing an error 我尝试使用以下代码显示错误

TypeError Traceback (most recent call last) <ipython-input-133-0898103f22f0> in <module>()
      1 image_path = 'test/28/image_05230.jpg'
----> 2 image = process_image(image_path)
      3 imshow(image)

<ipython-input-129-e036faebfd31> in process_image(image_path)
     24     # normalize
     25     print(type(image))
---> 26     image_arr = np.array(image) / 255
     27     mean = np.array([0.485, 0.456, 0.406])
     28     std_dv = np.array( [0.229, 0.224, 0.225])

TypeError: unsupported operand type(s) for /: 'Image' and 'int'

from PIL import Image

image = Image.open(image_path)
image = np.asarray(image) / 255

I also tried with this code image = np.array(image) / 255 it's showing the same error. 我也尝试使用此代码image = np.array(image)/ 255它显示相同的错误。 (code below) (以下代码)

from PIL import Image

image = Image.open(image_path)
image = np.array(image) / 255

This error occurs only when I used the above code in below function 仅当我在下面的函数中使用上面的代码时才会发生此错误

def convert_pil_to_numpy_array(image_path):
    # Load Image an open the image
    from PIL import Image

    image = Image.open(image_path)
    width = image.size[0]
    height = image.size[1]

    if width > height:
      image.thumbnail((500, 256))
    else:
      image.thumbnail((256, 500))

    left_margin = (image.width - 224) / 2
    lower_margin = (image.height - 224) / 2
    upper_margin = lower_margin + 224
    right_margin = left_margin + 224

    image = image.crop((left_margin, upper_margin, right_margin, lower_margin))

    # normalize
    print(type(image))
    image_arr = np.array(image) / 255
    mean = np.array([0.485, 0.456, 0.406])
    std_dv = np.array( [0.229, 0.224, 0.225])
    image_arr = (image_arr - mean)/std_dv

    return image_arr

In the function convert_pil_to_numpy_array() , the image variable used initially is different from the image variable that stores the crop ped Image object. 在函数convert_pil_to_numpy_array()时, image最初使用变量是从不同的image ,其存储可变crop PED Image对象。

from PIL import Image
image_path = "C:\\temp\\Capture.JPG"
image = Image.open(image_path)
print(type(image))
#Output
<class 'PIL.JpegImagePlugin.JpegImageFile'>

This is a JpegImageFile object. 这是一个JpegImageFile对象。 If you look at the other image variable that stores the cropped image and is later passed to np.array , this variable is an object of the Image class: 如果您查看存储裁剪图像的其他image变量,并稍后传递给np.array ,则此变量是Image类的对象:

image = image.crop((left_margin, upper_margin, right_margin, lower_margin))
print(type(image))
#Output:
<class 'PIL.Image.Image'>

The problem lies in the tuple values passed to the crop() function. 问题在于传递给crop()函数的元组值。 With the margin values that you passed to crop , the image could not be converted to an array and returned an Image object again: 使用传递给crop的边距值,图像无法转换为数组并再次返回Image对象:

image_arr = np.array(image)
print(image_arr)
#Output:
<PIL.Image.Image image mode=RGB size=224x0 at 0x39E4F60>

As your image dimensions were different from mine, I used different values for the 4-tuple passed to crop() and got an array: 由于你的图像尺寸与我的不同,我使用了传递给crop()的4元组的不同值并得到了一个数组:

image = image.crop((50,100,60,120))
image_arr = np.array(image)
#Output:
  [[[-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]
  [-2.11790393 -2.03571429 -1.80444444]]..etc

What you should do is, check the margin values and save the cropped image to file(jpg, png, etc.) and then convert to array. 你应该做的是,检查边距值并将裁剪的图像保存到文件(jpg,png等),然后转换为数组。 Note that I am not storing the saved image to any variable. 请注意,我没有将保存的图像存储到任何变量。 :

image.crop((50, 60, 100, 120)).save("test.jpg")
image_arr = np.array(Image.open("test.jpg")) / 255
mean = np.array([0.485, 0.456, 0.406])
std_dv = np.array( [0.229, 0.224, 0.225])
image_arr = (image_arr - mean)/std_dv
print(image_arr)
#Output:
  [[[-0.04580872  0.08263305  0.30448802]
  [-0.91917116 -0.81022409 -0.58440087]
  [ 0.81042898  0.95798319  1.17594771]
  ...
  [ 2.19753404  2.37605042  2.58771242]
  [-0.02868396 -0.19747899  0.13019608]
  [-0.11430773 -0.28501401  0.04305011]]
  ....etc.

This works: 这有效:

from PIL import Image
import numpy as np

image = Image.open(r'C:\temp\2015-05-14 17.43.10.jpg') # path to existing local file
image_arr = np.asarray(image) / 255

print(image_arr)

Output: 输出:

[[[ 0.35294118  0.39607843  0.41960784]
  [ 0.38039216  0.42352941  0.44705882]
  [ 0.41568627  0.45098039  0.47058824]
  ...,
  [ 0.05490196  0.04705882  0.05098039]
  [ 0.04705882  0.03921569  0.04313725]
  [ 0.04313725  0.03529412  0.03921569]]

 [[ 0.36470588  0.4         0.42745098]
  [ 0.38823529  0.42352941  0.44313725]
  [ 0.40784314  0.44313725  0.4627451 ]
  ..., etc ]

Now that you presented the real code you are actually using: 既然您已经呈现了实际使用的实际代码:

  • Image.open("path.jpg") returns <class 'PIL.JpegImagePlugin.JpegImageFile'> Image.open("path.jpg")返回<class 'PIL.JpegImagePlugin.JpegImageFile'>
  • after your cropping you get a return of <class 'PIL.Image.Image'> 裁剪完毕后,您将获得<class 'PIL.Image.Image'>的返回

If you inspect your cropped image , you can see it only has one dimension, the second is 0: 如果您检查裁剪的image ,可以看到它只有一个维度,第二个是0:

调试器图片

If you fix your code to: 如果您将代码修改为:

def convert_pil_to_numpy_array(image_path):
    # Load Image an open the image
    from PIL import Image

    image = Image.open(image_path)
    width = image.size[0]
    height = image.size[1] 

    image.thumbnail((500, 256) if (width > height) else (256, 500))  

    left_margin = (image.width - 224) / 2
    upper_margin = (image.height - 224) / 2     # fixed
    lower_margin = upper_margin + 224           # fixed
    right_margin = left_margin + 224

    # fixed and renamed so you do not overwrite image all the time - helps debugging
    # now this has 2 dimensions that are non-zero
    image_crop = image.crop((left_margin, upper_margin, right_margin, lower_margin))

    # normalize
    image_arr = np.asarray(image) / 255
    mean = np.mean(image_arr)
    std_dv = np.std( image_arr )
    image_arr = (image_arr - mean)/std_dv 

    return image_crop

the code suddenly runs without errors. 代码突然运行没有错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 TypeError:+ =不支持的操作数类型:“ int”和“ instancemethod” - TypeError: unsupported operand type(s) for +=: 'int' and 'instancemethod' 类型错误:不支持 / 的操作数类型:&#39;tuple&#39; 和 &#39;int&#39; - TypeError: unsupported operand type(s) for /: 'tuple' and 'int' 类型错误:&lt;&lt;:&#39;str&#39; 和 &#39;int&#39; 的操作数类型不受支持 - TypeError: unsupported operand type(s) for <<: 'str' and 'int' TypeError:-:“ int”和“ str”不支持的操作数类型 - TypeError: unsupported operand type(s) for -: 'int' and 'str' TypeError:+不支持的操作数类型:“ int”和“ IntervalMap” - TypeError: unsupported operand type(s) for +: 'int' and 'IntervalMap' TypeError:*:&#39;PositiveIntegerField&#39;和&#39;int&#39;不支持的操作数类型 - TypeError: unsupported operand type(s) for *: 'PositiveIntegerField' and 'int' TypeError:*:&#39;function&#39;和&#39;int&#39;不支持的操作数类型 - TypeError: unsupported operand type(s) for *: 'function' and 'int' 类型错误:不支持 / 的操作数类型:&#39;str&#39; 和 &#39;int&#39; (2) - TypeError: unsupported operand type(s) for /: 'str' and 'int' (2) 类型错误:* 不支持的操作数类型:&#39;NoneType&#39; 和 &#39;int&#39; - TypeError: unsupported operand type(s) for *: 'NoneType' and 'int' 类型错误:+= 不支持的操作数类型:&#39;method&#39; 和 &#39;int&#39; - TypeError: unsupported operand type(s) for +=: 'method' and 'int'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM