当前位置: 首页 > news >正文

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"代表纯红色。

相关文章:

python图像处理库-PIL(Pillow)

PIL库全称为Python Imaging Library,即Python图像处理库,是一个在Python中用于处理图像的非常流行的库。 一、PIL介绍 这个库提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。 核心图像库旨在快速访问存储在几种基本像素格式中的数…...

【2024】kafka streams的详细使用与案例练习(2)

目录 前言使用1、整体结构1.1、序列化 2、 Kafka Streams 常用的 API2.1、 StreamsBuilder2.2、 KStream 和 KTable2.3、 filter和 filterNot2.4、 map 和 mapValues2.5、 flatMap 和 flatMapValues2.6、 groupByKey 和 groupBy2.7、 count、reduce 和 aggregate2.8、 join 和 …...

qt 简单实验 读取json格式的配置文件

1.概要 2.代码 //#include "mainwindow.h"#include <QApplication> #include <QFile> #include <QJsonDocument> #include <QJsonObject> #include <QDebug> //读取json数据的配置文件QJsonObject readJsonConfigFile(const QString …...

Docker常用命令与实战示例

docker 1. 安装2. 常用命令3. 存储4. 网络5. redis主从复制示例6. wordpress示例7. DockerFile8. 一键安装超多中间件&#xff08;compose&#xff09; 1. 安装 以centOS系统为例 # 移除旧版本docker sudo yum remove docker \docker-client \docker-client-latest \docker-c…...

数据结构(基础知识)

基础概念&#xff1a; 数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数&#xff0c;字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合 数据元素&#xff1a;是数据的基本单位&#xff0c;在程序中常作为一个整体来考虑 数据对象&#…...

计算机网络:网络层 - 路由选择协议

计算机网络&#xff1a;网络层 - 路由选择协议 路由器的结构路由选择协议概述自治系统 AS内部网关协议路由信息协议 RIP距离向量算法RIP报文格式收敛问题 开放最短路径优先 OSPF基本工作原理自治系统分区 外部网关协议BGP-4 路由器的结构 如图所示&#xff0c;路由器被分为路由…...

JupyterLab使用指南(六):JupyterLab的 Widget 控件

1. 什么是 Widget 控件 JupyterLab 中的 Widget 控件是一种交互式的小部件&#xff0c;可以用于创建动态的、响应用户输入的界面。通过使用 ipywidgets 库&#xff0c;用户可以在 Jupyter notebook 中创建滑块、按钮、文本框、选择器等控件&#xff0c;从而实现数据的交互式展…...

OpenCV 特征点检测与匹配

一 OpenCV特征场景 ①图像搜索&#xff0c;如以图搜图&#xff1b; ②拼图游戏&#xff1b; ③图像拼接&#xff0c;将两长有关联得图拼接到一起&#xff1b; 1 拼图方法 寻找特征 特征是唯一的 可追踪的 能比较的 二 角点 在特征中最重要的是角点 灰度剃度的最大值对应的…...

css布局之flex应用

/*父 100*/.parent-div {/* 这里添加你想要的属性 */display: flex;flex-direction: row; //行justify-content: space-between; //左右对齐align-items: center;flex-wrap: wrap; //换行}/*中 90 10 */.middle-div {/* 这里添加你想要的属性 */display: flex;flex-direction:…...

树莓派4B设置AP热点步骤

树莓派4B设置AP热点步骤&#xff1a;先进入root模式 预先进行apt-get update 第1步&#xff1a;安装network-manager ​sudo apt-get install network-manager第2步&#xff1a;安装git apt-get install git apt-get install util-linux procps hostapd iproute2 iw haveged …...

Java程序之百鸡百钱问题

题目&#xff1a; 百钱买百鸡的问题算是一套非常经典的不定方程的问题&#xff0c;题目很简单&#xff1a;公鸡5文钱一只&#xff0c;母鸡3文钱一只&#xff0c;小鸡3只一文钱&#xff0c;用100文钱买一百只鸡,其中公鸡&#xff0c;母鸡&#xff0c;小鸡都必须要有&#xff0c;…...

Mybatis——动态sql

if标签 用于判断条件是否成立。使用test属性进行条件判断&#xff0c;如果条件为true&#xff0c;则拼接sql。 <where>标签用于识别语句是否需要连接词and&#xff0c;识别sql语句。 package com.t0.maybatisc.mapper;import com.t0.maybatisc.pojo.Emp; import org.a…...

可视化大屏开发系列——页面布局

页面布局是可视化大屏的基础&#xff0c;想要拥有一个基本美观的大屏&#xff0c;就得考虑页面整体模块的宽高自适应&#xff0c;我们自然就会想到具有强大灵活性flex布局&#xff0c;再借助百分比布局来辅助。至此&#xff0c;大屏页面布局问题即可得到解决。 可视化大屏开发系…...

Python statistics 模块

Python 的 statistics 模块提供了一组用于执行各种统计计算的函数&#xff0c;包括平均值、中位数、标准差、方差以及其他统计量。让我来简单介绍一下。 首先&#xff0c;你可以使用以下方式导入 statistics 模块&#xff1a; python import statistics 接下来&#xff0c;…...

wireshark常见使用表达式

目录 1. 捕获过滤器 (Capture Filters)基本捕获过滤器组合捕获过滤器 2. 显示过滤器 (Display Filters)基本显示过滤器复杂显示过滤器协议特定显示过滤器 3. 进阶显示过滤器技巧使用函数和操作符逻辑操作符 4. 常见网络协议过滤表达式示例HTTP 协议HTTPS 协议DNS 协议DHCP 协议…...

用Java获取键盘输入数的个十百位数

这段Java代码是一个简单的程序&#xff0c;用于接收用户输入的一个三位数&#xff0c;并将其分解为个位、十位和百位数字&#xff0c;然后分别打印出来。下面是代码的详细解释&#xff1a; 导入所需类库: import java.util.Scanner;&#xff1a;导入Scanner类&#xff0c;用于从…...

第10章 启动过程组 (制定项目章程)

第10章 启动过程组 9.1制定项目章程&#xff0c;在第三版教材第356~360页&#xff1b; 文字图片音频方式 视频12 第一个知识点&#xff1a;主要输出 1、项目章程&#xff08;重要知识点&#xff09; 项目目的 为了稳定与发展公司的客户群(抽象&#xff0c;非具体) 可测量的项目…...

html侧导航栏客服栏

ico 替换 ICO <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>返回顶部</title><script src"js/jquery-2.0.3.min.js"…...

Clonable接口和拷贝

Hello~小伙伴们&#xff01;本篇学习Clonable接口与深拷贝&#xff0c;一起往下看吧~(画图水平有限&#xff0c;两张图&#xff0c;&#xff0c;我真的画了巨久&#xff0c;求路过的朋友来个3连~阿阿阿~~~) 目录 1、Clonable接口概念 2、拷贝 2、1浅拷贝 2、2深拷贝 1、Clon…...

关于小蛋の编程和小蛋编程为同一作者的说明

小蛋の编程和小蛋编程的作品为同一人制作&#xff0c;因前者为父母的手机号进行注册&#xff0c;现用本人手机号注册了新账号小蛋编程&#xff0c;后续文章将在新账号小蛋编程上进行刊登&#xff0c;同时在小蛋编程上对原账号文章进行转载。此账号不再发布帖子&#xff0c;请大…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...