当前位置: 首页 > 后端技术 > Python

Python图像处理库:学会Pillow,不再需要PS

时间:2023-03-25 23:16:43 Python

Python数据分析中,最常用的两种数据文件是Excel和csv文件。当然,如果数据量比较大,数据库是必不可少的。在本文中,我们不讨论数据库的知识点。我们为大家带来的是对数据文件csv的操作。CSV文件CSV文件:Comma-SeparatedValues,中文称为逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。可以理解为一个表格,只不过这个表格是以纯文本的形式展示的,单元格之间默认用逗号分隔;每行数据由换行符分隔。像这样一个文件:name,age,scorezhangsan,18,98lisi,20,99wangwu,17,90jerry,19,95csv文件写入列表数据。Python中的csv模块提供了相应的函数,可以让我们方便的读写csv文件。#首先导入csvimportcsv#数据写入csv文件records=[['April01','17:00','IGPKRA'],['April02','17:00','苏州LGNPKSN'],['4月03日','17:00','FPXPKRA'],['4月04日','17:00','SNPK西安WE'],['4月05日','17:00','北京JDGPKFPX'],['April06','17:00','SNPKTES']]#写打开csv文件的方式用open('electronic_sports.csv','w')asstream:#调用writer方法,传入csv文件对象,结果是一个CSVWriter对象writer=csv.writer(stream)#调用CSVWriter对象的writerow方法,写入数据行bylineforrecordinrecords:writer.writerow(record)写的时候中文可能出现乱码。解决办法是用openutf-8'打开??时加一个关键字参数encoding=':open('electronic_sports.csv','w',encoding='utf-8'),但是写入的数据输入如下(注意windows操作系统文件的格式是在一行):windows系统的换行问题也需要在open中添加一个newline=""关键字参数。即open('electronic_sports.csv','w',encoding='utf-8',newline="")另一种更简单的写多行的方法是调用writerows()方法,这样你就不用需要使用循环来遍历每一行。#首先导入csvimportcsv#数据写入csv文件records=[['April01','17:00','IGPKRA'],['April02','17:00','苏州LGNPKSN'],['4月03日','17:00','FPXPKRA'],['4月04日','17:00','SNPK西安WE'],['4月05日','17:00','北京JDGPKFPX'],['April06','17:00','SNPKTES']]#写打开csv文件的方式用open('electronic_sports.csv','w')asstream:#调用writer方法,传入csv文件对象,结果是一个CSVWriter对象writer=csv.writer(stream)#调用CSVWriter对象的writerow方法,写入数据行通过writer.writerows(records)csv文件写入字典数据如果我们操作的数据是字典格式,例如:records=[{'date':'April01','time':'17:00','adversary':'IGPKRA'},{'date':'April01','time':'17:00','adversary':'IGPKRA'},{'date':'April02','time':'18:00','adversary':'苏州LGNPKSN'},{'date':'4月03日','time':'17:00','adversary':'SNPK西安WE'},{'日期':'4月04日','时间':'16:00','adversary':'北京JDGPKFPX'},{'date':'4月05日','time':'19:00','adversary':'SNPKTES'}]We需要改变写入方式:#首先importcsvimportcsv#将数据写入csv文件records=[{'date':'April01','time':'17:00','adversary':'IGPKRA'},{'date':'April01','time':'17:00','adversary':'IGPKRA'},{'date':'4April02','time':'18:00','adversary':'苏州LGNPKSN'},{'date':'4月03日','time':'17:00','adversary':'SNPK西安WE'},{'date':'4月04日','time':'16:00','adversary':'北京JDGPKFPX'},{'date':'4月05日','time':'19:00','adversary':'SNPKTES'}]#打开一个用于写入的csv文件open('electronic_sports.csv','w',encoding='utf-8',newline="")asstream:#调用writer方法,传入csv文件对象,结果为CSVWriter对象writer=csv.DictWriter(stream,fieldnames=['date','time','adversary'])#Writeheadercontentwriter.writeheader()forrecordinredords:#调用CSVWriter对象的writerow方法逐行写入数据。writer.writerows(record)office打开如图所示如图:csv文件读取操作我们也可以读取一个csv文件的内容,但是使用的方法是reader(),这个方法返回的结果是一个generatorreader对象,所以需要遍历输出importcsv#通过读取打开一个csv文件withopen('electronic_sports.csv','r')asstream:#调用csv模块的reader方法,结果是一个可迭代对象reader=csv.reader(stream)#遍历结果,获取结果中的每一行数据forrowinreader:print(row)字典的读取类似,只是遍历的时候需要通过row获取。importcsvwithopen('electronic_sports1.csv','r')ascsvfile:reader=csv.DictReader(csvfile)print(reader)forrowinreader:print(row['date'],row['time'],row['adversary'])Pillow图像操作Pillow是第三方库,所以需要单独下载:pipinstallpillowPillow库安装成功后,我们就可以对图像进行各种处理,比如裁剪,旋转等等。导入包时,使用PIL导入它们,而不是pillow或Pillow。importPILfromPILimportImage在Pillow库中,除了20多个模块外,还支持非常多的插件。最常用的是Image模块,其他很多模块都是在Image模块的基础上对图像进行进一步的特殊处理,Image模块会导入部分以供使用。我们对图片的操作离不开Image模块。当然,ImageColor、ImageDraw、ImageFont在运行过程中也是必不可少的,离不开的。Image模块常用方法:1.导入和简单文件读取,是图像模块中的一个函数。如果图片和当前代码在同一个目录下,可以只写图片的文件名,其他情况需要拼接图片的路径。模式默认为“r”。下面我们通过代码打开刘亦菲的图片看看。#Step1:ImportfromPILimportImage#Step2:打开图片im=Image.open("LiuYifei.jpg")#Step3:显示图片im.show()image对象经常配合show方法打开图片:show()方法:调用图片显示软件打开图片。打开后程序会被屏蔽,需要手动关闭(即弹出的框需要手动关闭)如果需要查看。图片大小、格式等属性可以通过图片对象查看,比如上面刘亦菲的照片。#Step1:ImportfromPILimportImage#Step2:打开图片im=Image.open("刘亦菲.jpg")print('size:',im.size)print('mode:',im.mode)print('format:',im.format)其中,属性:size属性是一个元组,表示图像的宽高(以像素为单位)。format属性定义图像的格式。如果图片不是从文件打开的,那么属性值为None;mode属性是表示图像的模式,常用的模式有:L为灰度图,RGB为真彩色,CMYK为印前图像。convert()函数模式转换需要用到convert('对应模式'),代码如下:fromPILimportImage#只是演示几种模式进行对比image=Image.open("刘亦菲.jpg")print(image.mode)image1=image.convert('1')print(image1.mode)#image1.show()image_l=image.convert('L')print(image_l.mode)#image_l.show()image_p=图片.convert('P')print(image_p.mode)image_p.show()image_p=image.convert('HSV')print(image_p.mode)image_p.show()image_p=image.convert('RGB')print(image_p.mode)image_p.show()convert(self,mode=None,matrix=None,dither=None,palette=WEB,colors=256):将图像转换为指定模式,并返回转换后的副本图像。如果未指定模式,则会自动选择保留有关图像的所有信息且不使用调色板的模式(通常的结果是不进行转换)。mode就是我们要转换的模式,例如:mode='L',mode='RGB'等矩阵,变换矩阵。传入该参数时,需要传入一个由浮点数组成的元组,元组的长度为4或12。矩阵只支持几种模式转换为'L'或'RGB'。new()函数,除了打开一个已经存在的图片,我们还可以使用new来创建一个新的图片对象。new(mode,size,color=0):创建一个图片(canvas)进行绘图,是Image模块中的一个函数。1.mode,图片的模式,如“RGB”(红绿蓝三基色的缩写,真彩图像),“L”(灰度,黑白图像)等2.size,图片的大小。是一个长度为2的元组(width,height),表示像素大小。3.color,图片的颜色,默认值为0表示黑色。可以传入长度为3的元组来表示颜色,也可以传入颜色的16进制值。1.1.4版本之后,也可以直接传入颜色的英文单词,比如(0,0,255)可以换成'#0000FF'或者'blue',都代表蓝色。fromPILimportImageimage=Image.new('RGB',(220,150),(65,122,255))image.show()此时显示的是如下图(图片后查看器打开看):可以和new()结合使用的是绘图。比如我们常用的随机验证码就是用这个抽取的。但是在绘图过程中,我们会用到ImageDraw模块、ImageFont、ImageFilter模块等。一起来看看吧(代码有点长~~~)!importrandomfromPILimportImagefromPILimportImageDraw,ImageFont,ImageFilterdefget_color():red=random.randint(0,256)green=random.randint(0,256)blue=random.randint(0,256)n(红色,返回绿色,蓝色)defget_code(lenght):s='1234567890qwertyuiopasdfghjklzxcvbnmqwertyuopasdfghjklzxxcvbnmwidth=120height=40image_size=(width,height)#定义画布image=Image.new('RGB',image_size,get_color())#定义画笔draw=ImageDraw.Draw(image)#生成验证码get_code()#指定字体和字号,指定使用的字体tahoma.ttf,是从windows的字体中复制过来的字体。myfont=ImageFont.truetype(font='tahoma.ttf',size=30)#一个一个地绘制验证码字符foriinrange(4):#每绘制一个字符,x轴的位置需要改变,改变y轴的位置改变distance_x=random.randint(30*i,30*i+5)#[0,10]distance_y=random.randint(0,5)draw.text((distance_x,distance_y),code[i],font=myfont,fill=get_color())#绘制干扰线foriinrange(10):#指定开始和结束位置begin=(random.randint(0,width),random.randint(0,height))end=(random.randint(0,width),random.randint(0,height))#使用画笔绘制起点和终点位置,通过指定颜色filldraw.line((begin,end),fill=get_color())#绘制干扰点foriinrange(20):draw.point((random.randint(0,width),random.randint(0,height))),fill=get_color())#滤镜,边界增强image=image.filter(ImageFilter.EDGE_ENHANCE_MORE)代码中使用了image.show():PIL.ImageDraw.Draw(im,mode=None)创建一个可用于绘制给定图像的对象。参数im--要绘制的图像。mode–用于颜色值的可选模式。对于RGB图像,此参数可以是RGB或RGBA(将图形混合到图像中)。对于所有其他模式,此参数必须与图像模式相同。如果省略,模式默认为图像的模式。PIL.ImageFont.load(filename)从文件或类文件对象加载TrueType或OpenType字体,然后创建字体对象。此函数从给定文件或类文件对象加载字体对象,并为给定大小的字体创建字体对象。参数font——包含TrueType字体的文件名或类文件对象。如果在此文件名中找不到文件,加载程序还可以在其他目录中搜索,例如Windows上的fonts/目录或/Library/Fonts/、/System/Library/Fonts/和~/Library/Fonts/关于MaOS.size——请求的大小,以磅为单位。ImageFilter模块包含一组预定义的滤镜定义,例如cropcrop和zoomresizecrop(box=None)带有一组预定义的图像增强滤镜:裁剪图像并返回裁剪区域的图像。box表示裁剪区域,传入一个长度为4的元组(x0,y0,x1,y1),不传则默认复制原图。如果裁剪后的区域超过了原图的区域,超出部分会被像素网格填充。resize(size,resample=BICUBIC,box=None,reducing_gap=None):调整图像大小并返回调整后图像的副本。fromPILimportImageimage=Image.open("刘亦菲1.jpg")print(image.size)image_crop=image.crop(box=(300,300,800,700))image_crop.show()print('调整大小前:',image.size)image_resize=image.resize((350,350),resample=Image.LANCZOS,box=(70,35,460,345),reducing_gap=5.0)print('调整大小后:',image_resize.size)image_resize.show()比较图:旋转并保存图像rotate(angle,resample=NEAREST,expand=0,center=None,translate=None,fillcolor=None):旋转图像并返回旋转后的图像副本。有6个参数。角度,旋转的角度。该参数为必填参数,按角度系统计算,逆时针方向旋转。resample,resample,是一个可选的resample过滤器。可以传入Image.NEAREST、Image.BILINEAR、Image.BICUBIC(三个依次递增,越来越清晰)。默认是Image.NEAREST图片不是很清晰。扩展,可扩展性。为布尔值传入数字0或1,默认为0。如果值为0,则图像旋转后,返回图像的大小与原始图像大小相同。如果该值为1,则旋转后,返回图片的大小会根据旋转角度自动调整(如果旋转中心保持默认且不做平移,返回图片中可以看到完整的原图)。中心,旋转的中心。传入一个长度为2的元组(x,y),代表旋转中心的像素点。默认为原始图像的几何中心。翻译,要翻译的坐标。传入一个长度为2的元组(x,y),将原图平移(x,y)。默认值为(0,0)。填充颜??色,填充颜色。fromPILimportImagegirl=Image.open('刘亦菲1.jpg')girl=girl.resize((375,470))image=girl.rotate(15,resample=Image.BICUBIC,center=(150,210),expand=1,translate=(30,30),fillcolor='#E4C8C4')#print(image.size)image.show()除了使用show(),我们还可以使用save()进行本地化保存.将此图像保存在给定的文件名下。如果未指定格式,则可以根据文件扩展名确定要使用的格式(如果可能)。Image.save(fp,format=None,**params)fp–文件名(字符串),pathlib.path对象或文件对象。格式——可选的格式覆盖。如果省略,则使用的格式由文件扩展名决定。如果使用文件对象而不是文件名,则应始终使用此参数。params——图像编写器的额外参数。image.save('savepath')除了旋转,我们还可以进行转置和翻转transpose(method):对图像进行转置或翻转,返回一个转置图像的副本。方法可以传入Image.FLIP_LEFT_RIGHT(左右转置)、Image.FLIP_TOP_BOTTOM(上下转置)、Image.ROTATE_90(旋转90度)、Image.ROTATE_180(旋转180度)、Image.ROTATE_270(旋转270度)),Image.TRANSPOSE(左右反转并逆时针旋转90度),Image.TRANSVERSE(左右反转并顺时针旋转90度)。这些方法都是旋转90度和翻转结合的结果。fromPILimportImageimage=Image.open("刘亦菲1.jpg")image1=image.transpose(Image.FLIP_LEFT_RIGHT)image1.show()image2=image.transpose(Image.FLIP_TOP_BOTTOM)image2.show()image3=image.transpose(Image.ROTATE_180)image3.show()image4=image.transpose(Image.TRANSVERSE)image4.show()image4=image.transpose(Image.TRANSPOSE)image4.show()最后,处理后的图片被保存。更多Python技术干货,欢迎关注gzh【Python编程学习圈】,海量资料免费获取!