python pillow(PIL)库使用介绍

news2024/11/25 13:00:12

Python 图像库向 Python 解释器添加了图像处理功能。

该库提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。

核心图像库旨在快速访问以几种基本像素格式存储的数据。它应该为通用图像处理工具提供坚实的基础。

概述

Python 图像库将图像处理功能添加到 Python 解释器。

该库提供广泛的文件格式支持,高效的内部 表示,以及相当强大的图像处理能力。

核心图像库旨在快速访问存储在少数几个图像中的数据 基本像素格式。它应该为一般图像提供坚实的基础 加工工具。

让我们看一下这个库的一些可能的用途。

图像档案

Python 图像库是图像存档和批处理的理想选择 应用。您可以使用该库创建缩略图,在 文件格式、打印图像等。

当前版本可识别和读取大量格式。写 有意将支持限制在最常用的交换和 演示文稿格式。

图像显示

当前版本包括 Tk 和接口,以及可与 PythonWin 和其他 基于 Windows 的工具包。许多其他 GUI 工具包都带有某种 PIL 支持。

对于调试,还有一种方法可以将图像保存到 磁盘,并调用外部显示实用程序。

图像处理

该库包含基本的图像处理功能,包括点操作、使用一组内置卷积核进行滤波和颜色空间转换。

该库还支持调整图像大小、旋转和任意仿射变换。

有一种直方图方法允许您从图像中提取一些统计数据。这可用于自动对比度增强和全局统计分析。

使用 pip 安装 Pillow:

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade Pillow

(可选)为 Pillow 安装 defusedxml 以读取 XMP 数据, 和 olefile 用于 Pillow 读取 FPX 和 MIC 图像:

python3 -m pip install --upgrade defusedxml olefile

一、适用于 Linux 的二进制文件 ManyLinux wheel 格式的版本。其中包括对所有人的支持 可选库,但 libimagequant 除外。Raqm 支持需要 FriBiDi 单独安装:

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade Pillow

大多数主要的 Linux 发行版,包括 Fedora、Ubuntu 和 ArchLinux 在以前包含 PIL 的包装中也包括 Pillow,例如 .Debian 将其拆分为两个包,以及 .python-imagingpython3-pilpython3-pil.imagetk

二、提供适用于 macOS 的二进制文件 wheel 格式的版本。其中包括对所有可选的支持 除 libimagequant 之外的库。Raqm 支持需要 FriBiDi 单独安装:

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade Pillow

虽然我们为 x86-64 和 arm64 提供二进制文件,但我们不提供 universal2 二进制文件。但是,将我们当前的二进制文件组合起来创建一个文件很简单:

python3 -m pip download --only-binary=:all: --platform macosx_10_10_x86_64 Pillow
python3 -m pip download --only-binary=:all: --platform macosx_11_0_arm64 Pillow
python3 -m pip install delocate

然后,使用下载的轮子的名称,使用 Python 将它们组合起来:

from delocate.fuse import fuse_wheels
fuse_wheels('Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl', 'Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl', 'Pillow-9.4.0-cp39-cp39-macosx_11_0_universal2.whl')

三、Windows 提供 Pillow 二进制文件,为支持的矩阵编译 wheel 格式的 Python。其中包括 x86、x86-64 和 arm64 版本 (arm64 上的 Python 3.8 除外)。这些二进制文件包括支持 对于除 libimagequant 和 libxcb 之外的所有可选库。Raqm 支持 需要单独安装 FriBiDi:

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade Pillow

要在 MSYS2 中安装 Pillow,请参阅Installation - Pillow (PIL Fork) 10.2.0 documentation

使用 Image 类

Python 图像库中最重要的类是类,在具有相同名称的模块中定义。 可以通过多种方式创建此类的实例;通过加载 文件中的图像、处理其他图像或从头开始创建图像。

要从文件加载图像,请使用函数 在模块中:

>>> from PIL import Image
>>> im = Image.open("hopper.ppm")

如果成功,此函数将返回一个对象。 现在,您可以使用实例属性来检查文件内容:

>>> print(im.format, im.size, im.mode)
PPM (512, 512) RGB

该属性标识 图像。如果图像不是从文件中读取的,则将其设置为“无”。尺寸 属性是一个包含宽度和高度(以像素为单位)的 2 元组。该属性定义 图像中的条带,以及像素类型和深度。常见的模式是“L” (亮度)表示灰度图像,“RGB”表示真彩色图像,“CMYK”表示 印前图像。

如果无法打开文件,则会引发异常。

一旦你有了类的实例,你就可以使用 此类定义的用于处理和操作图像的方法。为 例如,让我们显示刚刚加载的图像:

>>> im.show()

注意

标准版不是很 高效,因为它将图像保存到临时文件并调用实用程序 以显示图像。如果您没有安装适当的实用程序, 它甚至行不通。但是,当它确实工作时,它非常方便 调试和测试。

读取和写入图像

Python 图像库支持多种图像文件格式。自 从磁盘读取文件,使用模块中的函数。您不必知道打开的文件格式 文件。库根据 文件。

若要保存文件,请使用类的方法。保存文件时,名称变为 重要。除非指定格式,否则库将使用文件名 扩展名以发现要使用的文件存储格式。

将文件转换为JPEG

import os, sys
from PIL import Image

for infile in sys.argv[1:]:
    f, e = os.path.splitext(infile)
    outfile = f + ".jpg"
    if infile != outfile:
        try:
            with Image.open(infile) as im:
                im.save(outfile)
        except OSError:
            print("cannot convert", infile)

可以向显式指定文件格式的方法提供第二个参数。如果您使用非标准 扩展名,您必须始终以这种方式指定格式:

创建 JPEG 缩略图

import os, sys
from PIL import Image

size = (128, 128)

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            with Image.open(infile) as im:
                im.thumbnail(size)
                im.save(outfile, "JPEG")
        except OSError:
            print("cannot create thumbnail for", infile)

需要注意的是,该库不会解码或加载栅格数据 除非真的必须这样做。打开文件时,文件头将读为 确定文件格式并提取模式、大小等内容 解码文件所需的属性,但文件的其余部分不是 直到以后才处理。

这意味着打开图像文件是一个快速的操作,它是独立的 文件大小和压缩类型。这里有一个简单的脚本,可以快速 标识一组图像文件:

识别图像文件

import sys
from PIL import Image

for infile in sys.argv[1:]:
    try:
        with Image.open(infile) as im:
            print(infile, im.format, f"{im.size}x{im.mode}")
    except OSError:
        pass

剪切、粘贴和合并图像

该类包含允许您 操作图像中的区域。要从图像中提取子矩形, 使用该方法。

从图像复制子矩形

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

该区域由 4 元组定义,其中坐标为(左、上、右、 更低)。Python 图像库使用坐标系,其中 (0, 0) 左上角。另请注意,坐标是指 像素,因此上面示例中的区域正好是 300x300 像素。

现在可以以某种方式处理该区域并粘贴回去。

处理子矩形并将其粘贴回去

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

将区域粘贴回去时,区域的大小必须与给定区域匹配 完全。此外,该区域不能延伸到图像之外。但是, 原始图像和区域的模式不需要匹配。如果他们不这样做, 区域在粘贴之前会自动转换(有关详细信息,请参阅下面的颜色转换部分)。

下面是一个附加示例:

滚动图像

def roll(im, delta):
    """Roll an image sideways."""
    xsize, ysize = im.size

    delta = delta % xsize
    if delta == 0:
        return im

    part1 = 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 im

或者,如果您想将两个图像合并为一个更宽的图像:

合并图像

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 im

对于更高级的技巧,粘贴方法也可以将透明度蒙版作为 一个可选参数。在此掩码中,值 255 表示粘贴的 图像在该位置是不透明的(也就是说,粘贴的图像应用作 是)。值 0 表示粘贴的图像是完全透明的。值 介于两者之间表示不同级别的透明度。例如,粘贴 RGBA 图像并将其用作蒙版将粘贴不透明部分 的图像,但不是其透明背景。

Python 图像库还允许您使用 多波段图像,例如 RGB 图像。split 方法创建一组 新影像,每个影像都包含来自原始多波段影像的一个波段。这 merge 函数采用一个模式和一个图像元组,并将它们组合成一个新的 图像。以下示例交换 RGB 图像的三个波段:

拆分和合并频带

r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))

请注意,对于单波段图像,返回 图像本身。要使用单个色带,您可能需要转换 首先将图像设置为“RGB”。

几何变换

该类包含 和 图像。前者采用一个元组给出新的大小,后者采用的角度 度逆时针。

简单的几何变换

out = im.resize((128, 128))
out = im.rotate(45) # degrees counter-clockwise

若要以 90 度为步长旋转图像,可以使用该方法或该方法。后者也可用于 围绕图像的水平轴或垂直轴翻转图像。

转置图像

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)

transpose(ROTATE)操作也可以与操作相同,前提是标志是 true,以提供对图像大小的相同更改。expand

通过该方法可以进行更一般的图像转换形式。

相对调整大小

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

from PIL import Image, ImageOps
size = (100, 150)
with Image.open("Tests/images/hopper.png") as im:
    ImageOps.contain(im, size).save("imageops_contain.png")
    ImageOps.cover(im, size).save("imageops_cover.png")
    ImageOps.fit(im, size).save("imageops_fit.png")
    ImageOps.pad(im, size, color="#f00").save("imageops_pad.png")

    # thumbnail() can also be used,
    # but will modify the image object in place
    im.thumbnail(size)
    im.save("imageops_thumbnail.png")

thumbnail()contain()封面()fit()pad()
给定尺寸(100, 150)(100, 150)(100, 150)(100, 150)(100, 150)
生成的图像

../_images/image_thumbnail.png

../_images/imageops_contain.png

../_images/imageops_cover.png

../_images/imageops_fit.png

../_images/imageops_pad.png

结果大小100×100100×100150×150100×150100×150

颜色变换

Python 图像库允许您在不同像素之间转换图像 使用该方法的表示。

在模式之间转换

from PIL import Image

with Image.open("hopper.ppm") as im:
    im = im.convert("L")

该库支持每个支持的模式和“L”之间的转换 和“RGB”模式。要在其他模式之间进行转换,您可能需要使用 中间图像(通常为“RGB”图像)。

图像增强

Python 图像库提供了许多方法和模块,这些方法和模块可以 用于增强图像。

过滤 器

该模块包含许多预定义的 可与该方法一起使用的增强筛选器。

应用过滤器

from PIL import ImageFilter
out = im.filter(ImageFilter.DETAIL)

单点操作

该方法可用于平移像素 图像的值(例如图像对比度操作)。在大多数情况下,一个 需要一个参数的函数对象可以传递给此方法。每 像素根据该函数进行处理:

应用点变换

# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)

使用上述技术,您可以快速将任何简单的表达式应用于 图像。您还可以结合 和 方法来有选择地修改图像:

处理单个波段

# split the image into individual bands
source = im.split()

R, G, B = 0, 1, 2

# select regions where red is less than 100
mask = source[R].point(lambda i: i < 100 and 255)

# process the green band
out = source[G].point(lambda i: i * 0.7)

# paste the processed band back, but only where red was < 100
source[G].paste(out, None, mask)

# build a new multiband image
im = Image.merge(im.mode, source)

请注意用于创建掩码的语法:

Python 仅在必要时计算逻辑表达式的部分 确定结果,并返回作为 表达。因此,如果上面的表达式为 false (0),则 Python 不会查看 第二个操作数,因此返回 0。否则,它将返回 255。

增强

对于更高级的图像增强,您可以使用模块中的类。从映像创建后,增强功能 对象可用于快速尝试不同的设置。

您可以通过这种方式调整对比度、亮度、色彩平衡和锐度。

增强图像

from PIL import ImageEnhance

enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")

图像序列

Python 图像库包含对图像序列的一些基本支持 (也称为动画格式)。支持的序列格式包括 FLI/FLC、 GIF 和一些实验性格式。TIFF 文件也可以包含多个 框架。

当您打开序列文件时,PIL 会自动加载 序列。您可以使用 seek 和 tell 方法在不同的 框架:

读取序列

from PIL import Image

with Image.open("animation.gif") as im:
    im.seek(1)  # skip to the second frame

    try:
        while 1:
            im.seek(im.tell() + 1)
            # do something to im
    except EOFError:
        pass  # end of sequence

如本示例所示,当 序列结束。

下面的类允许您使用 for 语句遍历序列:

使用 ImageSequence Iterator 类

from PIL import ImageSequence
for frame in ImageSequence.Iterator(im):
    # ...do something to frame...

PostScript 打印

Python 图像库包括打印图像、文本和 PostScript 打印机上的图形。下面是一个简单的示例:

绘制 PostScript

from PIL import Image
from PIL import PSDraw

with Image.open("hopper.ppm") as im:
    title = "hopper"
    box = (1 * 72, 2 * 72, 7 * 72, 10 * 72)  # in points

    ps = PSDraw.PSDraw()  # default is sys.stdout or sys.stdout.buffer
    ps.begin_document(title)

    # draw the image (75 dpi)
    ps.image(box, im, 75)
    ps.rectangle(box)

    # draw title
    ps.setfont("HelveticaNarrow-Bold", 36)
    ps.text((3 * 72, 4 * 72), title)

    ps.end_document()

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

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

相关文章

git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作)

文章目录 1. Git概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git简史1.5 Git工作机制1.6 Git和代码托管中心 2. Git安装3. Git常用命令3.1 设置用户签名3.1.1 说明3.1.2 语法3.1.3 案例实操 3.2 初始化本地库3.2.1 基本语法3.2.2 案例实操3.2.3 结果查看 3…

Maple 各版本安装指南

Maple 下载链接 https://pan.baidu.com/s/11hKo1XxZGa0xv3Ivj6fbEA?pwd0531 1.鼠标右击【Maple 2023】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Maple 2023】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以管理员身…

嵌入式系统(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

上一篇文章我们介绍了嵌入式系统 嵌入式系统&#xff08;Embedded System&#xff09;是一种特定用途的计算机系统&#xff0c;它通常嵌入在更大的产品或系统中&#xff0c;用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成&#xff0c;旨在满足特定的需求&…

【REST2SQL】04 REST2SQL第一版Oracle版实现

REST2SQL的第一个版本&#xff0c;只支持Oracle数据库&#xff0c;以后会逐步加入其它数据看的支持。 项目文件组织如下&#xff1a; 1 REST2SQL为项目主目录 主控main()函数、请求日志函数、请求响应函数、请求参数返回函数在此目录。 1.1 import引用包 import ("e…

在IDEA中按照默认提示安装Lua脚本插件后,IDEA启动报错【解决方案】

在IDEA中按照默认提示安装Lua脚本插件后&#xff0c;再次重启IDEA就报错了&#xff0c;下面是报错信息&#xff1a; 简单来说就是Lua插件冲突了&#xff0c;因为我勾选了三个&#xff0c;只要其中一个就够了&#xff08;删了其他两个&#xff09;&#xff0c;在IDEA的安装目录…

现在的人们如何看待数据隐私?

PrimiHub一款由密码学专家团队打造的开源隐私计算平台&#xff0c;专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 在当前时代&#xff0c;每一次点击、触摸或按键都留下了数字痕迹。但是我们对自己的个人数据几乎没有控制的权限&#xff0c;这让…

简单聊聊大力发展国产堡垒机的几个原因

我们大家都知道堡垒机起源于国外&#xff0c;但近些年我国在大力发展国产堡垒机&#xff0c;这是为什么呢&#xff1f;相信还有很多小伙伴对于这个问题不是很了解&#xff0c;今天我们大家一起就来简单聊聊大力发展国产堡垒机的几个原因。 简单聊聊大力发展国产堡垒机的几个原…

【XR806开发板试用】+00. Win11环境下安装docker环境

很幸运得到XR806开发板的试用机会&#xff0c;在此深深感谢主办方给菜鸟一个机会。 之前开发的芯片主要是STM32、GD32之类的芯片&#xff0c;都是基于win环境的集成环境。现在拿到这块开发板感觉无从下手&#xff0c;就从安装docker环境开始&#xff0c;慢慢更新xr806的开发之…

移动神器RAX3000M路由器变身家庭云之四:开放LuCI管理界面,网站服务

前面已经改造成了家庭云供外网访问了。由于这个路由本来就是openwrt&#xff0c;openwrt本身的管理界面LuCI-admin很好用&#xff0c;但被屏蔽了&#xff0c;需要打开。 打开界面 ssh登录路由器&#xff0c;修改 /etc/config/uhttpd配置文件如下&#xff1a; config uhttpd …

基于Java SSM框架实现固定资产管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现固定资产管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

C#:如何产生一个临时文件

在我们实际编程中&#xff0c;经常有将内容写到一个临时文件的需要。 比如&#xff1a;将网络上的图片下载下来&#xff0c;获取到图片的一些信息。 代码如下&#xff0c;看结果可知&#xff1a; 临时文件都是保存在系统临时文件夹的目录下&#xff0c;临时文件的扩展名统一…

uniCloud 的 schema2code 【实用教程】

schema2code 用于通过 schema 文件&#xff0c;自动生成对表进行增删改查的操作页面。 以 uniCloud-aliyun/database/todo.schema.json 为例 {"bsonType": "object","required": [],"permission": {"read": true,"cr…

文档工程师怎样做到年薪百万

▲ 搜索“大龙谈智能内容”关注公众号▲ 2023年10月&#xff0c;Infomagic发布了《2023中国技术传播行业调研报告》。 其中&#xff0c;有一项是关于文档工程师年收入的调研&#xff0c;以下分别是2018年和2023年收入分布。 图1 - 文档工程师年收入分布 有朋友看到真有人年…

(vue)el-popover鼠标移入提示效果

(vue)el-popover鼠标移入提示效果 效果&#xff1a; 代码&#xff1a; <el-form-itemv-for"(item,index) of ele.algorithmParameters":key"index":label"item.parametersName"class"descInput" ><el-input v-model"i…

助力数据出境安全 | 时代新威出席第二届粤港澳数据合作会议

12月19日&#xff0c;第二届粤港澳数据合作会议在广州南沙成功举办。会议以“数智力量汇聚南沙&#xff0c;打造粤港澳数据高水平合作平台&#xff0c;赋能大湾区数字经济高质量发展”为主题&#xff0c;汇聚了政府主管部门领导、粤港澳相关主管机构代表、中国工程院院士和众多…

【PTA-C语言】编程练习6 - 结构体与共用体 - 编程题

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习6 - 结构体与共用体 - 编程题 7-1 查找书籍&#xff08;分数 20&#xff09;7-2 一帮一&#xff08;分数 15&#xff09;7-3 计算职工工资&#xff08;分数 15&#xff09; 7-1 查找书籍&#xff08…

公司图纸该怎么管理? 公司图纸管理的方案

公司图纸管理是一个重要的环节&#xff0c;涉及到图纸的存储、分类、检索和使用等方面。以下是一些建议&#xff0c;帮助你有效地管理公司图纸&#xff1a; 建立图纸管理制度&#xff1a;制定明确的图纸管理制度&#xff0c;包括图纸的存储、分类、检索和使用等方面的规定。确保…

k8s的pod基础

pod概念 pod是k8s中最小的资源管理组件。 pod也是最小化运行容器化的应用的资源管理对象。 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。在一个pod当中同时运行多个容器&#xff0c;在一个pod当中…

SD-WAN搭建企业多云专用网络

随着云服务的快速发展&#xff0c;越来越多的企业将数据部署、存储在云平台上&#xff0c;以达到降本增效。但近年国内外云服务崩溃事故频发&#xff0c;让不少对网络稳定性要求较高的企业开始思考多云灾备的重要性。下文将探讨目前企业多云网络面临的困境以及如何用SD-WAN解决…

Mysql锁机制与优化

欢迎大家关注我的微信公众号&#xff1a; 传送门&#xff1a;Mysql事务原理与优化 目录 概述 锁分类 锁等待分析 锁优化实践 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&…