多平台统一管理软件接口,如何实现多平台统一管理软件接口
686
2022-08-31
PIL简单使用(PIL官方文档)
PIL简单使用
在Python中进行图像处理有PIL、OpenCV等工具。
PIL简介
PIL是Python Imaging Library的简称,目前已经是Python生态系统中图像处理的标准库。
PIL只支持Python 2.x版本,目前支持Python 3.x的是社区在PIL的基础上Fork的版本,项目叫Pillow。
接口
图像读写
从文件中读取图像数据Image.open():提供了打开图像文件和读取图像数据的功能。
from PIL import Imagewith open("./img/hand1.png", "rb") as fp: im = Image.open(fp)
从压缩文件中读取图像数据TarIO():提供了tar文件的读取功能,不用解压缩就可以直接从tar文件中读取图像数据。
from PIL import Image, TarIOfp = TarIO.TarIO("enjoy.tar", "enjoy.jpg")im = Image.open(fp)
将图像数据保存为JPEG格式Image.save():提供了图像数据的保存功能,可以保存成所需要的图像格式。
import os, sysfrom PIL import Imagefor infile in sys.argv[1:]: f, e = os.path.splitext(infile) outfile = f + ".jpg" if infile ! = outfile: try: Image.open(infile).save(outfile) except IOError: print("cannot convert", infile)
生成图像缩略图有时会遇到图像数据过大导致出现内存或者显存溢出的问题。im.thumbnai : 提供了将图像制作成缩略图的功能,在不改变主要图像特征的情况下对图像进行缩略变换,以减小图像数据。
import os, sysfrom PIL import Image#初始化缩略图的尺寸 size = (128, 128)#逐个读取图像并生成缩略图保存 for infile in sys.argv[1:]: #初始化缩略图的保存路径 outfile = os.path.splitext(infile)[0] + ".jpg" if infile != outfile: try: #读取图像并进行缩略转换,最好保存缩略图 im = Image.open(infile) im.thumbnail(size) im.save(outfile, "JPEG") except IOError: print("cannot create thumbnail for", infile)
图像格式查询有时需要查看或者判别图像的格式,以防止出现因图像格式不一致引起的错误。im.format、im.size和im.mode分别提供了图像的格式、尺寸、色彩模式(RGB、L)信息的查询功能。
import sysfrom PIL import Imagefor infile in sys.argv[1:]: with Image.open(infile) as im: print(infile, im.format, "%dx%d" % im.size, im.mode)######./img/hand1.png PNG 720x705 RGB
图像截取使用im.crop对图像进行截取。
from PIL import Imagefile="./img/hand1.png"#读取图像数据 im=Image.open(file)#初始化截取图像的范围 box = (100,100, 300, 200)# box = (x1,y1, x2, y2)#完成图像的截取并保存图像 im2 = im.crop(box)im2.save("enjoy_region.jpeg", "JPEG")
图像显示
im.show()
from PIL import Imagefile="./img/hand1.png"im=Image.open(file)im.show()
图像尺寸变换
im.resize()提供了图像尺寸变换功能,可以按照需要变换源图像的尺寸。
im.rotate()提供了图像旋转功能,可以根据需要旋转不同的角度。
from PIL import Imagefile="./img/hand1.png"im=Image.open(file)im2 = im.resize((256,256)).rotate(90) #将图像重置为256px×256px,然后旋转90° im2.save("enjoy_rotate.jpeg", "JPEG")
像素变换
像素色彩模式变换可以通过convert()对图像进行灰度化处理这个函数提供了将图像进行像素色彩模式转换的功能,可以在支持的像素色彩格式间进行转换。
from PIL import Imagefile="./img/hand1.png"#将图像模式转换为灰度模式 im=Image.open(file).convert("L")im.save("enjoy_convert.jpeg", "JPEG")im.show()
滤波im.filter()提供了图像滤波的功能ImageFilter中定义了支持的滤波
BLURImageFilter.BLUR为模糊滤波CONTOURImageFilter.CONTOUR为轮廓滤波,将图像中的轮廓信息全部提取出来。DETAILImageFilter.DETAIL为细节增强滤波,会使得图像中细节更加明显。EDGE_ENHANCEImageFilter.EDGE_ENHANCE为边缘增强滤波,突出、加强和改善图像中不同灰度区域之间的边界和轮廓的图像增强方法。EDGE_ENHANCE_MOREImageFilter.EDGE_ENHANCE_MORE为深度边缘增强滤波,会使得图像中边缘部分更加明显。
from PIL import Imagefrom PIL import ImageFilterfile="./img/hand1.png"im=Image.open(file)im2 = im.filter(ImageFilter.BLUR)im2.save("enjoy_filter.jpeg", "JPEG")im2.show()
例子 -- 转换为CIFAR-10数据集格式
CIFAR-10数据集是8000万微⼩图⽚的标签⼦集, 由 6万张 32*32得彩色图片组成,一共有10个类别。每一个类别6000张图片。
每个二进制文件的第一个字节是标记,后面的32x32x3是图片,前32x32是red channel 接着的32x32是green channel,然后32x32是blue channel ,依次类推。
这里使用字典分别存储数据和标签。
import picklefrom PIL import Imageimport numpy as npimport osclass DictSave(object): def __init__(self, filenames, file): self.filenames = filenames self.file=file self.arr = [] self.all_arr = [] self.label=[] self.all_label=[] #定义图像输入函数 def image_input(self, filenames, file): for filename in filenames: self.arr, self.label = self.read_file(filename, file) if len(self.all_arr)==0: self.all_arr = self.arr self.all_label=self.label else: self.all_arr = np.concatenate((self.all_arr, self.arr)) self.all_label = np.concatenate((self.all_label, self.label)) #定义文件读取函数 def read_file(self, filename, file): im = Image.open(filename) #打开一个图像 #将图像的RGB分离 r, g, b = im.split() #将PILLOW图像转成数组 r_arr = np.array(r).ravel() g_arr = np.array(g).ravel() b_arr = np.array(b).ravel() #将3个一维数组合并成一个一维数组 arr = np.concatenate((r_arr, g_arr, b_arr)) label=[] for i in file: label.append(i[0]) return arr, label def pickle_save(self, arr, label): print ("正在存储") #构造字典,所有的图像数据都在arr数组里 contact = {'data': arr, 'label':label} f = open('data_batch', 'wb') pickle.dump(contact, f) #把字典保存到文本中 f.close() print ("存储完毕")if __name__ == "__main__": file_dir='./img/' L=[] F=[] for root, dirs, files in os.walk(file_dir): for file in files: if os.path.splitext(file)[1] == '.jpeg': L.append(os.path.join(root, file)) F.append(os.path.splitext(file)) ds = DictSave(L, F) ds.image_input(ds.filenames, ds.file) ds.pickle_save(ds.all_arr, ds.label) print ("最终数组的大小:"+str(ds.all_arr.shape))
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~