PIL/Pillow

Abstract

PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能,包括图像加载保存调整大小裁剪旋转滤镜应用等。

由于 PIL 的开发停止在 2009 年,因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接口的现代图像处理库,提供更多功能和更好的性能。

以下是一些常见的 PIL/Pillow 操作示例:

1. 加载和保存图像:

from PIL import Imageimage = Image.open("image.jpg")  # 打开图像文件
print(type(image))image.save("output.jpg")  # 保存图像文件

输出:

<class 'PIL.JpegImagePlugin.JpegImageFile'>

注意,这里的 Image 是一个模块,而不是一个 class。image 是一个 JpegImageFile 类的实例,查看文件发现 image.save(fp, ...) 是类 Image.Image 的方法,可知 JpegImagePlugin.JpegImageFile 继承Image.Image

于是猜测 Image.Image 是一个操作图象的基本类,由于图片有不同的格式,就诞生了各种类似 JpegImagePlugin.JpegImageFile 的更具体的类。查看包 PIL 的内容,果然发现是这样的:

_plugins = ["BlpImagePlugin","BmpImagePlugin","BufrStubImagePlugin",..."XbmImagePlugin","XpmImagePlugin","XVThumbImagePlugin",
]

各种 xxxImagePlugin 下,应该有各种图片格式对应的 xxxImageFile 类吧!

2. 调整图像大小:

from PIL import Imageimage = Image.open('image.jpg')           # 打开图像文件
print(image.size)  # (96, 96)
resized_image = image.resize((800, 600))  # 调整图像大小为指定尺寸
resized_image.show()  # 展示图像

首选,image.resize(...) 返回了一个新的 Image 对象,后面会看到,各种类似的 image.xxx(...) 方法都会返回新的对象

这里的问题是:改变图片的尺寸是怎么做的?会丢失图片信息吗?

Resampling.NEAREST 是 PIL/Pillow 库中的一个枚举值,用于指定图像调整大小时使用的最近邻插值方法。
在调整图像大小时,插值是一种用于估计新像素值的技术。最近邻插值是一种简单的插值方法,它通过选择最接近目标位置的原始像素值作为新像素值来进行插值。
最近邻插值方法不会对原始像素进行平滑处理或插值计算,而是直接从最接近的原始像素中选择一个作为新像素值。这使得最近邻插值方法在一些情况下可能产生锯齿状的边缘或粗糙的图像
以下是使用 resize() 函数和 Resampling.NEAREST 进行最近邻插值的示例:

from PIL import Imageimage = Image.open("image.jpg")  # 打开图像文件
# 使用最近邻插值方法调整图像大小
image.resize((800, 600), resample=Image.Resampling.NEAREST).show()

在上面的示例中,resize() 函数的参数 resample 被设置为 Image.Resampling.NEAREST,表示使用最近邻插值方法进行图像调整大小。调整后的图像将保留原始像素中最接近目标位置的值作为新像素值。
需要注意的是,最近邻插值方法相对简单且计算效率较高,但在某些情况下可能会导致图像质量的损失。如果需要更平滑和高质量的结果,可以尝试其他插值方法,如双线性插值 (Resampling.BILINEAR) 或双三次插值 (Resampling.BICUBIC)。根据具体需求选择合适的插值方法可以获得更好的图像调整大小效果。

更多关于插值的内容,可参考博文《【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值》。

3. 裁剪图像:

from PIL import Imageimage = Image.open("image.jpg")  # 打开图像文件
# 裁剪图像
image.crop((100, 100, 300, 300)).show()  # 坐标为左上角 (100, 100),右下角 (300, 300)

4. 旋转图像:

from PIL import Imageimage = Image.open('image.jpg')  # 打开图像文件
# 旋转图像 90 度
image.rotate(90).show()

图片的旋转还有有一个函数 image.transpose(...)

image.transpose(Image.ROTATE_90).show()

实现了一样的旋转效果。不一样的地方在于:

rotate(angle: float)
transpose(self, method: Literal[0, 1, 2, 3, 4, 5, 6] | Transpose)

rotate 接收一个 float 参数,表示旋转的角度(任意);而 tranpose 更像是 “矩阵旋转”,接收一个枚举值 Literal[i],也表示旋转的角度,但只有

ROTATE_90: Literal[2]
ROTATE_180: Literal[3]
ROTATE_270: Literal[4]

三个旋转角度可选,完整的枚举为:

class Transpose(IntEnum):FLIP_LEFT_RIGHT: Literal[0]FLIP_TOP_BOTTOM: Literal[1]ROTATE_90: Literal[2]ROTATE_180: Literal[3]ROTATE_270: Literal[4]TRANSPOSE: Literal[5]TRANSVERSE: Literal[6]

还包含了上下、左右翻转等操作。

5. 滤镜效果:

from PIL import Image, ImageFilterimage = Image.open("image.jpg")  # 打开图像文件
# 应用高斯模糊滤镜
image.filter(ImageFilter.GaussianBlur(radius=2)).show()

高斯模糊(Gaussian Blur)是一种常见的图像滤镜算法,用于对图像进行平滑处理。它通过在图像上应用高斯核函数来实现模糊效果,从而减少图像中的噪点和细节

radius 参数指定了高斯核的大小,控制了模糊程度。较大的 radius 值会导致更强烈的模糊效果。

除了 PIL/Pillow 库,其他图像处理库如 OpenCV、scikit-image 等也提供了类似的功能来实现高斯模糊滤镜。具体的使用方法可能会有所不同,但基本原理和效果是相似的。

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

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

相关文章

Springboot启动异常 OgnlException: sqlSelect [java.lang.NoSuchMethodError

完整的日志如下&#xff1a; Invocation of init method failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression ew ! null and ew.sqlSelect ! null. Cause…

不忍学弟学妹受苦受难!!!逐一讲解发动机原理实验报告(1)

固体火箭发动机侵蚀燃烧测试实验 经过了愉快迷糊——哦不瑟瑟发抖——哦不痛不欲生的两天&#xff0c;终于和小伙伴们协力完成了西北工业大学航天学院发动机原理实验报告。具体的实验指导书均可在本人博客资源站下载。 固体火箭发动机侵蚀燃烧测试实验&#xff0c;嗯哼—— 实…

MySQL 事务的ACID特性

MySQL事务是什么&#xff0c;它就是一组数据库的操作&#xff0c;是访问数据库的程序单元&#xff0c;事务中可能包含一个或者多个 SQL 语句。这些SQL 语句要么都执行、要么都不执行。我们知道&#xff0c;在MySQL 中&#xff0c;有不同的存储引擎&#xff0c;有的存储引擎比如…

c++学习笔记-提高篇-STL标准模板库3(stack容器、queue容器以及list容器)

目录 Stack容器 一、Stack容器介绍 二、stack常用接口 三、栈的示例 queue&#xff08;队列&#xff09;容器 一、queue容器介绍 二、queue常用接口 三、queue示例 list容器 一、list容器介绍 二、list常用接口及示例 &#xff08;一&#xff09;list构造函数 &am…

使用Swift Package Manager (SPM)实现xcframework分发

Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器&#xff0c;用于解决在开发过程中管理和构建包依赖项的需求。 1、上传xcframework.zip到服务端 压缩xcframeworks成一个zip包&…

【flink】状态清理策略(TTL)

flink的keyed state是有有效期(TTL)的&#xff0c;使用和说明在官网描述的篇幅也比较多&#xff0c;对于三种清理策略没有进行横向对比得很清晰。 全量快照清理(FULL_STATE_SCAN_SNAPSHOT)增量清理(INCREMENTAL_CLEANUP)rocksdb压缩清理(ROCKSDB_COMPACTION_FILTER) 注意&…

国图公考:公考常识题如何复习更高效?

公务员考试是许多人求职的首选之一&#xff0c;而公考常识题作为公务员考试的重要组成部分&#xff0c;对于考生来说具有很高的分值。在这一模块的复习中&#xff0c;有以下几点可以帮助考生提高学习效率&#xff0c;一起来看一下吧! 一、明确复习目标 了解自己在各个知识点上…

gitee版本回退本地和仓库的执行步骤(后悔药,无副作用,按说明书使用)

目录 1.本地回退 1.打开项目文件夹 3.回退到指定版本 4.选择回退模式并确认 5.本地回退成功 2.回退仓库版本 1.在git上面找到项目的提交记录 2.找到提交错误的版本​编辑 3.双击新页面这个版本进去 点击操作再点击revert​编辑 4.确认回退 ​5.仓库回退成功 在使用…

The Cherno C++笔记02

目录 Part 06 How the C Compiler Works 1.编译过程 2.C并不关心文件 3.翻译单元&#xff08;Translation Unit&#xff09; 4. 实际用代码感受一下编译过程 4.1 预处理 4.1.1 预处理的本质 4.1.2 预处理后的.i文件 4.1.3 骚操作 4.2 .asm文件&#xff08;汇编语言源文…

安装nodejs,配置环境变量并将npm设置淘宝镜像源

安装nodejs并将npm设置淘宝镜像源 1. 下载nodejs 个人不喜欢安装包&#xff0c;所以是下载zip包的方式。这里我下载的node 14解压包版本 下载地址如下&#xff1a;https://nodejs.org/dist/v14.15.1/node-v14.15.1-win-x64.zip 想要其他版本的小伙伴去https://nodejs.org/di…

C++ 检测 是不是 com组件 的办法 已解决

在日常开发中&#xff0c;遇到动态库和 com组件库的调用 无法区分。检测是否com组件的办法 在头部文件&#xff0c;引入文件 如果能编译成功说明是 com组件&#xff0c;至于动态库如何引入&#xff0c;还在观察中 最简单办法 regsvr32 TerraExplorerX.dll 是com 组件 regs…

LLaMA开源大模型源码分析!

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 花了一晚上照着transformers仓库的LLaMA源码&#xff0c;把张量并行和梯度保存的代码删掉&#xff0c;只留下模型基础结构&#xff0c;梳理了一遍LLaMA的模型结构。 今年四月份的时候&#xff0c;我第一次接触…

OpenAI 疑似正在进行 GPT-4.5 灰度测试!

‍ 大家好&#xff0c;我是二狗。 今天&#xff0c;有网友爆料OpenAI疑似正在进行GPT-4.5灰度测试&#xff01; 当网友询问ChatGPT API调用查询模型的确切名称是什么时&#xff1f; ChatGPT的回答竟然是 gpt-4.5-turbo。 也有网友测试之后发现仍然是GPT-4模型。 这是有网友指…

自动化测试架构设计必会知识点——对核心业务进行封装复用(附Java源码)

随着UI自动化测试工具可选性越来越多&#xff0c;工具也越来越稳定&#xff0c;前几年关于自动化测试架构设计的概念逐渐淡化&#xff0c;但是做自动化测试最重要的两点—— PO设计模式和核心业务的封装复用大家还是必须掌握的&#xff0c;前面的文章我已经介绍了什么是PO设计模…

基于 Sentry 的前端监控系统搭建(Linux)

一、前言 随着技术这几年的发展与沉淀&#xff0c;线上数据指标监控也变得尤为重要&#xff0c;研发人员和运营人员需要对线上的产品指标有所感知&#xff0c;同时风险也需要及时暴露&#xff0c;很多公司开始自建监控系统&#xff0c;但对于一些定制化要求不是特别高的团队&a…

网络爬虫之Ajax动态数据采集

动态数据采集 规则 有时候我们在用 requests 抓取页面的时候&#xff0c;得到的结果可能和在浏览器中看到的不一样&#xff0c;在浏览器中可以看到正常显示的页面教据&#xff0c;但是使用 requests 得到的结果并没有&#xff0c;这是因为requests 获取的都是原始的 HTML 文档…

(1)(1.9) MSP (version 4.2)

文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议&#xff0c;可通过任何串行端口进行遥测、OSD 和传感器。这样&#xff0c;ArduPilot 就能将遥测数据发送到 MSP 兼容设备&#xff08;如大疆护目镜&#xff09;&#xff0c;用于屏幕显示&#x…

银河麒麟v10 安装mysql 8.35

银河麒麟v10 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装依赖包3.2、安装Mysql3.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突&#xff0c;因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…

MyBatis动态SQL中if,where,set,trim四种标签的使用和联系

目录 MyBatis动态SQL中if&#xff0c;where&#xff0c;set&#xff0c;trim四种标签的使用和联系1、先介绍trim标签以下是trim标签中涉及到的属性&#xff1a; 2、使用trim标签或where标签去除多余的and关键字3、使用trim标签或set标签去除多余的逗号 MyBatis动态SQL中if&…

前端常用的开发工具

前端常用的开发工具&#x1f516; 文章目录 前端常用的开发工具&#x1f516;1. Snipaste--截图工具2. ScreenToGif--gif图片录制3. Typora--Markdown编辑器4. notepad--文本代码编辑器5. uTools--多功能工具6. EV录屏--录屏软件7. Xmind--思维导图8. Apifox -- 接口调试9. Tor…