3
votes

Comment enregistrer des images PIL dans une boucle

J'essaie d'utiliser une fonction qui itère sur un bloc de données d'emplacements d'image et transforme ces images puis les enregistre dans le même répertoire.

Tête du datafram qui contient les images

Tête du datafram qui contient les images

La fonction que j'ai définie est la suivante:

def image_build(img, df):
    for index,row in df.iterrows():
        count = 1
        pic = row[img]
        if row['label'] == 0:
            im = Image.open(pic)
            enh = ImageEnhance.Contrast(im)
            im = enh.enhance(1.9)
            im = im.rotate(90)
            im = im.transpose(Image.FLIP_LEFT_RIGHT)
            im = im.resize((750, 500))
            save_dir = Path('N:/Users/Howell/Kaggle/X_Ray/chest_xray/train/NORMAL/')
            count2 = str(count)
            im.save(save_dir / str('new_image_'+count2+'.jpeg'))
            count += count + 1
            print(count)
        else:
            pass

Alors j'essaye pour utiliser cette fonction:

def image_build(img, df):
    for img in df[img]:
        count = 1

        if df['label'].any() == 0:
            print('pass_image')
            pic = df[img]
            im = Image.open(pic)
            enh = ImageEnhance.Contrast(im)
            img = enh.enhance(1.9)
            img = im.rotate(90)
            img = im.transpose(Image.FLIP_LEFT_RIGHT)
            img = im.resize(224, 224)
            save_dir = 'N:/Users/Howell/Kaggle/X_Ray/chest_xray/train/NORMAL/'
            img.save(save_dir / 'new_image_'+count+'.jpeg')
            count += 1

Mais j'obtiens l'erreur suivante:

> --------------------------------------------------------------------------- KeyError                                  Traceback (most recent call
> last)
> C:\ProgramData\Anaconda3\envs\tensorflowenvironment\lib\site-packages\pandas\core\indexes\base.py
> in get_loc(self, key, method, tolerance)    2656             try:
> -> 2657                 return self._engine.get_loc(key)    2658             except KeyError:
> 
> pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
> 
> pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
> 
> pandas/_libs/hashtable_class_helper.pxi in
> pandas._libs.hashtable.PyObjectHashTable.get_item()
> 
> pandas/_libs/hashtable_class_helper.pxi in
> pandas._libs.hashtable.PyObjectHashTable.get_item()
> 
> KeyError:
> WindowsPath('N:/Users/Howell/Kaggle/X_Ray/chest_xray/train/NORMAL/IM-0580-0001.jpeg')
> 
> During handling of the above exception, another exception occurred:
> 
> KeyError                                  Traceback (most recent call
> last) <ipython-input-144-d17ac9ecd789> in <module>
> ----> 1 image_build('image', train_data)
> 
> <ipython-input-143-cf988e867715> in image_build(img, df)
>       2     for img in df[img]:
>       3         count = 1
> ----> 4         pic = df[img]
>       5         if df['label'].any() == 0:
>       6             im = Image.open(df[img])
> 
> C:\ProgramData\Anaconda3\envs\tensorflowenvironment\lib\site-packages\pandas\core\frame.py
> in __getitem__(self, key)    2925             if self.columns.nlevels
> > 1:    2926                 return self._getitem_multilevel(key)
> -> 2927             indexer = self.columns.get_loc(key)    2928             if is_integer(indexer):    2929                 indexer = [indexer]
> 
> C:\ProgramData\Anaconda3\envs\tensorflowenvironment\lib\site-packages\pandas\core\indexes\base.py
> in get_loc(self, key, method, tolerance)    2657                
> return self._engine.get_loc(key)    2658             except KeyError:
> -> 2659                 return self._engine.get_loc(self._maybe_cast_indexer(key))    2660        
> indexer = self.get_indexer([key], method=method, tolerance=tolerance) 
> 2661         if indexer.ndim > 1 or indexer.size > 1:
> 
> pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
> 
> pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
> 
> pandas/_libs/hashtable_class_helper.pxi in
> pandas._libs.hashtable.PyObjectHashTable.get_item()
> 
> pandas/_libs/hashtable_class_helper.pxi in
> pandas._libs.hashtable.PyObjectHashTable.get_item()
> 
> KeyError:
> WindowsPath('N:/Users/Howell/Kaggle/X_Ray/chest_xray/train/NORMAL/IM-0580-0001.jpeg')

Je viens de découvrir Pillow donc je ne suis pas sûr de ce que je fais de mal.

Maintenant, j'ai changé la fonction pour la suivante et elle fonctionne sans erreur mais ne fait rien ... pas même l'instruction print .

image_build('image', train_data)


5 commentaires

Essayez ce nombre + = 1 au lieu de Count + = count +1 les deux sont différents car si vous voulez que votre compte soit incrémenté une fois à chaque itération, vous devez utiliser count + = 1


Merci @ChetanVashisth mais toujours la même erreur.


@Jordon Veuillez vérifier le chemin que vous avez défini pour vos images? Juste pour être sûr de ça


J'ai fait. Lorsque je sors la séquence d'images de la boucle et que je l'exécute sur train_data ['image'] [0] dans la commande Image.open () , cela fonctionne.


essayez le code ci-dessous si cela fonctionne bro @Jordon


4 Réponses :


-2
votes

Je pense que c'est le problème avec le chemin du fichier. remplacer / par \ (double barre oblique inverse) ou \


0 commentaires

0
votes

Essayez ceci si cela fonctionne:

def image_build(img, df):
    count = 1  #  define count here so that it do not get intialised for each iteration
    for img in df[img]:
        pic = df[img]
        if df['label'].any() == 0:
            im = Image.open('your_image_path')
            enh = ImageEnhance.Contrast(im)
            img = enh.enhance(1.9)
            img = im.rotate(90)
            img = im.transpose(Image.FLIP_LEFT_RIGHT)
            img = im.resize((224, 224))
            save_dir = 'your path'
            img.save(save_dir + 'new_image_'+'1'+'.jpeg')
            count += 1 


7 commentaires

KeyError: WindowsPath ('N: / Users / Howell / Kaggle / X_Ray / chest_xray / train / P‌ NEUMONIA / person1286_‌ bactéries_3249.jpeg')


dont je ne suis pas sûr de ce qu'il a choisi pour ce chemin car le label correspondant est 1 et non 0.


Vous souhaitez effectuer les différentes opérations sur les images puis les sauvegarder dans le même répertoire avec un nouveau nom non ?? C'est exactement ce que tu veux faire?


Essayez d'utiliser ce lien, il vous aidera sitepoint.com/...


Je pense que c'est peut-être ainsi que je fais l'instruction if . Voir la question mise à jour. Maintenant, il fonctionne sans erreur mais ne produit aucune image.


même erreur. C'est frustrant. Merci de vous en tenir à cela.


continuons cette discussion dans le chat .



1
votes

Vous utilisez à nouveau la même variable img

from PIL import Image, ImageEnhance

def image_build(img, df):
    for index,row in df.iterrows():
        count = 1
        pic = row[img]
        if row['label'] == 0:
            im = Image.open(pic)
            enh = ImageEnhance.Contrast(im)
            im = enh.enhance(1.9)
            im = im.rotate(90)
            im = im.transpose(Image.FLIP_LEFT_RIGHT)
            im = im.resize(224, 224)
            save_dir = 'N:/Users/Howell/Kaggle/X_Ray/chest_xray/train/NORMAL'
            im.save(f'{save_dir}/new_image_{count}.jpeg'))
            count += count + 1
            print(count)


6 commentaires

Je vous remercie. J'ai TypeError: l'objet 'WindowsPath' n'est pas en indice


en utilisant le même var img n'a pas d'importance bro j'ai exécuté le même code que j'ai posté et il fonctionne sans aucune erreur


-------------------------------------------------- ---------- ‌ --------------- AttributeError Traceback (dernier appel en dernier) dans - -> 1 image_build ('image', train_data) dans image_build (img, df) 5 count = 1 6 pic = row [img] ----> 7 if row ['label '] .any () == 0: 8 im = Image.open (pic) 9 enh = ImageEnhance.Contrast (im) AttributeError:' int 'l'objet n'a pas d'attribut' any '


-> 15 im.save (save_dir / 'new_image _' + count + '. Jpeg') 16 count + = count + 1 17 print (count) TypeError: type (s) d'opérande non pris en charge pour /: 'str' et 'str'


Ok @ SmartManoj. Je fais exécuter la boucle mais cela ne produit qu'une seule image dans le dossier. Voir mes modifications ci-dessus.


Merci SmartManoj. Je l'ai compris. Voyez ma réponse. Prenez le count = 1 en dehors de l'instruction for .



0
votes

D'accord. J'ai enfin compris! Déplacez le décompte avant les iterrows()

Edited

from PIL import Image, ImageEnhance

def image_build(img, df):
    count = 1
    for index,row in df.iterrows():
        pic = row[img]
        if row['label'] == 0:
            im = Image.open(pic)
            enh = ImageEnhance.Contrast(im)
            im = enh.enhance(1.9)
            im = im.rotate(90)
            im = im.transpose(Image.FLIP_LEFT_RIGHT)
            im = im.resize((750, 500))
            save_dir = Path('N:/Users/Howell/Kaggle/X_Ray/chest_xray/train/NORMAL/')
            count2 = str(count)
            im.save(save_dir + str('new_image_'+count2+'.jpeg'))
            count += count + 1
            print(count)
        else:
            pass


0 commentaires