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.rhkb.cn/news/138639.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react实现列表滚动组件

1.需求 在开发项目的时候,从服务端获取到数据列表后,展示给用户看:需要实现数据自动滚动效果,怎么实现呢?如下图所示: 2.实现 把上面需要实现的功能写成一个组件,页面直接调用该组件即可&#x…

计算机视觉与深度学习-经典网络解析-AlexNetZFNetVGGGoogLeNetResNet[北邮鲁鹏]

目录标题 参考文章LeNet5AlexNet参考文章AlexNet模型结构AlexNet共8层:AlexNet运作流程 简单代码实现重要说明重要技巧主要贡献 ZFNet主要改进减小第一层卷积核将第二、第三个卷积层的卷积步长都设置为2增加了第三、第四个卷积层的卷积核个数 VGG参考VGG网络贡献使用…

锐捷交换机vlan隔离(wifi段仅能访问外网,和内网隔离)

因为公司的wifi段,未做隔离,无意间上了网,发现能访问内网网段,这里内网是10、20段,管理网段是100段,于是做了和内网的vlan隔离。 拓朴如下,所有vlan的网关都起在核心上,核心上起了DH…

批量调整视频饱和度和色度,提升你的视频剪辑效率!

作为一名视频剪辑师,你是否经常为如何高效地调整多个视频的饱和度和色度而烦恼?现在,我们为你提供了一种简单、快速、准确的方法,帮助你轻松解决这个问题! 首先我们要进入好简单批量智剪,并在左侧的板块栏…

iPhone15拉胯,国产手机用折叠屏大反攻!

文 | 智能相对论 作者 | K星 iPhone偷懒式的15代机型发布,让市场大跌眼镜,虽然在莫名的宗教虔诚下依旧卖得很好,但苹果走下神坛之巅已经板上钉钉。 但是,苹果从最高处摔落,却依旧在神坛之上,iPhone15拉胯…

K8s的网络——Underlay和Overlay网络

0. 基础知识 1)网络7层基础知识 在网络7层协议基础里, 第一层物理链路;第二层是数据链路层,在第一层的基础上引入MAC地址做数据转发。MAC地址在局域网内具有唯一性,主机A发送数据时,会向局域网内进行广播…

九、【漏洞复现】Struts 2 远程代码执行漏洞s2-046(CVE-2017-5638)

九、【漏洞复现】Struts 2 远程代码执行漏洞s2-046(CVE-2017-5638) 9.1、漏洞原理 Struts 2是一个基于MVC设计模式的Web应用框架,本质上相当于一个Servlet,在MVC设计模式中,Struts2作为控制器来建立模型与视图进行数据交互。 攻…

GE IS420UCSCH2A-C-V0.1-A模拟量输入模块

GE IS420UCSCH2A-C-V0.1-A 模拟量输入模块是一种用于数据采集和监测的电子模块,通常应用于工业控制系统、监测设备和自动化系统中。以下是可能与该模拟量输入模块相关的一些产品特点: 多通道输入: GE IS420UCSCH2A-C-V0.1-A 模拟量输入模块通…

npm发布vue3自定义组件库--方法一

npm发布vue3自定义组件库 创建项目 vue create test-ui自定义组件 创建自定义组件,组件名称根据你的需求来,最好一个组件一个文件夹,下图是我的示例。 src/components 组件和你写页面一样,所谓组件就是方便实用,不…

2023上半年薪资报告出炉!人均月入过万?!

最近,大家都有听到经济回暖的消息吧?经过三年口罩大考之后,2023年上半年各行各业都迎来复苏,关于职场的话题讨论也不绝于耳。 现在就业环境如何?哪些行业更有前途?大家在求职时是选择一线城市还是回二、三…

四川玖璨电子商务有限公司专注抖音电商运营

四川玖璨电商是一个靠谱的抖音培训公司,在电商行业内有着广泛的知名度和良好的口碑。该公司通过多年的发展,形成了独特的运营理念和有效的运营策略,为商家提供了一站式的抖音电商运营服务。 首先,四川玖璨电子商务有限公司注重与…

【c语言】贪吃蛇

当我们不想学习新知识的时候,并且特别无聊,就会突然先看看别人怎么写游戏的,今天给大家分享的是贪吃蛇,所需要的知识有结构体,枚举,以及easy-x图形库的一些基本函数就完全够用了,本来我想插入游…

「聊设计模式」之 设计模式的前世今生

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅! 大家下午好,我是bug菌,今天我们继续聊设…

服务网格和性能优化:介绍如何通过服务网格提高微服务架构的性能和可扩展性

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

RS485以及MODBUS学习

学习目的: 1、什么是485? 2、485如何通信? 3、如何使用熟能生巧? RS485是一种四总线通信,分别是VCC、GND、485_A、485_B。两根负责通信,两根负责进行供电。 RS485通信 硬件层:解决的是数据传输问…

为什么伦敦金获得连续盈利这么难

相信在伦敦金市场中投资的投资者都有这个感受,我们很容易在市场中获取力量利润,但是要长期的在市场中稳定的盈利,持续不断地获利,这对很多投资者来说都有点难,可以这么说,稳定盈利是普通投资者一个阶段性的…

Spring Boot 各版本的支持时间

1. Spring Boot 各版本的支持时间 Spring Boot 2.7 的版本,支持到2023-11-18,之后就要停止支持了。 按照官网的数据,3.0 的版本也是到2023年11月就停止支持了。如果要转到SpringBoot3,直接从3.1开始吧。到写这篇文章时&#xff…

霍夫曼编码,计算霍夫曼编码树(数字图像处理大题复习 P7)

文章目录 计算出 x1~x6 的树计算 x1~x6 的编码得出霍夫曼编码 w1~w6 计算出 x1~x6 的树 我们先对 x1~x6 进行排序把最底下的加起来,上面写0 下面写1 然后一层一层加上去,注意加上去以后要 重新排序 计算 x1~x6 的编码 举例,从 x5 出发&…

性能测试监控指标及分析调优 | 京东云技术团队一、哪些因素会成为系统的瓶颈?

1. 什么是MAF和MEF? MEF和MEF微软官方介绍:Managed Extensibility Framework (MEF) - .NET Framework | Microsoft Learn MEF是轻量化的插件框架,MAF是复杂的插件框架。 因为MAF有进程隔离和程序域隔离可选。我需要插件进程隔离同时快速传递数据&…

基于Spring Boot的网上购物商城系统

目录 前言 一、技术栈 二、系统功能介绍 用户功能模块的实现 管理员功能模块的实现 商家功能模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上购物商城系统,…