4
votes

TypeError: type (s) d'opérande non pris en charge pour /: 'Image' et 'int'

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'


18 commentaires

@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' @amanb


Que 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 appelez np.asarray . Je m'attendrais à ce que np.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 mais asarray fonctionne également.


@amanb Les deux np.array et np.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 simplement np.array avec le jeu de paramètres copy = False . Cela ne devrait faire aucune différence ici.


L'erreur Traceback montre la fonction process_image () et une variable image_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.


3 Réponses :


2
votes

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)


0 commentaires

3
votes

Dans 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.

Il s'agit d'un objet 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

Le problème réside dans les valeurs de tuple passées à la fonction 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>


2 commentaires

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.



2
votes

Maintenant que vous avez présenté le code réel que vous utilisez réellement:

  • Image.open ("path.jpg") renvoie
  • après votre recadrage, vous obtenez un retour de

Si vous inspectez votre image recadrée, vous pouvez voir qu'elle n'a qu'une dimension, la seconde est 0:

 Image du débogueur a>

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.


1 commentaires

Merci d'aider @patrich artner .... En fait, j'avais trouvé cette erreur et corrigé le code ...