Как сохранить изображения PIL в цикле - PullRequest
3 голосов
/ 21 мая 2019

Я пытаюсь использовать функцию, которая выполняет итерации по фрейму данных местоположений изображений и преобразует эти изображения, а затем сохраняет их обратно в том же каталоге.

Заголовок таблицы данных, в которой хранятся изображения

Head of the datafram that holds the images

Определенная мною функция выглядит следующим образом:

from PIL import Image, ImageEnhance

def image_build(img, df):
    for img in df[img]:
        count = 1
        pic = df[img]
        if df['label'].any() == 0:
            im = Image.open(df[img])
            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(save_dir/'new_image_'+count+'.jpeg')
            count += count + 1
            print(count)

Затем я пытаюсь использовать эту функцию:

image_build('image', train_data)

Но я получаю следующую ошибку:

> --------------------------------------------------------------------------- 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')

Я только что обнаружил Подушку, поэтому я не уверен, что делаю неправильно.

Теперь я изменил функцию на следующую, и она работает без ошибок, но ничего не делает ... даже оператор print.

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

С помощью нескольких людей,следующие запуски, но производят только одно изображение и застревают при печати 3.

из 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((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

Ответы [ 4 ]

1 голос
/ 21 мая 2019

Вы снова используете ту же переменную 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)
0 голосов
/ 21 мая 2019

Хорошо.Я наконец получил это!Переместите счет до iterrows()

Отредактировано

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 голосов
/ 21 мая 2019

Попробуйте, если это работает:

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 
0 голосов
/ 21 мая 2019

Я думаю, что это проблема с путем файла. заменить / на \ (двойной обратный слеш) или \

...