最全Pillow(PIL)入门教程(非常详细)_python pillow 教程,阿里面试题和答案

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


图像显示结果如下:


![pillow image类使用](https://img-blog.csdnimg.cn/img_convert/27e1ff8d3a5dba6a659136a1978e87c9.png)  
 图1:显示结果


### new()


使用 Image 类提供的 new() 方法可以创建一个新的 Image 对象,语法格式如下:



im=Image.new(mode,size,color)


参数说明如下:


* mode:图像模式,字符串参数,比如 RGB(真彩图像)、L(灰度图像)、CMYK(色彩图打印模式)等;
* size:图像大小,元组参数(width, height)代表图像的像素大小;
* color:图片颜色,默认值为 0 表示黑色,参数值支持(R,G,B)三元组数字格式、颜色的十六进制值以及颜色英文单词。


示例如下:



#使用颜色的十六进制格式
im_1=Image.new(mode=‘RGB’,(260,100),color=“#ff0000”)
im_1.show()


输出图像如下所示:


![pillow new()](https://img-blog.csdnimg.cn/img_convert/d3101f526ffab7e1cbad9260c0016f5b.gif)  
 图2:显示结果


## Pillow Image对象属性


Image 对象有一些常用的基本属性,这些属性能够帮助我们了解图片的基本信息,下面对这些属性做简单的讲解:


##### 1) size:查看图像的尺寸



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
#打印image对象
print(im)
#查看尺寸
print(“宽是%s高是%s”%(im.width,im.height))
#或者通过size查看
print(“图像的大小size:”,im.size)


输出结果:



<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=455x191 at 0x381C750>
宽是455高是191
图像的大小size: (455, 191)


##### 2) format:查看图片的格式



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
print(“图像的格式:”,im.format)


输出结果:



图像的格式: PNG


##### 3) readonly:图片是否为只读



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
print(“图像是否为只读:”,im.readonly)


该属性的返回为 0 或者 1,分别对应着是和否,输出结果如下:



图像是否为只读: 1


##### 4) info:查看图片相关信息



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)

包括了每英寸像素点大小和截图软件信息

print(“图像信息:”,im.info)


该属性的返回值为字典格式,输出结果如下:



图像信息: {‘dpi’: (96, 96), ‘Software’: ‘Snipaste’}


##### 5) mode:图像模式



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
print(“图像模式信息:”,im.mode)


输出结果:



图像的模式: RGBA


上述涉及了许多图片模式的名称,比如 RGB、RGBA 等,下面对常用的图片模式做简单的总结,如下表所示:




| mode | 描述 |
| --- | --- |
| 1 | 1 位像素(取值范围 0-1),0表示黑,1 表示白,单色通道。 |
| L | 8 位像素(取值范围 0 -255),灰度图,单色通道。 |
| P | 8 位像素,使用调色板映射到任何其他模式,单色通道。 |
| RGB | 3 x 8位像素,真彩色,三色通道,每个通道的取值范围 0-255。 |
| RGBA | 4 x 8位像素,真彩色+透明通道,四色通道。 |
| CMYK | 4 x 8位像素,四色通道,可以适应于打印图片。 |
| YCbCr | 3 x 8位像素,彩色视频格式,三色通道。 |
| LAB | 3 x 8位像素,L \* a \* b颜色空间,三色通道 |
| HSV | 3 x 8位像素,色相,饱和度,值颜色空间,三色通道。 |
| I | 32 位有符号整数像素,单色通道。 |
| F | 32 位浮点像素,单色通道。 |


## Pillow图片格式转换


Pillow 库支持多种图片格式,您可以直接使用 open() 方法来读取图片,并且无须考虑图片是何种类型。同时,Pillow 能够很轻松地实现图片格式之间的转换。


图片格式之间的转换主要有以下两种方法,下面分别对它们进行了介绍:


### save()


顾名思义,save() 方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片。save() 的语法格式如下:



Image.save(fp, format=None)


参数说明如下:


* fp:图片的存储路径,包含图片的名称,字符串格式;
* format:可选参数,可以指定图片的格式。


示例如下:



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
im.save(‘C:/Users/Administrator/Desktop/c.biancheng.net.bmp’)


此时您的计算机桌面上会存在一个 c.bianchneg.net.BMP格式的图片。


### convert()+save()


注意,并非所有的图片格式都可以用 save() 方法转换完成,比如将 PNG 格式的图片保存为 JPG 格式,如果直接使用 save() 方法就会出现以下错误:



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
im.save(‘C:/Users/Administrator/Desktop/c.biancheng.net.jpg’)


错误信息如下所示:



#系统错误,RGBA不能作为JPEG图片的模式
OSError: cannot write mode RGBA as JPEG


引发错误的原因是由于 PNG 和 JPG 图像模式不一致导致的。其中 PNG 是四通道 RGBA 模式,即红色、绿色、蓝色、Alpha 透明色;JPG 是三通道 RGB 模式。因此要想实现图片格式的转换,就要将 PNG 转变为三通道 RGB 模式。


Image 类提供的 convert() 方法可以实现图像模式的转换。该函数提供了多个参数,比如 mode、matrix、dither 等,其中最关键的参数是 mode,其余参数无须关心。语法格式如下:



convert(mode,parms**)


* mode:指的是要转换成的图像模式;
* params:其他可选参数。


修改后的代码如下所示:



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
#此时返回一个新的image对象,转换图片模式
image=im.convert(‘RGB’)
#调用save()保存
image.save(‘C:/Users/Administrator/Desktop/c.biancheng.net.jpg’)


通过以上代码,成功将 PNG 格式的图片转换为了 JPG 格式。


## Pillow图像缩放操作


在图像处理过程中经常会遇到缩小或放大图像的情况,Image 类提供的 resize() 方法能够实现任意缩小和放大图像。


resize() 函数的语法格式如下:



resize(size, resample=image.BICUBIC, box=None, reducing_gap=None)


参数说明:


* size:元组参数 (width,height),图片缩放后的尺寸;
* resample:可选参数,指图像重采样滤波器,与 thumbnail() 的 resample 参数类似,默认为 Image.BICUBIC;
* box:对指定图片区域进行缩放,box 的参数值是长度为 4 的像素坐标元组,即 (左,上,右,下)。注意,被指定的区域必须在原图的范围内,如果超出范围就会报错。当不传该参数时,默认对整个原图进行缩放;
* reducing\_gap:可选参数,浮点参数值,用于优化图片的缩放效果,常用参数值有 3.0 和 5.0。


注意,resize() 会返回一个新的 image 对象。下面是一组对图像进行放大操的示例:



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
try:
#放大图片
image=im.resize((550,260))
#将新图像保存至桌面
image.save(“C:/Users/Administrator/Desktop/放大图像.png”)
print(“查看新图像的尺寸”,image.size)
except IOError:
print(“放大图像失败”)


输出结果:



查看新图像的尺寸 (550, 260)


放大后的图片效果。如下所示:


![pilloe缩放图像](https://img-blog.csdnimg.cn/img_convert/8a2b572c81aa85e5a9485e45721a0493.png)  
 图1:pillow放大图像


对图片的局部位置进行放大,示例如下:



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
try:
#选择放大的局部位置,并选择图片重采样方式
# box四元组指的是像素坐标 (左,上,右,下)
#(0,0,120,180),表示以原图的左上角为原点,选择宽和高分别是(120,180)的图像区域
image=im.resize((550,260),resample=Image.LANCZOS,box=(0,0,120,180))
image.show()
#保存
image.save(“C:/Users/Administrator/Desktop/放大图像.png”)
print(“查看新图像的尺寸”,image.size)
except IOError:
print(“放大失败”)


图片的放大效果如下所示:


![pillow图片处理操作](https://img-blog.csdnimg.cn/img_convert/8918f5db1ed0d137a45c92c6e50dd8f8.png)  
 图2:局部放大操作


### 创建缩略图


缩略图(thumbnail image)指的是将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览。


Image 对象提供了一个 thumbnail() 方法用来生图像的缩略图,该函数的语法格式如下:



thumbnail(size,resample)


* size:元组参数,指的是缩小后的图像大小;
* resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是 Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC。


使用示例如下:



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
im.thumbnail((150,50))
print(“缩略图尺寸”,im.size)
#将缩略图保存至桌面
im.save(“C:/Users/Administrator/Desktop/th.png”)


输出结果:



缩略图尺寸 (118, 50)


注意,缩略图的尺寸可能与您指定的尺寸不一致,这是因为 Pillow 会对原图像的长、宽进行等比例缩小,当指定的尺寸不符合图像的尺寸规格时,缩略图就会创建失败, 比如指定的尺寸超出了原图像的尺寸规格。


### 批量修改图片尺寸


在图像处理过程中,对于某些不需要精细处理的环节,我们往往采用批量处理方法,比如批量转换格式,批量修改尺寸,批量添加水印,批量创建缩略图等,这是一种提升工作效率的有效途径,它避免了单一、重复的操作。通过 Pillow 提供的 Image.resize() 方法可以批量地修改图片尺寸,下面看一组简单的示例。


首先找一些类型相同,但尺寸不一的图片,并把它们放入桌面的 image01 文件夹中。如下所示:


![批量处理图片](https://img-blog.csdnimg.cn/img_convert/e4e95496137de36096c9a2669a3b9c97.gif)  
 图3:待处理的图片


下面开始编写代码:



批量修改图片尺寸

import os
from PIL import Image
#读取图片目录
fileName = os.listdir(‘C:/Users/Administrator/Desktop/image01/’)
print(fileName)
#设定尺寸
width = 350
height = 350

如果目录不存在,则创建目录

if not os.path.exists(‘C:/Users/Administrator/Desktop/NewImage/’):
os.mkdir(‘C:/Users/Administrator/Desktop/NewImage/’)

循环读取每一张图片

for img in fileName:
old_pic = Image.open(‘C:/Users/Administrator/Desktop/image01/’ + img)
new_image = old_pic.resize((width, height),Image.BILINEAR)
print (new_image)
new_image.save(‘C:/Users/Administrator/Desktop/NewImage/’+img)


输出结果如下所示:



[‘向日葵.jpg’, ‘国宝.jpg’, ‘矩形图.jpg’, ‘蝴蝶.jpg’]
<PIL.Image.Image image mode=RGB size=350x350 at 0x2B9E670>
<PIL.Image.Image image mode=RGB size=350x350 at 0x31D0C90>
<PIL.Image.Image image mode=RGB size=350x350 at 0x2B90DB0>
<PIL.Image.Image image mode=RGB size=350x350 at 0x31D0C90>


NewImage 目录的内容如下:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/e3a98fb70c68b5419a22c7766e26bdf0.gif)  
 图4:处理完成的图片


## Pillow图像分离与合并


我们知道,图像(指数字图像)由许多像素点组成,像素是组成图像的基本单位,而每一个像素点又可以使用不同的颜色,最终呈现出了绚丽多彩的图像。在《[Pillow Image对象属性]( )》一节,我们介绍一些图片模式,它们的本质就是图片呈现颜色时需要遵循的规则,比如 RGB、RGBA、CYMK 等,而图像的分离与合并,指的就是图像颜色的分离和合并。


Image 类提供了用于分离图像和合并图像的方法 split() 和 merge() 方法,通常情况下,这两个方法会一起使用。


### split()


split() 的使用方法比较简单,用来分离颜色通道。我们使用它来处理蝴蝶图片:


![pillow分离图片](https://img-blog.csdnimg.cn/img_convert/e55b36bd07e720990d62843f309eddab.png)  
 图1:pilow 图像处理操作


代码如下所示:



im=Image.open(“C:/Users/Administrator/Desktop/1.jpg”)
#修改图像大小,以适应图像处理
image=im.resize((450,400))
image.save(“C:/Users/Administrator/Desktop/2.jpg”)
#分离颜色通道,产生三个 Image对象
r,g,b = image.split()
r.show()
g.show()
b.show()


输出的结果,依次展示如下:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/20f6e0f8d3bb52a52cbacd51cf13d214.gif)  
 图2:分离结果预览


### merge()


Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像。


merge() 方法的语法格式如下:



Image.merge(mode, bands)


参数说明如下:


* mode:指定输出图片的模式
* bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)。


注意,该函数会返回一个新的 Image 对象。


下面对图像合并的两种类型分别进行介绍:


一. 单个图像的合并指的是将颜色通道进行重新组合,从而得到不一样的图片效果,代码如下所示:



from PIL import Image
im=Image.open(“C:/Users/Administrator/Desktop/1.jpg”)
#修改图像大小,以适应图像处理
image=im.resize((450,400))
image.save(“C:/Users/Administrator/Desktop/2.jpg”)
#分离颜色通道,产生三个 Image对象
r,g,b = image.split()
#重新组合颜色通道,返回先的Image对象
image_merge=Image.merge(‘RGB’,(b,g,r))
image_merge.show()
#保存图像至桌面
image_merge.save(“C:/Users/Administrator/Desktop/3.jpg”)


新合成的图像入如下所示:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/cf4e7bba6c6ef5813c26e2a928e45001.png)  
 图3:图像合并操作


两张图片的合并操作也并不复杂,但是要求两张图片的模式、图像大小必须要保持一致,否则不能合并。因此,对于那些模式、大小不同的图片要进行预处理。


下面我们将蝴蝶图与向日葵图进行合并,向日葵原图如下:


![pillow图片处理](https://img-blog.csdnimg.cn/img_convert/454dbb73d5d4877aad329355e6bae17d.png)  
 图4:向日葵原图


示例代码如下:



from PIL import Image
#打开图2.jpg
im_1 = Image.open(“C:/Users/Administrator/Desktop/2.jpg”)
im_2= Image.open(“C:/Users/Administrator/Desktop/向日葵.jpg”)
#因为两种图片的图片格式一致,所以仅需要处理图片的大小,让它们保持一致
#让 im_2 的图像尺寸与 im_1 一致,注意此处新生成了 Image 对象
image = im_2.resize(im_1.size)
#接下来,对图像进行颜色分离操作
r1, g1 ,b1 = im_1.split()
r2, g2 , b2 = image.split()

合并图像

im_3 = Image.merge(‘RGB’,[r2,g1,b2])
im_3.show()
im_3.save(“C:/Users/Administrator/Desktop/合成.jpg”)


预览图像的合成结果:


![pillow图像合成](https://img-blog.csdnimg.cn/img_convert/ccde159472c094e9fbe018cfca0d8667.png)  
 图5:合成图像


### 扩展知识:blend() 混合图片


Image 类也提供了 blend() 方法来混合 RGBA 模式的图片(PNG 格式),函数的语法格式如下:



Image.blend(image1,image2, alpha)


参数说明如下:


* image1,image2:表示两个 Image 对象。
* alpha:表示透明度,取值范围为 0 到 1,当取值为 0 时,输出图像相当于 image1 的拷贝,而取值为 1 时,则是 image2 的拷贝,只有当取值为 0.5 时,才为两个图像的中合。因此改值的大小决定了两个图像的混合程度。


与 RGB 模式相比,RGBA 在 RGB 的基础上增加了透明度,通过 Alpha 取值来决定两个图像的混合程度。示例如下:



“”“”
混合 rgba模式的图像
“”"
im1 = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
image = Image.open(“C:/Users/Administrator/Desktop/心形函数图像.png”)
im2=image.resize(im1.size)
def blend_im(im1,im2):
#设置 alpha 为 0.5
Image.blend(im1,im2,0.5).save(“C:/Users/Administrator/Desktop/C语言中文网.png”)
#调用函数
blend_im(im1,im2)


输出结果如下:


![pillow库处理图像](https://img-blog.csdnimg.cn/img_convert/0c50db31fd2cf118cdc7006136c78958.png)  
 图6:混合图像


## Pillow图像裁剪、复制、粘贴操作


图像的剪裁、复制、粘贴是图像处理过程中经常使用的基本操作,Pillow Image 类提供了简单、易用的 API 接口,能够帮助您快速实现这些简单的图像处理操作。


### 图像裁剪操作


Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪,函数的语法格式如下:



crop(box=None)


box:表示裁剪区域,默认为 None,表示拷贝原图像。


注意:box 是一个有四个数字的元组参数 (x\_左上,y\_左下,x1\_右上,y1\_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位。


crop() 函数的会返回一个 Image 对象,使用示例如下:



“”"
裁剪图像
“”"
im = Image.open(“C:/Users/Administrator/Desktop/C语言中文网.png”)
box =(0,0,200,100)
im_crop = im.crop(box)
im_crop.show()


输出图像显示如下:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/bf3b050487c09f1b9fe1c8fc44e7a381.png)  
 图1:图像裁剪


最终,在原图的基础上裁剪出一张像素为 200 \* 100 的图像。


### 图像拷贝和粘贴


拷贝、粘贴操作几乎是成对出现的,Image 类提供了 copy() 和 paste() 方法来实现图像的复制和粘贴。其中复制操作(即 copy() 方法)比较简单,下面主要介绍 paste() 粘贴方法,语法格式如下所示:



paste(image, box=None, mask=None)


该函数的作用是将一张图片粘贴至另一张图片中。注意,粘贴后的图片模式将自动保持一致,不需要进行额外的转换。参数说明如下:


* image:指被粘贴的图片;
* box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x,y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致。
* mask:可选参数,为图片添加蒙版效果。


下面复制一张原图像的副本,对副本进行裁剪、粘贴操作,代码如下所示:



im = Image.open(“C:/Users/Administrator/Desktop/C语言中文网.png”)
#复制一张图片副本
im_copy=im.copy()
#对副本进行裁剪
im_crop = im_copy.crop((0,0,200,100))
#创建一个新的图像作为蒙版,L模式,单颜色值
image_new = Image.new(‘L’, (200, 100), 200)
#将裁剪后的副本粘贴至副本图像上,并添加蒙版
im_copy.paste(im_crop,(100,100,300,200),mask=image_new)
#显示粘贴后的图像
im_copy.show()


输出的显示结果,如下所示:


![pillow处理图像](https://img-blog.csdnimg.cn/img_convert/2ad2a365e0c9b305f9c1436e47089271.png)  
 图2:图像复制粘贴


## Pillow图像几何变换


图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform(),下面分别对它们进行讲解。


### transpose()翻转操作


该函数可以实现图像的垂直、水平翻转,语法格式如下:



Image.transpose(method)


method 参数决定了图片要如何翻转,参数值如下:


* Image.FLIP\_LEFT\_RIGHT:左右水平翻转;
* Image.FLIP\_TOP\_BOTTOM:上下垂直翻转;
* Image.ROTATE\_90:图像旋转 90 度;
* Image.ROTATE\_180:图像旋转 180 度;
* Image.ROTATE\_270:图像旋转 270 度;
* Image.TRANSPOSE:图像转置;
* Image.TRANSVERSE:图像横向翻转。


使用示例如下:



im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
#返回一个新的Image对象
im_out=im.transpose(Image.FLIP_LEFT_RIGHT)
im_out.show()
im_out.save(“C:/Users/Administrator/Desktop/水平翻转.png”)


图像显示结果,如下所示:


![python pillow库图像处理](https://img-blog.csdnimg.cn/img_convert/ea7ab4a7bd0e3b9b5839def7c0b924c7.png)  
 图1:图像翻转操作


### rotate()任意角度旋转


当我们想把图像旋转任意角度时,可以使用 rotate() 函数,语法格式如下:



Image.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None)


参数说明如下:


* angle:表示任意旋转的角度;
* resample:重采样滤波器,默认为 PIL.Image.NEAREST 最近邻插值方法;
* expand:可选参数,表示是否对图像进行扩展,如果参数值为 True 则扩大输出图像,如果为 False 或者省略,则表示按原图像大小输出;
* center:可选参数,指定旋转中心,参数值是长度为 2 的元组,默认以图像中心进行旋转;
* translate:参数值为二元组,表示对旋转后的图像进行平移,以左上角为原点;
* fillcolor:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。


使用示例如下:



im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
#translate的参数值可以为负数,并将旋转图之外的区域填充为绿色
#返回同一个新的Image对象
im_out=im.rotate(45,translate=(0,-25),fillcolor=“green”)
im_out.show()
im_out.save(“C:/Users/Administrator/Desktop/旋转图像.png”)


输出结果:


![python pillow图像处理](https://img-blog.csdnimg.cn/img_convert/44c63682020563de484da3ac2110fd3f.png)  
 图2:图像旋转


### transform()图像变换


该函数能够对图像进行变换操作,通过指定的变换方式,产生一张规定大小的新图像,语法格式如下:



Image.transform(size, method, data=None, resample=0)


参数说明:


* size:指定新图片的大小;
* method:指定图片的变化方式,比如 Image.EXTENT 表示矩形变换;
* data:该参数用来给变换方式提供所需数据;
* resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST。


使用示例如下:



from PIL import Image
im = Image.open(“C:/Users/Administrator/Desktop/c-net.png”)
#设置图像大小250*250,并根据data的数据截取原图像的区域,生成新的图像
im_out=im.transform((250,250),Image.EXTENT,data=[0,0,30 + im.width//4,im.height//3])
im_out.show()
im_out.save(“C:/Users/Administrator/Desktop/变换.png”)


输出图像显示如下:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/79d604060e3a313b2869fb12febabd48.png)  
 图3:图像矩形变换


## Pillow图像降噪处理


由于成像设备、传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信息统称为“噪声”,比如数字图像中常见的“椒盐噪声”,指的是图像会随机出现的一些白、黑色的像素点。图像噪声既影响了图像的质量,又妨碍人们的视觉观赏。因此,噪声处理是图像处理过程中必不可少的环节之一,我们把处理图像噪声的过程称为“图像降噪”。


随着数字图像技术的不断发展,图像降噪方法也日趋成熟,通过某些算法来构造滤波器是图像降噪的主要方式。滤波器能够有效抑制噪声的产生,并且不影响被处理图像的形状、大小以及原有的拓扑结构。


Pillow 通过 ImageFilter 类达到图像降噪的目的,该类中集成了不同种类的滤波器,通过调用它们从而实现图像的平滑、锐化、边界增强等图像降噪操作。常见的降噪滤波器如下表所示:




| 名称 | 说明 |
| --- | --- |
| ImageFilter.BLUR | 模糊滤波,即均值滤波 |
| ImageFilter.CONTOUR | 轮廓滤波,寻找图像轮廓信息 |
| ImageFilter.DETAIL | 细节滤波,使得图像显示更加精细 |
| ImageFilter.FIND\_EDGES | 寻找边界滤波(找寻图像的边界信息) |
| ImageFilter.EMBOSS | 浮雕滤波,以浮雕图的形式显示图像 |
| ImageFilter.EDGE\_ENHANCE | 边界增强滤波 |
| ImageFilter.EDGE\_ENHANCE\_MORE | 深度边缘增强滤波 |
| ImageFilter.SMOOTH | 平滑滤波 |
| ImageFilter.SMOOTH\_MORE | 深度平滑滤波 |
| ImageFilter.SHARPEN | 锐化滤波 |
| ImageFilter.GaussianBlur() | 高斯模糊 |
| ImageFilter.UnsharpMask() | 反锐化掩码滤波 |
| ImageFilter.Kernel() | 卷积核滤波 |
| ImageFilter.MinFilter(size) | 最小值滤波器,从 size 参数指定的区域中选择最小像素值,然后将其存储至输出图像中。 |
| ImageFilter.MedianFilter(size) | 中值滤波器,从 size 参数指定的区域中选择中值像素值,然后将其存储至输出图像中。 |
| ImageFilter.MaxFilter(size) | 最大值滤波器 |
| ImageFilter.ModeFilter() | 模式滤波 |


从上述表格中选取几个方法进行示例演示,下面是等待处理的原始图像:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/84465445d18eb7291cdf199952406c40.png)  
 图1:pilow图像处理


### 模糊处理



导入Image类和ImageFilter类

from PIL import Image,ImageFilter
im = Image.open(“C:/Users/Administrator/Desktop/国宝.jpg”)
#图像模糊处理
im_blur=im.filter(ImageFilter.BLUR)
im_blur.show()
im_blur.save(“C:/Users/Administrator/Desktop/模糊.png”)


输出图像如下:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/3d55e47af80207552d916dcd52813831.png)  
 图2:图像模糊


### 轮廓图



from PIL import Image,ImageFilter
im = Image.open(“C:/Users/Administrator/Desktop/国宝.jpg”)
#生成轮廓图
im2=im.filter(ImageFilter.CONTOUR)
im2.show()
im2.save(“C:/Users/Administrator/Desktop/轮廓图.png”)


输出图像,显示如下:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/fb6a6716452902588779c6739bed9ad2.png)  
 图3:图像轮廓图


### 边缘检测



from PIL import Image,ImageFilter
im = Image.open(“C:/Users/Administrator/Desktop/国宝.jpg”)
#边缘检测
im3=im.filter(ImageFilter.FIND_EDGES)
im3.show()
im3.save(“C:/Users/Administrator/Desktop/边缘检测.png”)


输出图像结果:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/9b112d8ad1a96f5f129fab9daa948fde.png)  
 图4:图像边缘检测


### 浮雕图



from PIL import Image,ImageFilter
im = Image.open(“C:/Users/Administrator/Desktop/国宝.jpg”)
#浮雕图
im4=im.filter(ImageFilter.EMBOSS)
im4.show()
im4.save(“C:/Users/Administrator/Desktop/浮雕图.png”)


输出图像如下:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/ca6092a4f2995d5f27f41f6c539269bd.png)  
 图5:浮雕图


### 平滑图像



#生成平滑图像
from PIL import Image,ImageFilter
im = Image.open(“C:/Users/Administrator/Desktop/国宝.jpg”)
#平滑图smooth
im5=im.filter(ImageFilter.SMOOTH)
im5.show()
im5.save(“C:/Users/Administrator/Desktop/平滑图.png”)


输出图像如下:


![pillow图像处理](https://img-blog.csdnimg.cn/img_convert/d4c8c4bba5df07b29bf901d93f26667c.png)  
 图6:平滑图


如果您使用过 PhotoShop(简称 Ps,一款专业的图像处理软件)、Fireworks(简称 Fw,一款专业的图像处理软件) 或者手机美图软件的话,其实不难发现,上述操作就是给图片添加一个“滤镜”,通过添加滤镜来改变图片的外观,从而影响了我们对于图片的感官体验。


## Pillow图像颜色处理


Pillow 提供了颜色处理模块 ImageColor,该模块支持不同格式的颜色,比如 RGB 格式的颜色三元组、十六进制的颜色名称(#ff0000)以及颜色英文单词(“red”)。同时,它还可以将 CSS(层叠样式表,用来修饰网页)风格的颜色转换为 RGB 格式。


注意,在 ImageColor 模块对颜色的大小并不敏感,比如 “Red” 也可以写为 " red"。


### 颜色命名


ImageColor 支持多种颜色模式的的命名(即使用固定的格式对颜值进行表示),比如我们熟知的 RGB 色彩模式,除此之外,还有 HSL (色调-饱和度-明度)、HSB (又称 HSV,色调-饱和度-亮度)色彩模式。下面对 HSL 做简单介绍:


* H:即 Hue 色调,取值范围 0 -360,其中 0 表示“red”,120 表示 “green”,240 表示“blue”;
* S:即 Saturation 饱和度,代表色彩的纯度,取值 0~100%,其中 0 代表灰色(gry),100% 表示色光最饱和;
* L:即 Lightness 明度,取值为 0~100%,其中 0 表示“black”黑色,50% 表示正常颜色,100% 则表示白色。


下面使用 HSL 色彩模式表示红色,格式如下:



HSL(0,100%,50%)


此时的颜色为“纯红色”,等同于 RGB (255,0,0)。如果想了解有关 HSL/HSB 的更多知识,点击[链接]( )前往。


ImageColor 模块比较简单,只提供了两个常用方法,分别是 getrgb() 和 getcolor() 函数。


### getrgb()方法


顾名思义,该函数用来得到颜色的 RGB 值,语法格式如下:



PIL.ImageColor.getrgb(color)


使用示例如下:



from PIL import Image,ImageColor

getrgb()方法

color1=ImageColor.getrgb(“blue”)
print(color1)
color2=ImageColor.getrgb(‘#DCDCDC’)
print(color2)
#使用HSL模式红色
color3=ImageColor.getrgb(‘HSL(0,100%,50%)’)
print(color3)


输出结果如下:



(0, 0, 255)
(220, 220, 220)
(255, 0, 0)


通过 new() 方法可以新建图像,此时也可以使用 ImageColor.getrgb(),如下所示:



#使用new()绘制新的图像
im= Image.new(“RGB”, (200, 200), ImageColor.getrgb(“#EEB4B4”))
im.save(“C:/Users/Administrator/Desktop/xin.jpg”)


显示图片如下:


学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!



### 一、Python所有方向的学习路线



Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



![](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)



### 二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。



![](https://img-blog.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)



### 三、全套PDF电子书



书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

![](https://img-blog.csdnimg.cn/img_convert/46506ae54be168b93cf63939786134ca.png)



### 四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。



![](https://img-blog.csdnimg.cn/afc935d834c5452090670f48eda180e0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP5aqb56eD56eD,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)



### 五、实战案例



光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。



![](https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)



### 六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。



![](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)  

![](https://img-blog.csdnimg.cn/img_convert/d2d978bb523c810abca3abe69e09bc1a.png)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值