Python之PIL的一个实例应用
在做机器学习的图像预处理的时候遇到的一些问题和解决办法
from PIL import Image
from random import randint
import os,glob
img_path = glob.glob('..\Image/*.jpg') #图片的输入路径
img_output_path = ('..\Image_output') #图片处理过后的输出路径
temp = os.walk('..\Image/*.jpg') #用walk方法遍历 temp的类型为tuple
list = []
等比例缩放部分
def rescale(image): #等比例缩放
w = image.size[0] #获取长宽
h = image.size[1]
sizeMax = 320 #设置最大的长宽像素
sizeMin = 256 #最小的像素
random_size = randint(sizeMin, sizeMax) #随机像素大小
if w < h:
return image.resize((random_size, round(h / w * random_size))) #按照长宽比进行缩放
else:
return image.resize((round(w / h * random_size), random_size))
随机裁剪部分
def random_crop(image): #随机裁剪
w = image.size[0] #取长宽
h = image.size[1]
size = 227 #这里用的alex net 所以设为227*227
new_left = randint(0,w-size) #设置裁剪开始和结束的点
new_upper = randint(0,h-size)
return image.crop((new_left,new_upper,size + new_left,size+new_upper))
主程序部分
def def_test():
i = 0
for file in img_path: #遍历
print(file)
im = Image.open(file) #打开文件
im = rescale(im) #随机等比例缩放
im = random_crop(im) #随机裁剪
try: #因为这里的来源图像主要为jpg和png所以使用try-except
im.save('../Image_output/%s.jpg'%(list[i])) #保存图片
except:
im.save('../Image_output/%s.png'%(list[i])) #保存图片
print(list[i])
if i < len(img_path):
i = i+1
# im.show()
if __name__ == '__main__':
for filename in os.listdir('..\Image'): #对Image文件夹(此时为元祖对象)进行遍历
list.append(filename.split(".",1)[0])
def_test()
glob.glob()
返回所有匹配的文件路径列表(list)。它只有一个参数pathname,定义了文件路径匹配规则
这里可以是绝对路径,也可以是相对路径。
glob.iglob()
获取一个可编历对象,使用它可以逐个获取匹配的文件路径名。与glob.glob()的区别是:
glob.glob同时获取所有的匹配路径,而glob.iglob一次只获取一个匹配路径。这有点类似于.NET中操作数据库用到的DataSet与DataReader。
os.walk()
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
'''
top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
root 所指的是当前正在遍历的这个文件夹的本身的地址
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。
onerror -- 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。
followlinks -- 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。
'''
'''
os.walk 每次遍历的对象都是返回的是一个三元组(root,dirs,files)
root 所指的是当前正在遍历的这个文件夹的本身的地址
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
注:如果topdown 参数为真,walk 会遍历top文件夹,与top文件夹中每一个子目录。
'''