[英]How to save PIL images in a loop
I'm trying to use a function that itterates over a data frame of image locations and transforms those images then saves them back in the same directory. 我正在尝试使用一个函数来迭代图像位置的数据帧并转换这些图像然后将它们保存回同一目录中。
Head of the datafram that holds the images 保存图像的datafram的头部
The function I defined is as follows: 我定义的函数如下:
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)
Then I try to use this function: 然后我尝试使用这个功能:
image_build('image', train_data)
But I'm getting the following error: 但是我收到以下错误:
> --------------------------------------------------------------------------- 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')
I've just discovered Pillow so I'm not sure what I'm doing wrong. 我刚刚发现Pillow,所以我不确定我做错了什么。
Now I'm changed the function to the following and it runs without error but does nothing...not even the print
statement. 现在我将函数更改为以下内容并且它运行时没有错误但什么也没做...甚至没有
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
With help from multiple people, the following runs but only produces one picture and gets stuck printing on count 3
. 在多人的帮助下,以下运行但仅生成一张图片并在第
3
上打印。
from PIL import Image, ImageEnhance 来自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
You use the same variable img again 您再次使用相同的变量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)
Try this if it works: 如果它有效,试试这个:
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
Ok. 好。 I finally got it!
我终于明白了! Move the count before the
iterrows()
在
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
I think this is the problem with the path of the file. 我认为这是文件路径的问题。 replace / with \\(double backslash) or \\
替换/用\\(双反斜杠)或\\
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.