Typeerror: Unsupported Operand Type(s) For /: 'image' And 'int'
Solution 1:
In the function convert_pil_to_numpy_array(), the image variable used initially is different from the image variable that stores the cropped Image object.
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. 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 = 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. With the margin values that you passed to crop, the image could not be converted to an array and returned an Image object again:
image_arr = np.array(image)
print(image_arr)
#Output:
<PIL.Image.Imageimagemode=RGBsize=224x0at0x39E4F60>As your image dimensions were different from mine, I used different values for the 4-tuple passed to crop() and got an array:
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. 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.
Solution 2:
Now that you presented the real code you are actually using:
Image.open("path.jpg")returns<class 'PIL.JpegImagePlugin.JpegImageFile'>- after your cropping you get a return of
<class 'PIL.Image.Image'>
If you inspect your cropped image, you can see it only has one dimension, the second is 0:
If you fix your code to:
defconvert_pil_to_numpy_array(image_path):
# Load Image an open the imagefrom 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.
Solution 3:
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) / 255print(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 ]

Post a Comment for "Typeerror: Unsupported Operand Type(s) For /: 'image' And 'int'"