python自学之《21天学通Python》(16)——第19章 用Pillow库处理图片

news2024/11/17 11:44:55

Pillow是Python2.X时代比较流行的Python ImagingLibrary(简称Pillow)图像处理库的分支,并修复了一些bug。Pillow提供了对Python3的支持,为Python3解释器提供了图像处理的功能。和Pillow库一样提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。这个图像处理库的核心被设计成为能够快速访问几种基本像素类型表示的图像数据。它为通用图像处理工具提供了一个坚实基础,通过使用Pillow模块,可以使用Python3对图片进行处理,例如,可用来对图片进行尺寸、格式、色彩、旋转等处理。

19.1 第三方Pillow库概述

由于Pillow不是Python自带的模块,因此需要用户自己安装。Pillow是跨平台的,在各种系统下都可以使用Pillow的强大功能。

19.1.1 安装第三方Pillow库

与安装Python的其他第三方库的方法相同,可以到以下网址下载库的压缩包。

https://pypi.python.org/pypi/Pillow/2.7.0
https://github.com/python-Pillow/Pillow

解压后,在命令提示符下进入其目录,运行以下命令:

python setup.py install

如果你的计算机可以联网的话,直接运行以下命令就自动可以从互联网上下载安装:

pip install pillow

19.1.2 Pillow库简介

在Pillow中,主要提供了以下对图片进行处理的模块。利用这些模块可以装载和保存多种格式文件,对图像进行缩放、裁剪、合成与变换,也可以像Photoshop一样专门处理通道,支持像素级操作、滤镜,支持对图像进行对比增强和统计分析,支持绘制文字和基本图形,甚至还支持动画。它包括的主要模块如表19.1所示。

在这里插入图片描述
在这里插入图片描述

19.1.3 Pillow库处理图像基础

Pillow库对图像的操作牵涉到图像处理的相关概念及表示,如下:
pixes(像素)——构成图片的点单元;
size(尺寸)——图片的大小,以两个元素的元组构成,形式为水平像素数,垂直像素数;
coordinates(坐标)——以左上角为(0,0)的坐标系统,形式为(x,y);
angles(角度)——以x轴正方向为起点,逆时针为正,反之为负,其单位为度(degree);
bboxes(边界框)——用来表示一个图像区域,形式为(x0,y0,xl,yl),是以左上角点坐标(x0,y0)为起点至右正下角bands(通道)——独立的颜色通道,它们具有相同的维数和深度。如在RGB模式下,每个图片由三个通道(RGB)叠加而成;(xl, yl)为终点,但不包含xl在列和yl所在行的区域;
mode(模式)——各种图片模式,如表19.2所示。

表19.2 Pillow支持图片模式及字符串表示

在这里插入图片描述
color(颜色)——可以为32位数值、元组或字符串。对于以上不同的图像格式,单通道图像像素值为1位、8位、32位等整数类型值;多通道图像则用像素元组来表示即(r,g,b)。此外,还可以使用以下风格的字符串型表示颜色:

CSS #FF0000或#F00;
RGB rgb(255,0,0或rgb(100%,0,0);
HSL hsl(120,30%,78%)。

filters——滤镜,多个像素映射到一个像素,以改变图像尺寸。目前主要有以下几种:

NEAREST 最近;BILINEAR 双线性;BICUBIC 双二次;ANTIALIAS 平滑。
fonts(字体)——可以支持bitmap、OpenType、TrueType等类型。
format(格式)——文件格式,默认以文件名的扩展名指定,也可以单独指定。如“PNG”、“JPG”等。

注意: 以上各种概念如图片模式等在图片处理中很重要,要熟练处理图片,必须了解这些基础知识。

19.1.4 Image模块中函数的使用

对于简单的图片处理,一般仅需使用Image模块,这个模块中包含的主要函数和使用方法如下:

open(file, mode)其参数含义如下:

file 要打开的图片文件;

mode 可选参数,打开文件的方式,一般使用默认值r即可。

Image模块中主要的函数是open函数,用于打开图片,操作结果是返回Image类的实例。当文件不存在时,会引发IOError错误。

new(mode, size, color=0)其参数含义如下;

mode 图片模式,如表19.2所示;

size 图片尺寸,宽、高构成的元组;

color 默认颜色(黑)。

blend(iml, im2, alpha)其参数含义如下:

iml 参与混合的图片1;

im2 参与混合的图片2;

alpha 混合透明度[0—1]。

实现的功能是将iml、im2两幅图片(尺寸相同)以一定的透明度混合,混合的方法是:

(im1 × (1 - alpha) + im2 × alpha)

当alpha为0时,得到iml原图片,为1时,得到im2原图片。

【实例19-1】 演示了用blend()函数混合图像的实例,代码如下:

在这里插入图片描述
【代码说明】代码仅有四行,但实现了两张图片以一定的透明度混合,并且混合后调用系统中的软件显示相应的图片。

【运行效果】将此两幅图片混合后得到如图19.1所示。

在这里插入图片描述
注意: 原始图片a.jpg、b.jpg分别如图19.2、图19.3所示。

在这里插入图片描述
在这里插入图片描述
composite(iml, im2, mask)其参数含义如下:
im1 参与混合的图片1;
im2 参与混合的图片2;
mask 混合遮罩。

其功能是使用mask来混合im1和im2,并且要求它们尺寸相同,作为mask的图片模式可以是“1”、“L”、“RGBA”。

【实例19-2】 演示了用blend()函数中的遮罩功能混合图像的实例,代码如下:

在这里插入图片描述
在这里插入图片描述
eval(image, fun)其参数含义如下。

im1输入的图片;

fun 给输入图片的每个像素应用此函数。

其功能是将输入图片的每个像素应用函数fun进行计算后返回,fun函数只允许接收一个整数类型参数。如果一个图片含有多个通道,则每个通道都会应用这个函数。

【实例19-3】 演示了使用eval()函数对图片进行处理的实例,代码如下:

在这里插入图片描述
merge(mode, bands)其参数含义如下。

mode 输出文件的模式;

bands用于合成图片的所有通道列表、元组等序列。

其功能是将多个图形通道合成一幅图像,并返回该合成图像实例。

19.1.5 Image模块中Image类的使用

上一节打开图片文件返回和引用图像的变量,实际上是Image模块中Image类对象的实例,运用该对象的方法可以访问图片的属性和对图片进行变换操作。Image类具有许多有用的方法和属性如下:

主要属性有:

Image.format 源图像格式;
Image.mode 图像模式字符串;
Image.size 图像尺寸。

主要方法有:

Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=25

其主要参数含义如下:

mode 转换文件为此模式;
matrix 转换使用的矩阵(4或16元素的浮点数元组);
dither None时且转为黑白图时非0(1~255)像素均为白,也可以设置为此参数FLOYDSTEINBERG。

其功能是返回模式转换后的图像实例,目前支持的模式有“L”、“RGB”、“CMYK”,matrix参数只支持“L”、“RGB”。

注意: 非原地修改,函数的返回值为修改后的图像。

彩色图片轮换为“L”模式时,应用以下公式进行转换:
L = R * 299/1000 + G * 587/1000 + B * 114/1000

此外,运用matrix参数可以转换出不同意想不到效果的图片。
Image.transpose(method)

变换图像后,返回变换的图像(非原地修改),方法有:

在这里插入图片描述
Image.paste(im, box=None, mask=None)
其参数的意义如下:im 源图或像素值;box 为粘贴区域;mask 为遮罩。

功能是粘贴源至该图像,box可以为以下三种情况:

(xl,yl)将源图像左上角对齐xl,yl点,其余超出被粘贴的图像的区域被抛弃;
(xl,yl,x2,y2)源图像与此区域必须一致;
None 源图像与被粘贴的图像大小必须一致。

其他一些简单的方法如下:

在这里插入图片描述
在这里插入图片描述
【实例19-4】 演示了Image模块的一些函数的使用,代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【代码说明】代码中首先导入Pillow库,然后用Image模块中的open()函数打开当前目录下的图像文件“a.jpg”,并返回图像的实例。之后分别应用Image模块中的函数和Image模块中Image类的方法处理它,并输出其对比图。

【运行效果】运行该实例代码后,控制台输出如图19.6所示,输出了图像文件中的“a.jpg”的图像格式、图像模式、图像尺寸和图像通道列表。其他处理后的图像输出如图19.7~19.16所示。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

19.1.6 使用ImageChops模块进行图片合成

该模块包含多种用计算通道中像素值的方式来进行图片合成的函数,其主要用于制作特效、合成图片等。这个模块包含的图像处理的函数很多,这里仅举几个例子说明其用法,更详细的函数及其使用可以参考官方网站。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【实例19-5】 演示了用以上多个函数合成图片效果的例子,其代码如下:

在这里插入图片描述
【代码说明】代码很简单,先导入使用的模块后打开用来合成的两幅图像,之后调用ImageChops模块中的函数来合成图像。

【运行效果】运行后得到的图像如图19.17~19.23所示,而最后产生的图像为纯黑色,因为比较的是同一幅图像。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

19.1.7 使用ImageEnhance模块增强图像效果

该模块中函数的主要作用是增强图像的效果,主要可以用来调整图像的色彩、对比度、亮度、清晰度等,感觉上和调整电视机的显示参数一样。其主要的函数如下:

在这里插入图片描述
【实例19-6】 演示了使用图像增强模块的实例,代码如下。

在这里插入图片描述
在这里插入图片描述
【代码说明】代码中首先导入所需的Pillow库,然后分别建立两种调整器(色彩、亮度),最后在两层循环中输出调整后的图像对比。

【运行效果】运行此代码输出的4幅图像,如图19.24~19.27所示。

在这里插入图片描述
在这里插入图片描述

19.1.8 使用ImageFilter模块的滤镜

ImageFilter模块提供了滤镜功能,它也可以被用来建立图像特效,或以此效果作为中间结果进一步处理。该模块中提供了一些预定义的和供自定义的过滤器。

预定义的近十个过滤器中主要有:

在这里插入图片描述
在这里插入图片描述
【实例19-7】 演示了应用以上几种滤镜生成的对比图的实例,代码如下:

在这里插入图片描述
【代码说明】代码中首先导入了相关的库,之后建立应用滤镜的列表,并用for遍历使用并输出其对比图。

【运行效果】运行以上代码得到的对比效果图如图19.28~19.30所示:

在这里插入图片描述

19.1.9 使用ImageDraw模块画图

ImageDraw模块提供了2D绘图功能,可以通过创建图片来绘图,也可以在原有的图片上进行绘图,以达到修饰图片或对图片进行注释的目的。

使用ImageDraw模块画图的基本步骤为:

在这里插入图片描述
【实例19-8】 演示了一个用ImageDraw模块绘制的图形的实例,代码如下:

在这里插入图片描述

19.2 使用Pillow库处理图片举例

Pillow提供了非常实用的函数,很多情况下仅需使用一两个Pillow函数或者方法,就可以完成对图片的处理,如调整图片大小,转换图片格式等。配合Python的灵活性,使用Pillow可以创建一些非常实用的图片处理程序。本节主要介绍使用Pillow结合tkinter库建立图形化批量图片处理工具。

【实例19-9】 演示了批量图片文件格式转换的GUI程序,代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【代码说明】代码的主要部分为自定义的一个主类,类的构造函数中生成GUI窗口组件,并在窗口中添加相应的GUI组件供用户选择使用,主类的Browser()方法用来选择转换的图片文件的目录,Corw()方法用来遍历当前目录中的所选类型的图片文件并转换保存。

【运行效果】程序运行后,将显示如图19.32所示窗口,单击“浏览”按钮选择一个保存源图片的目录,接着在下方选择从一种图片格式转换为另一种图片格,最后单击“转换”按钮,即可批量转换图片的格式。转换操作完成后,在指定目录下新建一个目录,用来保存转换后的图片。

在这里插入图片描述

19.2.2 批量生成缩略图

生成缩略图也是常用的图片处理方式之一,使用Pillow生成缩略图可以使用Image的resize函数,因为使用resize函数可以重新指定图片的大小。

【实例19-10】 演示了程序使用Pillow模块批量生成图片的缩略图,代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【代码说明】该程序的代码和实例19-9基本结构相同,这里不作解释了。

【运行效果】程序运行后将显示如图19.33所示的窗口,输入缩略图的百分比,接着选择一个文件或目录进行转换,单击“转换”按钮,即可为选择的图片或选择目录中所有的图片生成缩略图。生成的缩略图与原图保存同一个目录中,缩略图的文件名由原文件名加上“_thumb.jpg”组成。

在这里插入图片描述

19.2.3 为图片添加Logo

使用Pillow为图片添加Logo,主要使用Image的paste函数。paste函数可以向图片中粘贴其他的图片。

【实例19-11】 演示的程序代码,就是使用Pillow模块为图片批量添加Logo:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【代码说明】其代码结构与前例相同。

【运行效果】程序运行后,显示如图19.34所示的窗口,选择一个作为Logo的图片,接着选择需要添加Logo的图片,然后在窗口下方选择Logo添加的位置,最后单击“添加”按钮,即可将Logo图片添加到图片的指定位置。

在这里插入图片描述

19.3 小结

本章介绍了一个Python处理图片的第三方模块Pillow,Pillow模块的功能非常强大,可对图片进行各种操作。在本章中首先介绍了Pillow模块的下载和安装。然后介绍了Pillow模块的处理图像的基本概念、Image模块、ImageChops模块、ImageEnhance模块、magefilter模块等模块的基本使用方法。最后本章介绍了使用Pillow处理图片的几个案例:使用 Pillow转换图片格式、生成缩略图、为图片添加Logo。此外,Pillow模块中还包括其他一些模块,可以参考相关资料。通过学习本章,你应掌握使用Pillow第三方模块进行图片处理的相关方法。

19.4 本章习题

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA如何创建一个springboot项目

要想进入springboot的殿堂,你的跨进springboot的门槛,下面就是使用IDEA初始话一个简单的springboot项目。 选择Create New Project 选择Spring Initializer——>选择对应的jdk版本——>Default默认在线构建,需要联网噢 选择自己想写…

2005-2019年我国地级市国内外旅游人数和收入数据

旅游产业的发展情况是一个城市经济和文化影响力的重要指标,我们在很多研究中都会用到旅游相关的数据,之前我们介绍过1978-2020年的中国旅游统计年鉴和2022年13604条的全国A级景区数据(可以查看之前推送的文章)。 本次我们为大家介…

上传文件-课后程序(JAVA基础案例教程-黑马程序员编著-第九章-课后作业)

【案例9-3】 客户端向服务端上传文件 【案例介绍】 1.案例描述 编写一个客户端向服务端上传文件的程序,要求使用TCP通信的的知识,将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文…

网络基础之IP地址和子网掩码

一、IP地址IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0 一直到255.255.255.255。互联网上的…

虚拟内存原理

局部性原理 计算机组成原理里我们可以知道cache掉入的数据都是连续的 我们可以看下面的例子,data创建的数组,因为我们要读入的是这个数组所以调入的是这一段内存的内容就大概率不会miss 但是我们要知道有些程序的代码被执行的几率是很小的,…

通达信KDJ抄底指标公式,利用J值小于0

前几天介绍了平滑KDJ指标公式,当时有人提出来不建议处理KDJ,KDJ的特点是灵敏,经过处理后就失去其意义了。不过我认为每种指标有相应的使用场景,不必拘泥于原始指标,指标也是人想出来的。今天就利用KDJ的灵敏&#xff0…

Windows下curl编译,使用vcpkg定制自己的【curl】。

本篇介绍在Windows下如何编译curl,curl自称是星球上最好用的计算机网络工具,但是它在windows上纯手动编译很困难,我们使用vcpkg来简化它的编译,方便我们使用。 目录 一、CURL介绍 二、vcpkg下载、编译、定制【curl】 三、编写…

代码随想录算法训练营第十五天 | 层序遍历 、226.翻转二叉树、101.对称二叉树

打卡第15天,今天继续二叉树 今日任务 层序遍历10道题226.翻转二叉树101.对称二叉树 层序遍历10道题 题单 102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个…

工作篇:触摸屏原理介绍

一、触摸屏概述 触摸屏作为一种新的输入设备,它是目前最简单、方便、自然的一种人机交互方式。 当接触了屏幕上的图形按钮时,屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置,可用以取代机械式的按钮面板,并借由液晶…

《PMBOK 指南第七版》初识

个人理解: 体系构建变化非常大,7版延续6版的内容,但对项目管理的视角完全不同,系统化的思考方式10知识领域 到 12管理原则的转变,突出了对变化的敏捷应对,体现管理的有效性5过程域 到 8 绩效域的转变&…

Android源码分析 - InputManagerService与触摸事件

0. 前言 有人问到:“通过TouchEvent,你可以获得到当前的触点,它更新的频率和屏幕刷新的频率一样吗?”。听到这个问题的时候我感到很诧异,我们知道Android是事件驱动机制的设计,可以从多种服务中通过IPC通信…

03 Android基础--fragment

03 Android基础--fragment什么是fragment?fragment生命周期?动态的fragment与静态的fragmentfragment常用的两个类与APIFragment与Activity通信什么是fragment? 碎片,一个activity中可以使用多个fragment,可以把activi…

应用模型开发指南上新介绍

Module、HAP、Ability、AbilitySta-ge、Context……您是否曾经被这些搞不懂又绕不开的知识点困扰? 现在,全新的《应用程序包基础知识》及《应用模型开发指南》为您答疑解惑! 这里有您关注的概念解析、原理机制阐述,也有丰富的…

gitlab+idea回退代码并提交到新分支

目录结构前言idea创建新分支查看代码提交记录使用IntelliJ IDEA获取使用Git Bash Here获取代码回退到指定版本回退执行命令行使用IntelliJ IDEA实现使用Git Bash Here实现回退完成验证idea提交指定版本代码验证分支代码推动成功前言 IntelliJ IDEA GitLab开发过程中需将代码回…

ajax调用restful接口

HTTP动词对应操作POST新增信息GET获取信息PUT更新信息DELETE删除信息一、POST-----新增信息 1. 后台接口 PostMapping(value "/save") public String save(RequestBody(required true) Emp emp){System.err.println(emp.toString());// 将数据信息存库empService.…

Android开发面试【金三】——启动优化

前言 一下子来到了,面试的高潮季。金三银四的三月份;在我们Android开发的众多面试中,扑面而来的超多面试题难道很多程序员。 Android的性能优化,主要是从以下几个方面进行优化的: 稳定(内存溢出、崩溃&am…

安全认证--JWT介绍及使用

安全认证--JWT介绍及使用1.无状态登录原理1.1.什么是有状态?1.2.什么是无状态1.3.如何实现无状态1.4.JWT1.4.1.简介1.4.2.数据格式2.编写JWT工具2.1.添加JWT依赖2.2.载荷对象2.3.工具2.4.测试2.4.1.配置秘钥2.4.2.测试类2.5项目源码1.无状态登录原理 有状态登录和无…

G1D54-CRF

一、CRF的输入X是什么?是构造的特征吗? 如此,CRF的x只用于状态函数吗? CRF的例子解释调用代码 机器之心 知乎忆榛 此处线性链条件随机场的特征函数形式被统一了? BilstmCRF,强烈推荐!&#x…

AM402和SV660N、IS620N运动控制

软件:InoProShop(V1.7.3) 1、添加EtherCAT伺服从站 2、PLC运动控制程序和ETHERCAT在一个任务中。 3、编码器脉冲设置。 注意电机转速值是以秒还是分钟计量单位。 SV660N IS620N 4、设置电机停机方式。使用sin停机效果比较圆滑,默认梯形。 5、库管理器…

广和通携手联发科技正式发布基于MediaTek T830 平台5G模组FG370的可快速落地FWA解决方案

2月28日,全球领先的物联网无线通信解决方案和无线通信模组提供商广和通正式宣布:新一代5G模组FG370已率先实现量产,并于2023世界移动通信大会(MWC Barcelona 2023)期间携手联发科技正式发布基于FG370的FWA解决方案&…