python图像处理库-PIL(Pillow)

PIL库全称为Python Imaging Library,即Python图像处理库,是一个在Python中用于处理图像的非常流行的库。

一、PIL介绍

这个库提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。
核心图像库旨在快速访问存储在几种基本像素格式中的数据。为通用图像处理工具提供坚实的基础。

官网地址: https://pillow.readthedocs.io/en/stable/installation/index.html

主要功能:

  1. 图像归档
    Python图像库非常适合图像归档和批量处理应用。您可以使用该库创建缩略图、在文件格式之间进行转换、打印图像等。当前版本能够识别和读取大量的格式。写入支持有意限制在最常用的交换和展示格式。
  2. 图像显示
    当前版本包括Tk PhotoImage和BitmapImage接口,以及可以与PythonWin和其他基于Windows的工具包一起使用的Windows\DIB接口。许多其他GUI工具包也附带了某种PIL支持。对于调试,还有一个show()方法,该方法将图像保存到磁盘,并调用外部显示实用程序。
  3. 图像处理
    库包含基本的图像处理功能,包括点操作、使用一系列内置卷积核进行过滤以及颜色空间转换。该库还支持图像缩放、旋转和任意仿射变换。

二、Image类介绍

PIL库中最重要的类就是Image类,它定义在同名模块中。可以通过几种方式创建此类的实例;要么从文件加载图像,处理其他图像,或者从头开始创建图像。从文件加载图像时,使用 Image 模块中的 open() 函数
源码:

def open(fp, mode="r", formats=None):"""Opens and identifies the given image file.This is a lazy operation; this function identifies the file, butthe file remains open and the actual image data is not read fromthe file until you try to process the data (or call the:py:meth:`~PIL.Image.Image.load` method).  See:py:func:`~PIL.Image.new`. See :ref:`file-handling`.:param fp: A filename (string), pathlib.Path object or a file object.The file object must implement ``file.read``,``file.seek``, and ``file.tell`` methods,and be opened in binary mode.:param mode: The mode.  If given, this argument must be "r".:param formats: A list or tuple of formats to attempt to load the file in.This can be used to restrict the set of formats checked.Pass ``None`` to try all supported formats. You can print the set ofavailable formats by running ``python3 -m PIL`` or usingthe :py:func:`PIL.features.pilinfo` function.:returns: An :py:class:`~PIL.Image.Image` object.:exception FileNotFoundError: If the file cannot be found.:exception PIL.UnidentifiedImageError: If the image cannot be opened andidentified.:exception ValueError: If the ``mode`` is not "r", or if a ``StringIO``instance is used for ``fp``.:exception TypeError: If ``formats`` is not ``None``, a list or a tuple."""

参数说明:

  • fp: 文件名(字符串)、pathlib.Path对象或文件对象。file.read、file.seek和file.tell方法,并且必须以二进制模式打开。

  • mode: 模式。如果给出,此参数必须为"r"。

  • formats: 尝试加载文件的一系列格式列表或元组。这可用于限制检查的格式集合。传递None以尝试所有受支持的格式。

from PIL import Imageim = Image.open("./images/img.png")print(im.format, im.size, im.mode)
# 此函数将返回一个Image对象。可以使用实例属性来检查文件内容:
# PNG (640, 464) RGBA
  • format属性标识图像的来源。如果图像不是从文件中读取的,则设置为 None。
  • size属性是一个包含宽度和高度(以像素为单位)的 2-元组。
  • mode属性定义了图像中的波段数量和名称,以及像素类型和深度。常见的模式有“L”(亮度)用于灰度图像,“RGB”用于真彩色图像,以及“CMYK”用于预印刷图像。
    • R: Red(红色)
    • G: Green(绿色)
    • B: Blue(蓝色)
    • A: Alpha(透明度)

如果文件无法打开,则会触发OSError异常。
一旦拥有Image类的实例,就可以使用此类定义的方法来处理和操作图像。例如,加载图像:
注意:标准版本的show()效率不是很高,因为它会将图像保存到临时文件并调用实用程序来显示图像。

im.show())

在这里插入图片描述

三、读取和写入图像

Python Imaging Library 支持多种图像文件格式。要从磁盘读取文件,使用Image 模块中的open()函数。无需知道文件格式即可打开文件。库将根据文件内容自动确定格式。
要保存文件,使用Image类的save()方法。在保存文件时,名称变得重要。除非指定格式,否则库将使用文件扩展名来确定要使用哪种文件存储格式。

1. 将文件转换为 JPEG

from PIL import Imageim = Image.open("./images/word_image1.png")
# 文件转为jpge
im.save('./images/img.jpg')

save() 方法可以提供第二个参数,明确指定文件格式。

2. 创建 JPEG 缩略图

from PIL import Imageim = Image.open("./images/word_image1.png")
im.thumbnail((128,128))
im.save('./images/img.thumbnail', "JPEG")

注意: 除非需要,否则库不会对光栅数据进行解码或加载。当打开文件时,会读取文件头以确定文件格式并提取诸如模式、大小以及其他所需的属性,但直到稍后才处理其余的文件。

这意味着打开图像文件是一个快速操作,与文件大小和压缩类型无关。

3. 识别图像文件

from PIL import Imageim = Image.open("./images/word_image1.png")# 识别图像
with im as img:print('./images/word_image1.png', img.format, f"{img.size}x{img.mode}")
# ./images/word_image1.png PNG (2218, 582)xRGB

四、裁剪、粘贴和合并图像

Image 类包含允许操作图像内区域的方法。要从图像中提取子矩形,使用copy()方法。

1. 从图像中复制一个子矩形

box = (100, 100, 400, 400)
region = im.crop(box)

该区域由一个元组定义,其中坐标为 (左,上,右,下)。Python Imaging Library 使用的坐标系统以 (0, 0) 在左上角。坐标指的是像素之间的位置,因此上述示例中的区域正好是 300x300 像素。
该区域可以以某种方式进行处理并粘贴回去。

2. 处理子矩形

region = region.transpose(Image.Transpose.ROTATE_180)
im.paste(region, box)

在这里插入图片描述

粘贴区域回去时,区域的大小必须与给定区域完全匹配。此外,区域不能超出图像范围。然而,原始图像和区域的模式无需匹配。如果它们不匹配,区域将在粘贴前自动转换。

3. 滚动图像

def roll(im, delta):"横向滚动图像。"xsize, ysize = im.sizedelta = delta % xsizeif delta == 0:return impart1 = im.crop((0, 0, delta, ysize))part2 = im.crop((delta, 0, xsize, ysize))im.paste(part1, (xsize - delta, 0, xsize, ysize))im.paste(part2, (0, 0, xsize - delta, ysize))return imim.show()
im1 = roll(im, 200)
im1.show()

4. 合并图像

def merge(im1, im2):w = im1.size[0] + im2.size[0]h = max(im1.size[1], im2.size[1])im = Image.new("RGBA", (w, h))im.paste(im1)im.paste(im2, (im1.size[0], 0))return imim = Image.open("./images/img.png")
im2 = Image.open('./images/img_1.png')merge_img = merge(im, im2)
merge_img.show()

在这里插入图片描述

对于更高级的技巧,paste()方法还可以接受一个透明度蒙版作为可选参数。在这个蒙版中,值 255 表示粘贴的图像在该位置是不透明的(即,应使用粘贴的图像)。值 0 表示粘贴的图像完全透明。中间值表示不同程度的透明度。例如,粘贴一个 RGBA 图像并同时使用它作为蒙版会粘贴图像的不透明部分,但不包括其透明背景。
Python Imaging Library 还允许使用多波段图像的各个波段,例如 RGB 图像。split()方法创建一组新图像,每个图像包含原始多波段图像的一个波段。merge 函数采用一个模式和图像元组,并将它们合并成一张新图像。以下示例交换了一个 RGB 图像的三个波段:

5. 分割和合并波段

r, g, b, a = im.split()im = Image.merge("RGBA", (b, g, r, a))
im.show()

在这里插入图片描述

对于单波段图像,split() 返回图像本身。要使用单独的颜色波段,需要先将图像转换为“RGB”。

五、几何变换

PIL.Image.Image 类包含 resize() 和 rotate() 图像的方法。前者接受一个元组,给出新的大小,后者是逆时针角度。

1. 简单的几何变换

out = im.resize((128, 128))
out = im.rotate(45) # 逆时针度数

在这里插入图片描述

2. 转置图像

要以 90 度的步长旋转图像,可以使用rotate()方法或transpose() 方法。后者也可以用来围绕图像的水平或垂直轴翻转图像。

out = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
out = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
out = im.transpose(Image.Transpose.ROTATE_90)
out = im.transpose(Image.Transpose.ROTATE_180)
out = im.transpose(Image.Transpose.ROTATE_270)

在这里插入图片描述

其中值的含义:

  • FLIP_LEFT_RIGHT:水平翻转图像,意味着图像的内容会在水平方向上镜像,就像照镜子一样,左边的内容会出现在右边,右边的出现在左边。
  • FLIP_TOP_BOTTOM:垂直翻转图像,图像的内容会在垂直方向上镜像,顶部的内容会移到底部,底部的移到顶部。
  • ROTATE_90:顺时针旋转图像90度。
  • ROTATE_180:顺时针旋转图像180度。
  • ROTATE_270:顺时针旋转图像270度,或等价地说逆时针旋转90度。
  • TRANSPOSE:交换图像的宽度和高度,相当于顺时针旋转90度后再水平翻转,或逆时针旋转270度。
  • TRANSVERSE:交换图像的宽度和高度后,再垂直翻转,相当于顺时针旋转270度后再水平翻转,或逆时针旋转90度。

transpose(ROTATE) 操作也可以通过rotate() 操作以相同的方式执行,前提是 expand标志为 true,以提供对图像大小的相同更改。
可以通过transform() 方法执行更通用的图像转换。

3. 调整大小

除了在调整大小时计算新图像的大小外,还可以选择相对于给定大小进行调整大小。

size = (100, 150)
with im as im:ImageOps.contain(im, size).save("./images/imageops_contain.png")ImageOps.fit(im, size).save("./images/imageops_fit.png")ImageOps.pad(im, size, color="#f00").save("./images/imageops_pad.png")

在这里插入图片描述

ImageOps的方法:

  1. ImageOps.contain(im, size):
    • 含义:这个方法会按比例缩放图像,使其完全适合给定的size(宽度和高度),同时保持原始图像的宽高比。与size相比,图像可能不会填满整个指定区域,但图像内容将完整无裁剪地显示在新的尺寸内。
  2. ImageOps.fit(im, size):
    • 含义:此方法会缩放图像,使其适应给定的size,同时保持原始的宽高比。与contain不同,fit允许指定一个具体的缩放方法(默认是双线性插值),并且可以选择是否在必要时裁剪图像,以确保输出图像的尺寸严格等于指定的尺寸。
  3. ImageOps.pad(im, size, color=“#f00”):
    • 含义:这个方法会在图像周围添加一个颜色填充的边框,使最终的图像尺寸符合size要求。如果原图尺寸大于指定尺寸,则会对图像进行居中裁剪至指定大小,然后在四周加上指定颜色的边框。color参数定义了边框的颜色,这里的"#f00"代表纯红色。

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

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

相关文章

元数据:数据的罗塞塔石碑

在大数据时代,我们每天都在生成和处理海量数据。但数据本身,如果没有适当的上下文和描述,就像是一堆没有翻译的古老文字。这就是元数据发挥作用的地方——它是大数据世界的罗塞塔石碑,为我们提供了理解和利用数据的关键。 文章目录…

计算机组成原理之存储器(一)

文章目录 存储器概述存储器的分类情况按照存储器在系统中的作用分类按存储介质分类按存取方式分类 主存储器的技术指标 存储器概述 程序的局部性原理(构成多级存储系统的依据):在某一个时间段你频繁访问某一局部的存储器地址空间,…

Excel加密怎么设置?这5个方法不容错过!(2024总结)

Excel加密怎么设置?如何不让别人未经允许查看我的excel文件?如果您也有这些疑问,那么千万不要错过本篇文章了。今天小编将向大家分享excel加密的5个简单方法,保证任何人都可以轻松掌握!毫无疑问的是,为Exce…

长短期记忆神经网络(LSTM)的回归预测(免费完整源代码)【MATLAB】

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊类型的递归神经网络(RNN),专门用于处理和预测基于时间序列的数据。与传统RNN相比,LSTM在处理长期依赖问题时具有显著优势。 LSTM的基本…

【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 ​ 目录 一、问题描述 二、解题思路 方法一:数学公式推导法 方法…

LaTeX 的使用

文章目录 TeX 编辑器文档类型中文编译文档结构preamble 导言区(不能放正文内容)document body 正文区 正文内容目录段落列表无序列表有序列表 图片表格交叉引用段落图片表格 转义符 数学公式数学符号行内公式行间公式有公式计数器无公式计数器 公式包含文…

Python 全栈系列254 异步服务与并发调用

说明 发现对于异步(IO)还是太陌生了,熟悉一下。 内容 今天搞了一整天,感觉有一个long story to tell,但是不知道从何说起,哈哈。 异步(协程)需要保证链路上的所有环节都是异步(协程)的,任何一个环节没这么做都会导致…

YOLOv10涨点改进轻量化双卷积DualConv,完成涨点且计算量和参数量显著下降

本文独家改进:双卷积由组卷积和异构卷积组成,执行3x3 和 1x1 卷积运算Q代替其他卷积核仅执行 1x1 卷积。 DualIConv 显着降低了深度神经网络的计算成本和参数数量,同时在某些情况下令人惊讶地实现了比原始模型略高的精度。 我们使用 DualConv 将轻量级 MobileNetV2 的参数数量…

Linux驱动面试题

1.导出符号表的原理? 2.字符设备驱动的框架流程 open read wirte close 是系统调用(从用户空间进入内核空间的唯一的方法)会产生swi软中断《也会存在软中断号》(从User模式切换到SVC(管理模式)下因为在…

你还不会选ProfiNET和EtherCAT网线?

在现代工业自动化领域,ProfiNET和EtherCAT是两种非常流行的通信协议。选择合适的网线对于确保通信的稳定性和效率至关重要。 ProfiNET是什么? ProfiNET是一种基于以太网的通信协议,由德国西门子公司开发。它支持实时通信,广泛应用…

商超智能守护:AI监控技术在零售安全中的应用

结合思通数科大模型的图像处理、图像识别、目标检测和知识图谱技术,以下是详细的商超合规监测应用场景描述: 1. 员工仪容仪表监测: 利用图像识别技术,系统可以自动检测员工是否按照规范整理妆容、穿着工作服,以及是否…

大学课设项目,Windows端基于UDP的网络聊天程序的服务端和客户端

文章目录 前言项目需求介绍一、服务端1.对Udp套接字进行一个封装2. UdpServer的编写3. Task.h4.protocol.h的编写5.线程池的编写6.main.cc 二、客户端1. Socket.h2.protocol.h3.UdpClient4.menu.h5.main.cpp 三、运行图 前言 本次项目可以作为之前内容的一个扩展,学…

003 gitee怎样将默认的私有仓库变成公开仓库

先点击“管理”, 再点击“基本信息” 在“是否开源”里, 选择:开源

python文件操作、文件操作、读写文件、写模式

with读取文件数据内容 with open(filepath,mode,encoding) as file:#具体操作,例如:print(file.read())#查看文件所有的内容。 with:Python中的一个上下文管理器,用于简化资源的管理和释放。它可以用于任意需要进行资源分配和释放的情境…

使用 Azure AI Document Intelligence 创建智能文档处理

简介 借助 Azure AI 文档智能中的预生成模型,无需自行训练模型,即可从常见表单和文档中提取数据。 公司中,表单种类繁多,如发票、收据、调查表等。你可能想知道,从这些文档中提取姓名、地址、金额等信息需要多少工作…

APaaS:智能制造助手

资金不足、IT基础架构薄弱...... 车间业务需求不断地在增加...... 都在说数字化,都在说转型...... 随着企业竞争的日益激烈和市场环境的快速变化,企业需要一个灵活、高效、快速响应市场变化的新平台。在这样的背景下,APaaS应运而生&#x…

RocketMQ快速入门:集成java客户端实现各类消息发送|异步、同步、顺序、单向、延迟、事务(五)附带源码

0. 引言 前面的章节中,我们已经针对rocketmq的基本概念和消息发送、消费流程进行了讲解,但实际在开发中如何实现rocketmq的接入、实现消息发送、消费还没有落实,那么今天,我们继续来学习如何基于java client集成rocketMQ 1. 集成…

火车头采集中英文翻译教程

火车头采集怎么实现数据中文翻译成英文,或英文翻译成中文? 火车头采集没有自带的翻译功能,但可以使用插件功能来实现:导入翻译插件(例如谷歌翻译插件,百度翻译插件等),然后在火车头…

视频媒介VS文字媒介

看到一篇蛮有思考意义的文章就摘录下来了,也引起了反思 目录 一、视频的定义 二、”视频媒介“与”文字媒介”作对比 1.形象 VS 抽象 2.被动 VS 主动 三、视频的缺点-【更少】的思考 1.看视频为啥会导致【更少的思考】 2.内容的【浅薄化】 3.内容的【娱乐化…

【尚庭公寓SpringBoot + Vue 项目实战】用户管理(十五)

【尚庭公寓SpringBoot Vue 项目实战】用户管理(十五) 文章目录 【尚庭公寓SpringBoot Vue 项目实战】用户管理(十五)1、业务介绍2、接口实现2.1、根据条件分页查询用户列表2.2、根据ID更新用户状态 1、业务介绍 用户管理共包含两…