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

说说PIL图像处理库

时间:2023-03-26 00:43:12 Python

1,在Python中堪比PS。前言PIL是PythonImageLibrary的缩写。PIL库提供了很多处理图像的模块,可以像PS(Photoshop)一样进行编辑。例如:改变图像大小、旋转图像、图像格式转换、转换颜色通道、图像增强、直方图处理、插值和滤波等。PIL是第三方库,使用前需要先安装。pip安装pillow2。颜色模式在继续之前,我们先解释一个重要的概念:颜色模式。所谓颜色模式:指的是如何在计算机中模拟出现实世界中的各种颜色,或者准确的说,是一种颜色生成算法。常用的颜色模式:RGB:基本理论是将画面中每个像素的红(Red)、绿(Green)、蓝(Blue)三色系的不同分量组合起来,产生现实世界中的颜色.也可以说,我们在电脑上看到的RGB图片的颜色是由三个颜色分量组成的。或者说它有3个颜色通道。提示:我们在电脑上看到的大部分图片都是像素图片。像素图片的特点是整个图片由很多像素组成,每个像素都有自己的颜色。在RGB颜色模式下,计算机为红、绿、蓝分别分配了8位空间,也就是红、绿、蓝各自的分量从0到255不等(最大值由8位转换为十进制)之间。因此,电脑使用RGB色彩模式最多可以模拟出255X255X255种颜色,这应该足以让电脑展现出五光十色的真实世界。提示:RGBA是RGB颜色模型的增强版本。除了模拟颜色,还可以模拟透明度。A是Alpha的缩写,可以理解为透明度或透明度的意思。CMYK:C:Cyan=青色,又称'天蓝色'或'蓝色';M:Magenta=品红,又称‘品红’;Y:黄色=黄色;K:blacK=黑色。CMYK常用于模拟印刷品的颜色。它主要用于广告设计。可以使用PIL库的ImageColor模块的getColor()方法获取一种颜色的不同颜色分量值。fromPILimportImageColorred=ImageColor.getrgb("red")print(red)'''输出结果(255,0,0)'''提示:ImageColor模块内部维护了一个字典。getColor()方法以用户提供的颜色名称为键,在字典中查找对应的颜色,将其转换成元组返回。colormap={“aliceblue”:“#f0f8ff”,“antiquewhite”:“#faebd7”,“aqua”:“#00ffff”,“aquamarine”:“#7fffd4”,“azure”:“#f0ffff”,“beige”":"#f5f5dc","bisque":"#ffe4c4","black":"#000000","blanchedalmond":"#ffebcd",...}3.处理图片,主要使用PIL库Image模块(也有核心模块)。图片处理前请准备好3张图片(2张jpg格式,1张png格式)。提示:为方便操作,将图片存放在工程目录下,加载图片时使用相对路径说明。这是一张名为back_的图片,jpg这是一张名为狗的图片.jpg这是一张名为guo_ke.png的图片3.1打开图片的基本操作:在处理图片之前,必须先打开图片,可以使用open()图像模块中的方法打开。此方法返回PIL.Image.Image类型的对象。提示:本文不刻意区分函数和方法的概念,统称为方法。#原型defopen(fp,mode="r",formats=None):......open()方法特点:open()方法不会立即加载图像数据,只有在处理图像或调用将加载图像的load()方法。fromPILimportImage#open()方法具有惰性(延迟)加载的特点img=Image.open("back_.jpg")#立即加载图像数据img.load()open()方法参数说明:fp:设置为打开图像文件。它可以是由字符串描述的文件名,也可以是文件对象。fromPILimportImage#modemustbe"rb"file=open("dog.png",mode="rb")#fileobjectasaparameterimg=Image.open(file)mode:图片文件操作的模式,默认是“r”。如果设置,只能是“r”。formats:List或tuple类型,指定文件的打开格式,默认由方法自身判断。图片的一般属性:图片对象有几个常用的属性。mode:图像的颜色模式(RGB、CMYK、RGBA、L...)。不同颜色模式下图片的通道数会有所不同。格式:图像的格式(PNG、JPEG、GIF...)。JPEG图像没有A通道,因此JPEG图像没有透明度信息。PNG图像有一个透明的A通道。GIF图像格式有帧的概念。一张GIF图片实际上是由多张图片组成的,每张图片就是一帧。尺寸:图像尺寸。处理图像时,图像大小表示为二元组。fromPILimportImageimg=Image.open("dog.jpg",mode="r")print("图像颜色模式:",img.mode)print("图像格式:",img.format)print("Imagesize:",img.size)'''输出图片颜色模式:RGB图片格式:JPEG图片大小:(852,639)'''修改图片属性PIL.Image.Image对象提供方法用于修改属性图片的更改,例如更改大小、更改模式和更改格式。修改图片大小:可以使用图片对象的resize()方法来改变图片的大小。此方法的参数必须是2元组类型。*,返回图像的副本。提示:不是直接修改原图的大小(原图是r模式打开的)。类似于将原始图片按照给定尺寸插值后重新生成一张图片。#返回一个新的PIL.Image.Image对象img=img.resize((300,300))修改图片的颜色模式:可以使用image对象的conver()方法修改图片模式。可能的值范围:1、L、P、RGB、RGBA、CMYK、YCbCr、I、F。还返回图像的副本。1模式:黑白画面模式,每个像素只有两种颜色,黑色或白色。fromPILimportImageimg=Image.open("dog.jpg",mode="r")img1=img.convert('1')img.show()L模式:生成灰度图,每个像素的颜色会按L=R299/1000+G587/1000+B*114/1000重新计算。提示:当像素的RGB颜色分量相同时,组合为灰色。灰色系统有256级,从0到255。0表示黑色,255表示白色,从0到255,颜色逐渐由黑变白。#000黑色,#111,#222,#333...逐渐变成#FFF白色。灰度图像比黑白图像具有更丰富的色彩层次。fromPILimportImageimg=Image.open("dog.jpg",mode="r")img=img.convert('L')img.show()当使用RGBA模式转换为RGB模式时,只有将获得RGB颜色通道(透明度信息将被丢弃)。当从RGB模式转换为RGBA模式时。自动添加A通道,补值255fromPILimportImageimg=Image.open("dog.jpg",mode="r")print(img.mode)print(img.getpixel((1,1)))img=img.convert("RGBA")#使用getpixel()方法获取任意点的颜色模式print(img.getpixel((1,1)))print(img.mode)'''输出结果RGB(207,209,222)(207,209,222,255)RGBA'''保存图片。图片修改后,可以使用save()方法保存。defsave(self,fp,format=None,**params):save()方法的参数说明:fp:字符串或文件对象描述的文件名。format:指定图片保存时的格式(JPG、PNG...)。如果省略该参数,则由文件的扩展名决定。如果fp是一个文件对象,这个参数不能省略。参数:扩展参数。保存图片副本:除文件名外,其他数据信息相同。fromPILimportImageimg=Image.open("dog.jpg")img.save("dog_01.jpg")保存时修改图片格式:fromPILimportImage#原图格式为jpgimg=Image.open("dog.jpg")print("小狗.jpg图片的颜色模式:",img.mode)#保存图片的格式为pngimg.save("dog_02.png")img=Image.open("dog_02.png")print("Colormodeofdog_02.png:",img.mode)'''输出结果dog.jpgColormodeofpicture:RGBColormodeofdog_02.png:RGB'''提示:dog.jpg图片是在RGB模式下,虽然在保存时指定了PNG扩展名,但是系统不会添加A通道,dog_02.png图片的颜色模式仍然是RGB模式。以下代码会抛出异常:因为RGBA模式的图片无法保存为JPEG格式fromPILimportImage#png格式的图片有透明通道,颜色模式为RGBA.img=Image.open("guo_ke.png")print(img.mode)#jpg格式的图片没有透明通道img.save("guo_ke.jpg")'''输出结果为OSError:cannotwritemodeRGBAasJPEG'''3.2Transformation操作变换操作包括图像旋转和裁剪、复制和粘贴等一系列操作。rotate()方法:此方法使用角度值旋转图像并返回图像的副本。角度为正时逆时针旋转,为负时顺时针旋转。您可以通过调整角度水平或垂直翻转图片。fromPILimportImageimg=Image.open("dog.jpg")img=img.rotate(30)img.show()默认情况下,图片旋转后的空白处用黑色填充。您可以使用rotate()方法的fillcolor参数指定图像旋转后留下的空白区域的填充颜色。fromPILimportImageimg=Image.open("dog.jpg")img=img.rotate(-45,fillcolor="blue")img.show()可以使用rotate()方法的center参数调整中心点图片位置。fromPILimportImageimg=Image.open("dog.jpg")img=img.rotate(45,fillcolor="blue",center=(20,20))img.show()crop()方法:裁剪图片,在裁剪的时候,需要在原图像中确定一个需要保留的矩形区域。此方法返回图像的副本。fromPILimportImageimg=Image.open("dog.jpg")#4元组,前2个数字代表矩形的左上角,后2个数字代表矩形的右下角img=img.crop((0,0,400,400))img.show()中图像的坐标系,图像的左上角为原点,水平向右为正X轴,垂直向下为正轴。裁剪后的图片copy()方法:复制图片,返回与原图一模一样的副本。图片副本完全独立于原始图片,修改一张图片不会影响另一张图片。paste()方法:粘贴一张图片,可以将一张图片粘贴到另一张图片上。例如,在背景图片上粘贴一张小狗的图片。defpaste(self,im,box=None,mask=None):参数说明:im:要粘贴的图片(这里是小狗的图片)。box:粘贴图片的位置。box可以是一个2元组,这2个代表小狗图片左上角在背景图片上的位置。如果是4元组,则粘贴的图片(狗图)必须与4元组描述的矩形区域大小相同。mask:蒙版图片,最好是有透明度的,比如PNG图片。fromPILimportImage#打开背景图片back_img=Image.open("back_.jpg")#打开小狗图片dog_img=Image.open("dog.jpg")#修改小狗的大小dog_img=dog_img.resize((180,120))#copyimageback_copy_img=back_img.copy()#(300,200)or(300,200,480,320)back_copy_img.paste(dog_img,(300,200))back_copy_img.show()maskimageuse,maskimageonlyIt可以是“1”、“L”或“RGBA”模式的图片,遮罩图片和粘贴的图片大小必须一致。fromPILimportImage#打开背景图片back_img=Image.open("back_.jpg")#打开小狗图片dog_img=Image.open("dog.jpg")#修改小狗的大小dog_img=dog_img.resize((180,120))#复制图片back_copy_img=back_img.copy()#遮罩图片需要有透明度信息mask_img=Image.open("js.png")#修改遮罩图片大小与小狗图像mask_img=mask_img。resize((180,120))#粘贴back_copy_img.paste(dog_img,box=(300,200,480,320),mask=mask_img)back_copy_img.show()3.3合并颜色通道RGB颜色模式图片有3个颜色通道,RGBA颜色模式下的图像有3个颜色通道和1个透明度通道。可以使用split()方法将图片的颜色通道分开,然后根据需要重新排列颜色通道,得到不同效果的图片。分离小狗图像的颜色通道,并重新组合颜色通道。merge()方法创建一个具有指定颜色通道的新图像。fromPILimportImagedog_img=Image.open("dog.jpg")#分离颜色通道r,g,b=dog_img.split()#打乱颜色通道得到一张新图片,交换蓝色通道和红色通道dog_img=图片。merge(dog_img.mode,(b,g,r))dog_img.show()可以单独修改分离出来的颜色通道,修改后重新组合成一张新的图片。fromPILimportImagedog_img=Image.open("dog.jpg")#分离颜色通道r,g,b=dog_img.split()#修改每个颜色通道的像素值r=r.point(lambdai:i+10)g=r.point(lambdai:i*0.6)b=b.point(lambdai:i+100)dog_img=Image.merge(dog_img.mode,(r,g,b))dog_img代码下面的.show()使用getpixel()方法找到给定坐标值的每个点的颜色模式。然后重建每个像素的颜色模式。fromPILimportImagedog_img=Image.open("dog.jpg")w,h=dog_img.sizeforiinrange(w):forjinrange(h):#获取每个像素的颜色模式c=dog_img.getpixel((i,j))#修改每个像素点的颜色模式,红色被强调,绿色被减弱。dog_img.putpixel((i,j),(c[0]+100,c[1]-20,c[2]+30))dog_img.show()重新组织不同图片中的颜色通道,要求所有图片都相同的大小。fromPILimportImagedog_img=Image.open("dog.jpg")#分离颜色通道r,g,b=dog_img.split()img1=Image.open("guo_ke.png")#两张图片的大小为同样的img1=img1.resize(dog_img.size)#js.png颜色模式为rgbar1,g1,b1,a=img1.split()#混合两张图片的不同通道img=Image.merge("RGBA",(r1,g,b1,a))img.show()3.4滤镜和添加可以像PS一样给图片加滤镜,可以调整图片的对比度、色调等。ImageFilter模块提供了各种过滤对象,图片过滤后会返回一份图片。BLUR:模糊效果CONTOUR:轮廓效果DETAIL:细节效果EDGR_ENHANCE:边界增强效果EDGE_ENHANCE_MODE:阈值边界增强效果EMBOSS:浮雕效果FIND_EDGES:边界效果SMOOTH:平滑效果SMOOTH_MODE:阈值平滑效果SHARPEN:小狗图片加入锐化效果滤镜效果:fromPILimportImageFilterfromPILimportImagedog_img=Image.open("dog.jpg")#浮雕效果dog_img=dog_img.filter(ImageFilter.EMBOSS)dog_img.show()其他效果大家可以自己试试。ImageEnhance类提供修改图像对比度、色调等的对象。这些对象中的每一个都有一个enhance(factor)方法用于设置增强的强度。Color(im):调整色彩平衡Contrast(im):调整对比度Brightness(im):调整亮度Sharpness(im):调整锐度增强图像的高度:fromPILimportImageFilterfromPILimportImagefromPILimportImageEnhancedog_img=Image.open("dog.jpg")dog_img=dog_img.filter(ImageFilter.SHARPEN)#构建Brightness对象dog_img=ImageEnhance.Brightness(dog_img)#调用Brightness对象的enhance()设置增加值dog_img.enhance(2).show()4.总结本文介绍PIL库的ImageColor、Image、ImageFilter、ImageEnchance模块。此外,PIL中还有很多与图像处理相关的模块。有了这些模块,PS能做的几乎都可以做。还有一些图像处理的进阶应用,有空我会另创文章。