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 celaimage_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.arraycré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
arraymaisasarrayfonctionne également.@amanb Les deux
np.arrayetnp.asarraydonnent 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.asarrayest simplementnp.arrayavec 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.