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

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

相关文章

Excel报表

(Apache POI) 入门案例 P164 使用POI需要导入下面2个坐标&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId> </dependency> <dependency><groupId>org.apache.poi</groupId>&…

Python基础教程(二十三):JSON数据解析

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

LabVIEW常用的加密硬件

LabVIEW在工程和科学领域中广泛应用&#xff0c;其中数据保护和程序安全尤为重要。为了确保数据的安全性和完整性&#xff0c;常用的加密硬件设备包括TPM&#xff08;可信平台模块&#xff09;、HSM&#xff08;硬件安全模块&#xff09;和专用加密芯片。本文将推荐几款常用的加…

部署大模型LLM

在autodl上部署大模型 windows运行太麻烦&#xff0c;环境是最大问题。 选择云上服务器【西北B区 / 514机】 cpp (c c plus plus) 纯 C/C 实现&#xff0c;无需外部依赖。针对使用 ARM NEON、Accelerate 和 Metal 框架的 Apple 芯片进行了优化。支持适用于 x86 架构的 AVX、…

猎食者优化算法 Python代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类算法的家人&#xff0c;可关注我的VX公众号&#xff1a;python算法小当家&#xff0c;不定期会有很多免费代码分享~ 猎食者优化算法 Python代码免费获取 猎食者优化算法(hunter–…

基于GTX的64B66B编码IP生成(高速收发器二十)

点击进入高速收发器系列文章导航界面 1、配置GTX IP 相关参数 前文讲解了64B66B编码解码原理&#xff0c;以及GTX IP实现64B66B编解码的相关信号组成&#xff0c;本文生成64B66B编码的GTX IP。 首先如下图所示&#xff0c;需要对GTX共享逻辑进行设置&#xff0c;为了便于扩展&a…

什么是微前端

什么是微前端&#xff1f; 微前端 这个名词&#xff0c;第一次被提出还是在2016年底&#xff0c;那是在 ThoughtWorks Technology Radar。这个概念将微服务这个被广泛应用于服务端的技术范式扩展到前端领域。现代的前端应用的发展趋势正在变得越来越富功能化&#xff0c;富交互…

RPG游戏完整指南

环境&#xff1a;unity2021urp 本教程教大家如何使用Unity创建一个RPG游戏&#xff0c;玩家可以在城镇场景中进行导航并寻找战斗&#xff0c;并在战斗中遇到不同类型的敌人。玩家可以向敌人施加不同的动作&#xff0c;如&#xff1a;常规攻击和撤离。这会是一个十分有趣的体验。…

[next.js] svgr/webpack

nextjs如何配置svg文件&#xff0c;使其像react组件一样导入? 当前next.js 开发环境我使用了--turbo 来开启turbopack加速文件构建&#xff0c;所以之前的一些webpack loader之类的无法正常工作。通过搜索发现一般都是使用svgr/webpack来处理svg&#xff0c;打开svgr官网发现…

Linux初识地址空间

前言 上一期我们对进程优先级、命令行参数以及环境和变量做了介绍&#xff01;以前我们就提到过一个问题有了运行队列为什么还要有优先级&#xff1f;本期将带你揭晓&#xff01; 本期内容介绍 虚拟地址空间的引入 虚拟地址空间的介绍 如何理解地址空间 为什么要有地址空间 如…

docker和docker compose 部署

一. 将微服务运行在docker上&#xff1a; 1.新建一个空文件夹docker-demo&#xff0c;在里面再新建文件夹app&#xff0c;在app目录下新建一个名为Dockerfile的文件。 2.编写Dockerfile文件 3.构建镜像 4.启动镜像 5.可以访问了。 二使用Dockerfile构建微服务镜像 1.将j…

数据库系统概念(第八周 第一堂)(规范化关系数据库设计)(强推学习!!!)

目录 前言 E-R模型质量低的深层原因 数据依赖 函数依赖 主属性/非主属性 逻辑蕴含与闭包 Armstrongs Axiom 求解F闭包算法 求解属性集闭包算法 属性集闭包的作用 候选码求解理论和算法 候选码求解理论 无关属性 检验方法 正则覆盖 关系模式的设计 关系…

Spark常见的可以优化的点

Shuffle 复用 # 1.以下操作会复用的shuffle结果&#xff0c;只会读一遍数据源 val rdd1 sc.textFile("hdfs://zjyprc-hadoop/tmp/hive-site.xml").flatMap(_.split(" ")).map(x > (x,1)).reduceByKey(_ _).filter(_._2 > 1) rdd1.count() rdd1.fil…

Python高级用法:路径与文件操作(os与pathlib)

路径与文件 前言导入包判断路径存在判断路径类型&#xff08;判断文件还是文件夹&#xff09;获取父路径写入读出文件获得路径中所有子文件/子文件夹获取文件扩展名获取多个文件扩展名获取路径的组件创建目录删除文件或空目录 前言 在Python中&#xff0c;os模块提供了与操作系…

美国裸机云站群服务器使用指南

在当今数字化时代&#xff0c;网站和应用程序的稳定运行对于企业和个人都至关重要。为了满足日益增长的业务需求&#xff0c;裸机云站群服务器成为了一个理想的选择。以下是美国裸机云站群服务器的使用指南&#xff0c;帮助您更好地利用这一强大的云服务。 一、选择信誉良好的云…

AI大模型在运动项目的深度融合和在穿戴设备的实践及未来运动健康技术发展

文章目录 1. 技术架构2. 模型选择2.1 LSTM&#xff08;长短期记忆网络&#xff09;2.2 CNN&#xff08;卷积神经网络&#xff09;2.3 Transformer 3. 数据处理数据预处理 4. 实时性要求4.1 边缘计算4.2 模型优化 5. 数据隐私与安全6. 深入分析AI大模型在穿戴设备的应用和未来发…

k8s中的pod域名解析失败定位案例

问题描述 我在k8s中启动了一个Host网络模式的pod&#xff0c;这个pod的域名解析失败了。 定位步骤 敲kubectl exec -it [pod_name] -- bash进入pod后台&#xff0c;查看/etc/resolv.conf&#xff0c;发现nameserver配的有问题。这里我预期的nameserver应该使用宿主机的&…

动态 SQL

动态 SQL 是 MyBatis 的强大特性之一&#xff0c;能够完成不同条件下不同的 sql 拼接。也就是说执行的 SQL 语句并不是固定的&#xff0c;而是不同人的不同操作执行的语句会有所差异。MyBatis 通过使用 标签 的方式来实现这种灵活性的。 <if>标签 例如在有一些网站进行…

【linux网络(四)】传输层协议详解(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. UDP协议…

CPN Tools学习——从平面网构建分层 PN

1.先创建平面petri网 创建如下petri网&#xff1a; CPN ide创建petri网真的舒服很多&#xff0c;但是教程又是CPN Tools的&#xff0c;我的想法是看两个版本能不能互通&#xff0c;在前者创建&#xff0c;在后者运行学习。 新增定义&#xff1a; colset E unit with e; 但…