图像库 PIL(一)

Python 提供了 PIL(python image library)图像库,来满足开发者处理图像的功能,该库提供了广泛的文件格式支持,包括常见的 JPEG、PNG、GIF 等,它提供了图像创建、图像显示、图像处理等功能。

基本概念

要学习 PIL 图像库的使用,我们必须先来了解一些关于图像的基本概念,包括深度(depth),通道(bands),模式(mode),坐标系统(coordinate system)等。

图像的深度

图像中像素点占得 bit 位数,就是图像的深度,比如:

二值图像:图像的像素点不是0就是1 (图像不是黑色就是白色),图像像素点占的位数就是1位,图像的深度就是1,也称作位图。

灰度图像:图像的像素点位于0-255之间(0代表全黑,255代表全白,在0-255之间插入了255个等级的灰度)。2^8=255,图像像素点占的位数就是8位,图像的深度是8。

依次类推,我们把计算机中存储单个像素点所用的 bit 位称为图像的深度。

图像的通道

每张图像都是有一个或者多个数据通道构成的,如  RGB 是基本的三原色(红色、绿色和蓝色),如果我们用8位代表一种颜色,那么每种颜色的最大值是255,这样,每个像素点的颜色值范围就是(0-255, 0-255, 0-255)。这样的图像的通道就是3。而灰度图像的通道数是1。

图像的模式

图像实际上是像素数据的矩形图,图像的模式定义了图像中像素的类型和深度,每种类型代表不同的深度,在 PIL 中我们称之为图像的模式。常见的模式有以下几种:

1:1位像素,表示黑和白,占8 bit ,在图像表示中称为位图。

L:表示黑白之间的灰度,占8 bit 像素。

P:8位像素,使用调色版映射。

RGB:真彩色,占用 3x8 位像素,其中 R 为红色,G 为绿色,B为蓝色,三原色叠加形成的色彩变化,如三通道都为0则代表黑色,都为255则代表白色。

RGBA:为带透明蒙版的真彩色,其中的 A 为 alpha 透明度,占用 4x8 位像素

其他的还有 CMYK、 YCbCr、I、F等不常用的模式,这里就不多做介绍了。

图像的坐标系

PIL 中图像的坐标是从左上角开始,向右下角延伸,以二元组 (x,y)的形式传递,x 轴从左到右,y 轴从上到下,即左上角的坐标为 (0, 0)。那么矩形用四元组表示就行,例如一个450 x 450 像素的矩形图像可以表示为 (0, 0, 450, 450)。

PIL 的安装

和其他库一样,PIL 的安装也很简单:

pip3 install pillow

PIL 图像模块的功能

打开图像

我们可以从本地目录中打开文件,也可以从文件流中打开图像。打开文件的方法为:

Image.open(file,mode)

读取图像文件,mode 只能是 ‘r’,所以我们也可以省略这个参数。

from PIL import Imagefrom io import BytesIOimport requests# 打开图像文件im = Image.open('cat.jpg')# 从文件流中打开图像r = requests.get('http://f.hiphotos.baidu.com/image/pic/item/b151f8198618367aa7f3cc7424738bd4b31ce525.jpg')im2 = Image.open(BytesIO(r.content))# 展示图像im.show()im2.show()# 翻转90度展示im.rotate(90).show()

我们首先打开本目录下的 cat.jpg 图像,接着从百度图片请求到一张图片,使用文件流的方式打开。使用 show 方法可以展示图像。我们也可以使用 rotate 方法来是图像翻转角度。运行程序,我们会看到弹出三张图片,一张是 cat.jpg 对应的图像,一张是百度图片中的图像,还有一种是将 cat.jpg 翻转90度后展示的图像。

创建图像

Image.new(mode,size,color)

我们可以使用给定的模式、大小和颜色来创建新图像。大小以(宽度,高度)的二元组形式给出,单位为像素;颜色以单波段图像的单个值和多波段图像的元组(每个波段的一个值)给出,可以使用颜色名如 ‘red’ ,也可以受用16进制 '#FF0000' 或者使用数字表示(255,0,0)。​​​​​​​

from PIL import Imageim = Image.new('RGB', (450, 450), (255, 0, 0))im1 = Image.new('RGB', (450, 450), 'red')im2 = Image.new('RGB', (450, 450), '#FF0000')im.show()im1.show()im2.show()

上面例子中我们分别通过三种形式创建了 RGB 模式的大小为 450x450 ,颜色为红色的图像,最终的图像效果是一样的。

转换格式

Image.save(file)

我们直接使用保存方法,修改保存的文件名就可以转换图像的格式。​​​​​​​

from PIL import Image# 加载 cat.jpgim = Image.open('cat.jpg', 'r')# 打印图片类型print(im.format)# 保存为 png 类型图片im.save('cat.png')# 加载新保存的 png 类型图片im2 = Image.open('cat.png', 'r')# 打印新保存图片类型print(im2.format)# 输出结果JPEGPNG

例子中我们先打开 cat.jpg 图像,然后新保存一张类型为 png 的图像,通过打印我们可以看到两者的格式。

创建缩略图

Image.thumbnail(size, resample=3)

修改当前图像制作成缩略图,该缩略图尺寸不大于给定的尺寸。这个方法会计算一个合适的缩略图尺寸,使其符合当前图像的宽高比,调用方法 draft() 配置文件读取器,最后改变图像的尺寸。

size 参数表示给定的最终缩略图大小。

resample 参数是过滤器,只能是 NEAREST、BILINEAR、BICUBIC 或者 ANTIALIAS 之一。如果省略该变量,则默认为 NEAREST。

注意:在当前PIL的版本中,滤波器 BILINEAR 和 BICUBIC 不能很好地适应缩略图产生。用户应该使 用ANTIALIAS,图像质量最好。如果处理速度比图像质量更重要,可以选用其他滤波器。这个方法在原图上进行修改。​​​​​​​

from PIL import Image# 加载图像im = Image.open('cat.png')# 展示图像im.show()# 图像尺寸size = 128, 128# 缩放图像im.thumbnail(size, Image.ANTIALIAS)# 展示图像im.show()

我们将一个 450x450 大小的图像缩放成了 128x128 大小的图像,程序运行的结果如下图:

图片

融合图像

Image.blend(image1, image2, alpha)

将图像 image1 和 图像 im2 根据 alpha 值进行融合,公式为:

out = image1 * (1.0 - alpha) + image2 * alpha

image1 和 image2 表示两个大小和模式相同的图像, alpha 是介于 0 和 1 之间的值。如果 alpha 为0,返回 image1 图像,如果 alpha 为1,返回 image2 图像。​​​​​​​

from PIL import Image# 蓝色图像image1 = Image.new('RGB', (128, 128), (0, 0, 255))# 红色图像image2=Image.new('RGB', (128, 128), (255, 0, 0))# 取中间值im = Image.blend(image1, image2, 0.5)image1.show()image2.show()# 显示紫色图像im.show()

我们将一张蓝色图像和一张红色图像进行融合,融合度为两张图像各0.5,最终得到一张紫色图像(因为红色叠加蓝色会调和成紫色)。显示图像如下图:

图片

像素点处理

Image.eval(image, *args)

根据传入的函数对图像每个像素点进行处理。第一个参数 image 为需要处理的图像对象,第二个参数是函数对象,有一个整数作为参数。

如果变量image所代表图像有多个通道,那么函数作用于每一个通道。注意:函数对每个像素点只处理一次,所以不能使用随机组件和其他生成器。​​​​​​​

from PIL import Imageim = Image.open('cat.jpg')im.show()# 将每个像素值翻倍(相当于亮度翻倍)evl1 = Image.eval(im, lambda x: x*2)evl1.show()# 将每个像素值减半(相当于亮度减半)evl2 = Image.eval(im, lambda x: x/2)evl2.show()

我们分别对图像进行像素值翻倍和减半处理,显示效果如下图:

图片

合成图像

Image.composite(image1, image2, mask)

使用给定的两张图像及 mask 图像作为透明度,创建出一张新的图像。变量 mask 图像的模式可以为“1”,“L” 或者 “RGBA”。所有图像必须有相同的尺寸。​​​​​​​

from PIL import Image# 打开 cat.pngimage1 = Image.open('cat.png')# 打开 flower.jpgimage2 = Image.open('flower.jpg')# 分离image1的通道r, g, b = image1.split()# 合成图像,获得 cat + flowerim = Image.composite(image1, image2, mask=b)image1.show()image2.show()im.show()

上面例子中我们将一张图像猫(cat.png)和一张图像花(flower.jpg),以图像猫的一个通道构成的蒙版进行合成,就像 PS 一样,我们最终得到猫+花的图像,结果如下图所示:

图片

通过单通道创建图像

Image.merge(mode,bands)

将一组单通道图像合并成多通道图像。参数 mode 为输出图像的模式,bands 为输出图像中每个通道的序列。​​​​​​​

from PIL import Imageim = Image.open('cat.png')# 将三个通道分开im_split = im.split()# 分别显示三个单通道图像im_split[0].show()im_split[1].show()im_split[2].show()# 将三个通道再次合并im2 = Image.merge('RGB', im_split)im2.show()# 打开第二张图像im3 = Image.open('flower.jpg')# 将第二张图像的三个通道分开im_split2 = im3.split()# 将第二张图像的第1个通道和第一张图像的第2、3通道合成一张图像rgbs = [im_split2[0], im_split[1], im_split[2]]im4 = Image.merge('RGB', rgbs)im4.show()

上面例子中,我们先将 cat.jpg 图像的三个通道分离成三张图像,效果如下图:

图片

然后我们又将 flower.jpg 图像的三个通道分离,最后分别取 flower.jpg 的 R 通道图像和 cat.jpg 的 G 和 B 通道图像合成一张新图像,最终的效果如下图:

图片

总结

本节为大家介绍了 Python pillow 库中图像有关的几个基本概念,以及 PIL 模块中处理图像的几个常见功能。掌握了这些功能后,我们可以打开、创建图像,也可以对图像做一些常见的如拆分、合成、融合等操作,这些都是图像处理的基础,需要大家好好理解和掌握。

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

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

相关文章

延迟队列的理解与使用

目录 一、场景引入 二、延迟队列的三种场景 1、死信队列TTL对队列进行延迟 2、创建通用延时消息死信队列 对消息延迟 3、使用rabbitmq的延时队列插件 x-delayed-message使用 父pom文件 pom文件 配置文件 config 生产者 消费者 结果 一、场景引入 我们知道可以通过TT…

Mybatis学习|多对一、一对多

有多个学生,没个学生都对应(关联)了一个老师,这叫(多对一) 对于每个老师而言,每个老师都有N个学生(学生集合),这叫(一对多) 测试环境…

[杂谈]-快速了解Modbus协议

快速了解Modbus协议 文章目录 快速了解Modbus协议1、为何 Modbus 如此受欢迎2、范围和数据速率3、逻辑电平4、层数5、网络与通讯6、数据帧格式7、数据类型8、服务器如何存储数据9、总结 ​ Modbus 是一种流行的低速串行通信协议,广泛应用于自动化行业。 该协议由 Mo…

力扣2. 两数相加

2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个…

16 个前端安全知识

16 个前端安全知识 去年 security course 上的是 React,然后学了一些 一些 React 项目中可能存在的安全隐患,今年看了一下列表,正好看到了前端也有更新,所以就把这个补上了。 一个非常好学习各种安全隐患的机构是 https://owasp…

机器学习基础16-建立预测模型项目模板

机器学习是一项经验技能,经验越多越好。在项目建立的过程中,实 践是掌握机器学习的最佳手段。在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的 预测模型项目模板 不能只通过阅读来掌握…

机器学习的第一节基本概念的相关学习

目录 1.1 决策树的概念 1.2 KNN的概念 1.2.1KNN的基本原理 1.2.2 流程: 1.2.3 优缺点 1.3 深度学习 1.4 梯度下降 损失函数 1.5 特征与特征选择 特征选择的目的 1.6 python中dot函数总结 一维数组的点积: 二维数组(矩阵)的乘法&am…

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录 Docker 和 k8s 简介1、kubernetes 组件及其联系1.1 Node1.2 Pod1.3 Service 2、安装docker3、单节点 kubernetes 和 KubeSphere 安装3.1 安装KubeKey3.2 安装 kubernetes 和 KubeSphere3.3 验证安装结果 4、集群版 kubernetes 和 KubeSphere 安装5、kubectl 常用命令6、资…

浅谈下cdn以及防盗链问题

目录 一、什么是cdn 二、使用cdn带来的好处 三、CDN工作原理 四、cdn使用场景 五、流媒体CDN之防盗链问题 一、什么是cdn CDN(Content Delivery Network)是一种分布式网络架构,用于提供高效的内容分发服务。CDN通过将内容缓存在离用户最…

Postgresql JSON对象和数组查询

文章目录 一. Postgresql 9.5以下版本1.1 简单查询(缺陷:数组必须指定下标,不推荐)1.1.1 模糊查询1.1.2 等值匹配1.1.3 时间搜索1.1.4 在列表1.1.5 包含 1.2 多层级JSONArray(推荐)1.2.1 模糊查询1.2.2 模糊查询 NOT1.2.3 等值匹配…

恢复数据的利器:易我数据恢复终身技术版v16.2.0.0

EaseUS Data Recovery Wizard为全球提供数据恢复方案,用于误删数据数据,电脑误删文件恢复,格式化硬盘数据恢复,手机U盘数据恢复等,RAID磁盘阵列数据恢复,分区丢失及其它未知原因丢失的数据恢复,简单易用轻松的搞定数据恢复。 特点描述 - 易我数据恢复中文便携版,无…

STM32f103入门(10)ADC模数转换器

ADC模数转换器 ADC简介AD单通道初始化代码编写第一步开启时钟第二步 RCCCLK分频 6分频 72M/612M第三步 配置GPIO 配置为AIN状态第四步,选择规则组的输入通道第五步 用结构体 初始化ADC第六步 对ADC进行校准编写获取电压函数初始化代码如下 Main函数编写 ADC简介 ADC…

植物根系基因组与数据分析

1.背景 这段内容主要是关于植物对干旱胁迫的反应,并介绍了生活在植物体内外以及根际的真菌和细菌的作用。然而,目前对这些真菌和细菌的稳定性了解甚少。作者通过调查微生物群落组成和微生物相关性的方法,对农业系统中真菌和细菌对干旱的抗性…

windows主机和Ubuntu虚拟机共享设置

参考文章 Ubuntu Linux 与主机共享文件夹 vim 修改文件出现错误 “ E45: ‘readonly’ option is set (add to override)“ vim退出时报错“E212: Cant open file for writing”的解决办法 VMware 安装后,安装Ubuntu 20.04一路顺利。 1,在VMware设置…

Qt应用开发(基础篇)——输入对话框 QInputDialog

一、前言 QInputDialog类继承于QDialog,是一个简单方便的对话框,用于从用户获取单个值。 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签、一个输入框和标准按钮。输入内容可以字符、数字和选项,文本标签用来告诉用户应该要输入…

LAMP介绍与配置

一.LAMP 1.1.LAMP架构的组成 CGI(通用网关接口)和FastCGI(快速公共网关接口)都是用于将Web服务器与后端应用程序(如PHP、Python等)进行交互的协议/接口。 特点 CGI FastCGI 运行方式 每个请求启动…

死信队列理解与使用

一、简介 在rabbitMQ中常用的交换机有三种,直连交换机、广播交换机、主题交换机; 直连交换机中队列与交换机需要约定好routingKey去进行绑定; 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可; 主题交换机最大的特…

​7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)​

C自学精简教程 目录(必读) 作业目标: 这个作业中,你需要综合运用之前文章中的知识,来解决一个相对完整的应用程序。 作业描述: 1 在这个作业中你需要在文本文件中存储学生通讯录的信息,并在程序启动的时候加载这些…

python+requests实现接口自动化测试

这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下。 一、整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类,比如数据库sql…

简单了解网络传输介质

目录 一、同轴电缆 二、双绞线 三、光纤 四、串口电缆 一、同轴电缆 10BASE前面的数字表示传输带宽为10M,由于带宽较低、现在已不再使用。 50Ω同轴电缆主要用来传送基带数字信号,因此也被称作为基带同轴电缆,在局域网中得到了广泛的应用…