PIL或Pillow学习1

PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评。

自 2011 年以来,由于 PIL 库更新缓慢,目前仅支持 Python 2.7 版本,这明显无法满足 Python3 版本的使用需求。

于是一群 Python 社区的志愿者(主要贡献者:Alex Clark 和 Contributors)在 PIL 库的基础上开发了一个支持 Python3 版本的图像处理库,它就是 Pillow。

Pillow 不仅是 PIL 库的“复制版”,而且它又在 PIL 库的基础上增加了许多新的特性。Pillow 发展至今,已经成为了比 PIL 更具活力的图像处理库。

Pillow 的初衷只是想作为 PIL 库的分支和补充,如今它已是“青出于蓝而胜于蓝”。

除了 PIL 和 Pillow 库之外,Python 还提供了一些其他图像处理库:

  • Scikit-image:一款基于 scipy 科学计算的图像处理软件包,以数组的形式对图像进行处理;
  • OpenCV:其实是一个 C++ 图像处理库,不过它提供了 Python 语言的接口。


Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。

与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用。

Pillow版本支持

Pillow 支持跨平台运行,比如 Windows、Linux、MacOS 等,其最新版本为 Pillow 8.3.2,该版本支持 Python 3.6 及以上的版本(推荐使用)。Pillow 与 Python 支持版本的对照表如下所示:
 

版本对照表
Python版本3.103.93.83.73.63.52.7
Pillow>=8.3.2支持支持支持支持支持
Pillow8.0-8.3.1支持支持支持支持
Pillow7.0-7.2支持支持支持支持
Pillow6.2.1-6.22支持支持支持支持支持
Pillow6..0-6.2.0支持支持支持支持
PIL_test1.py:
from PIL import Image'''
0, Pillow的下载与安装
python 2.7 : pip install PIL
python 3.7 : pip install pillow
''''''
1, Pillow创建Image对象使用 Image 类的 open() 方法,可以创建一个 Image 对象,语法格式如下:
im = Image.open(filepath,mode="r")
参数说明:
filepath 表示文件路径,字符串格式;
mode:可选参数,若出现该参数,则必须设置为 "r",否则会引发 ValueError 异常。
'''
#打开一图片文件
img = Image.open("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1.png")
#要显示图像需要调用 show()方法
#img.show()'''
3, Pillow Image对象属性
'''
#1) size:查看图像的尺寸
#打印image对象
print(img)
#查看尺寸
print("宽width是 %s ; 高height是 %s"%(img.width,img.height))
#或者通过size查看
print("图像的大小size:",img.size)#2) format:查看图片的格式
print("图像的格式:",img.format)#3) readonly:图片是否为只读 ;该属性的返回为 0 或者 1,分别对应着是和否
print("图像是否为只读:",img.readonly)#4) info:查看图片相关信息
# 包括了每英寸像素点大小和截图软件信息
print("图像信息:",img.info)#5) mode:图像模式
'''
图片模式
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 位浮点像素,单色通道。
'''
print("图像模式信息:",img.mode)'''
4, Pillow图片格式转换1) save()
#Image.save(filepath, format=None)
参数说明如下:
filepath:图片的存储路径,包含图片的名称,字符串格式;
format:可选参数,可以指定图片的格式。
'''
img.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1.bmp")'''
2) convert()+save()
并非所有的图片格式都可以用 save() 方法转换完成,比如将 PNG 格式的图片保存为 JPG 格式,
如果直接使用 save() 方法就会出现以下错误:"OSError: cannot write mode RGBA as JPEG"Image 类提供的 convert() 方法可以实现图像模式的转换。该函数提供了多个参数,
比如 mode、matrix、dither 等,其中最关键的参数是 mode,其余参数无须关心。语法格式如下:
convert(mode,parms**)
mode:指的是要转换成的图像模式;
params:其他可选参数。
'''
#此时返回一个新的image对象,转换图片模式
image = img.convert('RGB')
#调用save()保存
image.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1.jpg")'''
5, 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 对象。
'''
try:#放大图片image = img.resize((300,400))#将新图像保存至桌面image.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_放大.jpg")print("查看新图像的尺寸",image.size)
except IOError:print("放大图像失败")'''
6, Pillow图像分离与合并
图像(指数字图像)由许多像素点组成,像素是组成图像的基本单位,而每一个像素点又可以使用不同的颜色,
最终呈现出了绚丽多彩的图像。它们的本质就是图片呈现颜色时需要遵循的规则,
比如 RGB、RGBA、CYMK 等,而图像的分离与合并,指的就是图像颜色的分离和合并。Image 类提供了用于分离图像和合并图像的方法 split() 和 merge() 方法,通常情况下,这两个方法会一起使用。1) split()
split() 的使用方法比较简单,用来分离颜色通道
'''
#分离颜色通道,产生三个 Image对象
r,g,b = img.split()
print('分离颜色通道')
#r.show()
#g.show()
#b.show()
'''
2) merge()
Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像。merge() 方法的语法格式如下:
Image.merge(mode, bands)
参数说明如下:
mode:指定输出图片的模式
bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,
比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)。注意,该函数会返回一个新的 Image 对象。
'''
#重新组合颜色通道,返回先的Image对象
image_merge = Image.merge('RGB',(b,g,r))
print('图像合并,将分离的3个颜色通道合并')
#image_merge.show()
#保存合并后的图像
image_merge.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_split_merge.jpg")
print('保存合并后的图像')'''
7, Pillow图像裁剪、复制、粘贴操作图像的剪裁、复制、粘贴是图像处理过程中经常使用的基本操作,Pillow Image 类提供了简单、易用的 API 接口,
能够帮助您快速实现这些简单的图像处理操作。1) 图像裁剪操作
Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪,函数的语法格式如下:
crop(box=None)
box:表示裁剪区域,默认为 None,表示拷贝原图像。注意:box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),
分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。
默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位。
'''
box =(0,0,200,200)
img_crop = img.crop(box)
#保存裁剪后的图像
img_crop.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_crop.jpg")
print('保存裁剪后的图像')'''
2) 图像拷贝和粘贴
拷贝、粘贴操作几乎是成对出现的,Image 类提供了 copy() 和 paste() 方法来实现图像的复制和粘贴。
其中复制操作(即 copy() 方法)比较简单.下面主要介绍 paste() 粘贴方法,语法格式如下所示:
paste(image, box=None, mask=None)
该函数的作用是将一张图片粘贴至另一张图片中。注意,粘贴后的图片模式将自动保持一致,不需要进行额外的转换。参数说明如下:
image:指被粘贴的图片;
box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x,y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致。
mask:可选参数,为图片添加蒙版效果。
'''
#复制一张图片副本
img_copy=img.copy()
#打开图片2文件
img2 = Image.open("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/2.png")
#将img2粘贴至副本图像上
print(img2.size)
#对副本进行裁剪
img_crop = img2.crop((0,0,580,580))
#将裁剪后的副本粘贴至副本图像上
img_copy.paste(img_crop,(0,0,580,580))
#显示粘贴后的图像
#img_copy.show()
#保存拷贝和粘贴后的图像
img_copy.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_copy_paste.jpg")
print('保存拷贝和粘贴后的图像')'''
8, Pillow图像几何变换
图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,
Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform()1) 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:图像横向翻转。
'''
#返回一个新的Image对象
img_out1=img.transpose(Image.TRANSPOSE)
#img_out1.show()
img_out1.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_TRANSPOSE.png")
#图像旋转 90 度;左旋转
img_out2=img.transpose(Image.ROTATE_90)
#img_out2.show()
img_out2.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_ROTATE_90.png")
print('保存翻转后的图像')
'''
2) 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:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。
'''
#translate的参数值可以为负数,并将旋转图之外的区域填充为蓝色
#返回同一个新的Image对象,旋转 45 度
img_out_rotate=img.rotate(45,translate=(0,-25),fillcolor="blue")
#img_out_rotate.show()
img_out_rotate.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_rotate_45.png")
print('保存任意角度旋转后的图像')'''
3) transform()图像变换
该函数能够对图像进行变换操作,通过指定的变换方式,产生一张规定大小的新图像,语法格式如下:
Image.transform(size, method, data=None, resample=0) 参数说明:
size:指定新图片的大小;
method:指定图片的变化方式,比如 Image.EXTENT 表示矩形变换;
data:该参数用来给变换方式提供所需数据;
resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST。
'''
#设置图像大小300*300,并根据data的数据截取原图像的区域,生成新的图像
img_out_transform=img.transform((300,300),Image.EXTENT,data=[0,0,30 + img.width//4,img.height//3])
#img_out_transform.show()
img_out_transform.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_transform.png")
print('保存变换后的图像')

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

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

相关文章

ATFX汇市:为什么英央行维持利率不变,而不是加息25基点?

ATFX汇市:9月21日,英国央行9月利率决议宣布,维持5.25%的基准利率不变,此前市场预期英央行将会加息25基点。消息公布后,GBPUSD五分钟内从最高点1.2300下跌至1.2239,跌幅61基点。英国央行会议纪要中提到&…

解决:Typora上传图片后本地显示不出来

在配置好PicGo、github以及Typora后,为了更好部署博客,将图片的偏好设置改为上传图片,会出现一个问题: github上图片已上传成功,但是本地Typora的图片不显示,这里进行配置: 文件——>偏好设…

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记 反正都有学不完的技术,不如就学一学clickhouse吧 文章目录 clickhouse学习笔记clickhouse的特点1.列式存储2. DBMS 的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行 clickhouse安装1.关闭防火墙2.CentOS 取消打开文件数限制3.安装依…

一台PoE交换机可以为多少个设备提供供电?

如今在安防监控领域,许多网络设备都支持PoE供电。在网络监控工程中,为了节省布线成本并提高便捷性,大多数工程商选择使用PoE供电方案,也就是使用PoE交换机为监控摄像头提供电力。那么,一台功率输出以太网(P…

【C++】STL之适配器---用deque实现栈和队列

目录 前言 一、deque 1、deque 的原理介绍 2、deque 的底层结构 3、deque 的迭代器 4、deque 的优缺点 4.1、优点 4.2、缺点 二、stack 的介绍和使用 1、stack 的介绍 2、stack 的使用 3、stack 的模拟实现 三、queue 的介绍和使用 1、queue 的介绍 2、queue 的使用 3、qu…

八股文死记硬背打脸记

背景 我们都知道,再编程领域数据结构的重要性,常见的数据结构包括 List、Set、Map、Queue、Tree、Graph、Stack 等,其中 List、Set、Map、Queue 可以从广义上统称为集合类数据结构。而Java也提供了很多的集合数据结构以供开发者开箱即用&…

IC芯片测试:如何对芯片静态功耗进行测试?

静态功耗也叫静态电流,是指芯片在静止状态下的电流或者是指芯片在不受外界因素影响下自身所消耗的电流。静态功耗对于芯片来说是衡量一款芯片的功耗与效率非常重要的指标。 传统手动测试静态功耗只需在芯片的输入端串上一台万用表,然后对芯片各个端口添加…

html学习综合案例1

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>个人简介</title> </head> <body>…

python每日一题(模拟用户登录验证)

1、题目 预先设定正确用户名与密码&#xff0c;用来验证用户是否登录成功。 第一次&#xff1a; ① 输入用户名与密码&#xff0c;如果用户名与密码正确&#xff0c;则提示登录成功&#xff1b; ② 如果用户名错误&#xff08;不管密码是否正确&#xff09;&#xff0c;则需要重…

day02_环境_基础

今日内容 邱世举 - 邱哥 零、复习昨日 一、上课软件 二、GPT 三、Java是个啥 四、安装JDK 五、HelloWorld程序[重点] 六、编码规范 附录: 单词 零、 复习昨日 一、常用软件 看视频 PotPlayer 轻便,无级变速 内网通 局域网,聊天办公,传资料 notepad notepad 升级版记事本,看代码…

计算机网络常见问题

1.谈一谈对OSI七层模型和TCP/IP四层模型的理解&#xff1f; 1.1.为什么要分层&#xff1f; 在计算机中网络是个复杂的系统&#xff0c;不同的网络与网络之间由于协议&#xff0c;设备&#xff0c;软件等各种原因在协调和通讯时容易产生各种各样的问题。例如&#xff1a;各物流…

技术分享| anyRTC音视频混流技术解析

一&#xff0c;简介 在视频通讯场景中&#xff0c;比如会议、直播等经常能看到图像合成的场景。图像合成是在指定的一块画面区域&#xff0c;在这个区域内&#xff0c;按画面的位置(坐标)布局&#xff0c;将区域中的每个视频画面的像素混合计算成一个像素&#xff08;RGB&…

【Linux基础】第29讲 Linux用户和用户组权限控制命令(一)

1 useradd 添加新用户 &#xff08;注意&#xff1a;当前用户必须有添加用户的权限&#xff09; 1&#xff09;基本语法 useradd 用户名&#xff08;功能描述&#xff1a;添加新用户&#xff09; 2&#xff09;案例 rootsue-virtual-machine:/usr/local# useradd hadoop 2 …

Python线程和进程

1、深度解析Python线程和进程 一篇文章带你深度解析Python线程和进程 - 知乎使用Python中的线程模块&#xff0c;能够同时运行程序的不同部分&#xff0c;并简化设计。如果你已经入门Python&#xff0c;并且想用线程来提升程序运行速度的话&#xff0c;希望这篇教程会对你有所帮…

安装Anaconda与pytorch,在IDEA中配置环境进行编程

1.官网下载与自己python版本匹配的Anaconda(注意&#xff0c;要想成功安装pytorch&#xff0c;python版本也要对应pytorch的相关版本) Anaconda官网最新版本 与自己python版本不否请查找自己版本anaconda版本对应 清华大学镜像下载 2.安装时勾选添加环境变量或者手动添加&am…

Unity丨自动巡航丨自动寻路丨NPC丨

文章目录 概要功能展示技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 本文功能是制作一个简单的自动巡逻的NPC&#xff0c;随机自动寻路。 功能展示 技术细节 using UnityEngine;public class NPCController : MonoBehaviour {public float moveSpeed 5.0f; // …

【验证码逆向专栏】螺丝帽人机验证逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

Springboot 集成 Ehcache操作数据库显示SQL语句设置

Springboot 集成 Ehcache操作数据库显示SQL语句设置 2023-09-13 23:33:35.030 INFO 6124 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2023-09-13 23:33:35.124 INFO 6124 --- [ …

几个国内可用的强大的GPT工具

前言&#xff1a; 人工智能发布至今&#xff0c;过去了九个多月&#xff0c;已经成为了我们不管是工作还是生活中一个重要的辅助工具&#xff0c;大大提升了效率&#xff0c;作为一个人工智能的自然语言处理工具&#xff0c;它给各大行业的提供了一个巨大的生产工具&#xff0c…

2023华为杯研究生数学建模C题分析

完整的分析查看文末名片获取&#xff01; 问题一 在每个评审阶段&#xff0c;作品通常都是随机分发的&#xff0c;每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比性&#xff0c;不同专家评审的作品集合之间应有一些交集。但有的交集大了&#xff0c;则…