Je voulais convertir l'objet Image PIL en un tableau numpy. J'ai essayé d'utiliser les codes suivants en affichant une erreur
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
from PIL import Image image = Image.open(image_path) image = np.array(image) / 255
J'ai également essayé avec ce code image = np.array (image) / 255 il affiche la même erreur. (code ci-dessous)
from PIL import Image image = Image.open(image_path) image = np.asarray(image) / 255
Cette erreur se produit uniquement lorsque j'ai utilisé le code ci-dessus dans la fonction ci-dessous
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'
3 Réponses :
Cela fonctionne:
[[[ 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 ]
Résultat:
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)
Dans la fonction Il s'agit d'un objet Le problème réside dans les valeurs de tuple passées à la fonction convert_pil_to_numpy_array ()
, la variable image
utilisée initialement est différente de la variable image
qui stocke le crop objet ped
Image
. 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.
JpegImageFile
. Si vous regardez l'autre variable image
qui stocke l'image recadrée et est ensuite transmise à np.array
, cette variable est un objet du code Image > class:
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
crop ()
. Avec les valeurs de marge que vous avez transmises à crop
, l'image n'a pas pu être convertie en tableau et a renvoyé à nouveau un objet Image
: image_arr = np.array(image)
print(image_arr)
#Output:
<PIL.Image.Image image mode=RGB size=224x0 at 0x39E4F60>
Je ne vois pas comment votre code est meilleur. np.array (image)
devrait créer un tableau comme votre ligne. Ce n'est qu'après l'exécution que Python applique l'étape / 255
.
Je suis d'accord, je viens de tester le code d'OP et l'étape / 255
s'applique après. Mais exactement le même morceau de code fonctionne pour moi. Cette réponse suggère de vérifier si le tableau est créé en premier lieu et si c'est le cas, enregistrez-le dans une variable.
Maintenant que vous avez présenté le code réel que vous utilisez réellement:
Image.open ("path.jpg")
renvoie
Si vous inspectez votre image
recadrée, vous pouvez voir qu'elle n'a qu'une dimension, la seconde est 0:
Si vous corrigez votre code sur:
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
, le code s'exécute soudainement sans erreur.
Merci d'aider @patrich artner .... En fait, j'avais trouvé cette erreur et corrigé le code ...
@PatrickArtner En fait, je voulais convertir le type d'image en tableau numpy, puis diviser des éléments entiers dans ce tableau avec 255
stackoverflow.com/questions/384759/...
Copie possible de Comment convertir une image PIL en un numpy tableau?
Nan! Ce n'est pas la même chose ... j'ai essayé de ne pas travailler @TomRon
Cela fonctionne, j'ai testé avec une image de test .. pouvez-vous afficher l'erreur Traceback?
TypeError Traceback (dernier appel en dernier) dans () 1 image_path = 'test / 10 / image_07090.jpg' ----> 2 image = process_image (image_path) 3 imshow (image) dans process_image (chemin_image) 24 # normalize 25 print (type (image)) ---> 26 image = 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: type (s) d'opérande non pris en charge pour /: 'Image' et 'int'
@amanbQue diriez-vous de
imprimer (image)
d'abord et voir si vous obtenez un tableau en premier? Reportez-vous à ma réponse ci-dessous.Veuillez ajouter la trace formatée à la question; c'est presque illisible en tant que commentaire.
@chepner j'ai ajouté
@amanb Il est de type
après avoir fait cela
image_arr = np.array (image)
Votre traceback ne correspond pas à votre code; il fait référence à
np.array
, mais vous appeleznp.asarray
. Je m'attendrais à ce quenp.array
crée simplement un tableau qui contient une image comme élément unique, et non un tableau qui représente une image comme un tableau de pixels.ok, vient de modifier ma réponse. J'ai utilisé la fonction
array
maisasarray
fonctionne également.@amanb Les deux
np.array
etnp.asarray
donnent la même erreur. J'ai mentionné cela.Ma réponse explique le problème ... s'il vous plaît jeter un oeil. Ça marche.
np.asarray
est simplementnp.array
avec le jeu de paramètrescopy = False
. Cela ne devrait faire aucune différence ici.L'erreur Traceback montre la fonction
process_image ()
et une variableimage_arr
. Votre code ne les a pas.@amanb Veuillez jeter un œil à mon code ... J'ai ajouté une fonction là où ça ne marche pas
@KavinRajuS, vient de modifier ma réponse. J'espère que cela t'aides.