PIL/Pillow

Abstract

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

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

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

1. 加载和保存图像:

from PIL import Image

image = 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",
]

2. 调整图像大小:

from PIL import Image

image = 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 Image

image = 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 Image

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

4. 旋转图像:

from PIL import Image

image = 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, ImageFilter

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3+el-table实现甘特图

Vue3 el-table实现甘特图效果 代码gitee 整体实现效果如下 进度列&#xff0c;可以通过设置天或小时&#xff0c;切换不同列显示类型。 涉及到的问题 1、通过Worker解决js线程堵塞问题 在根据时间动态生成列时&#xff0c;由于开始时间与结束时间跨度过大时&#xff0c;计…

【从服务器获取共享列表失败】【无法与设备或资源通信】解决方案!

【从服务器获取共享列表失败】背景&#xff1a; 某项目搭建有samba共享&#xff0c;使用一段时间后&#xff0c;不知何种原因&#xff0c;客户端链接共享时报&#xff1a;从服务器获取共享列表失败&#xff0c;无效的参数。 可参考解决方案A&#xff1a; 银河麒麟samba共享文…

vue3 环境变量

开发环境&#xff1a; .env.development VITE_HTTPhttp://www.baidu.com生成环境&#xff1a; .env.production VITE_HTTPhttp://www.jd.com获取环境里的值 <template></template><script setup lang"ts"> console.log(import.meta.env); <…

图片处理软件DxO PhotoLab 6 mac高级工具

DxO PhotoLab 6 mac是一款专业的RAW图片处理软件&#xff0c;适用于Mac操作系统。它具有先进的图像处理技术和直观易用的界面&#xff0c;可帮助用户轻松地将RAW格式的照片转换为高质量的JPEG或TIFF图像。 DxO PhotoLab 6支持多种相机品牌的RAW格式&#xff0c;包括佳能、尼康、…

【docker】数据管理

Docker容器会随时关闭和开启,Docker 容器的数据放哪里呢&#xff1f; 答案就是&#xff1a;数据卷和数据卷容器 官网文档 Manage data in Docker | Docker Docs 数据卷(Data Volume) 数据卷就是将宿主机的某个目录&#xff0c;映射到容器中&#xff0c;作为数据存储的目录&…

21 3GPP中 5G NR高速列车通信标准化

文章目录 信道模型实验——物理层设计相关元素μ(与子载波间隔有关)设计参考信号(DMRS) 本文提出初始接入、移动性管理、线性小区设计等高层技术。描述3GPP采用HST场景的评估参数&#xff0c;阐释了HST应用的物理层技术&#xff0c;包括数字通信和参考信号设计&#xff0c;链路…

基于PHP的蛋糕购物商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的蛋糕购物商城系统 一 介绍 此蛋糕购物商城基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销…

【大数据存储与处理】实验四 MongoDB 文档操作

实验四 MongoDB 文档操作 【实验目的】&#xff1a; 1. 掌握 MongoDB CRUD 基本操作&#xff1b; 2. 掌握 MongoDB 插入文档 3. 掌握 MongoDB 更新文档 4. 掌握 MongoDB 删除文档 5. 掌握 MongoDB 删除集合。 【实验内容与要求】&#xff1a; MongoDB 是一个介于关系数…

深入理解PyTorch中的Hook机制:特征可视化的重要工具与实践

文章目录 一、前言1. 特征可视化的重要性2. PyTorch中的hook机制简介 二、Hook函数概述1. Tensor级别的hook&#xff1a;register_hook()2. Module级别的hook 三、register_forward_hook()详解1. 功能与使用场景2. 示例代码与解释3. 在特征可视化中的具体应用 四、register_bac…

HarmonyOS播放视频及音乐

效果如下 代码 Entry Component struct PageVideo {State videoSrc: Resource $rawfile(AndroidVideo.mp4)State previewUri: Resource $rawfile(6_20231218171028A068.jpg)State curRate: PlaybackSpeed PlaybackSpeed.Speed_Forward_1_00_XState isAutoPlay: boolean fal…

js按顺序循环接口返回数据,组合成新数据

有时候我们需要根据一个参数&#xff0c;通过接口返回的数据进行一一对应。形成请求参数又有对应的返回结果的新数据。 新数据格式1&#xff1a;一个对象包含请求参数和返回值 现在vue项目里有个字典接口&#xff0c;该页面很多地方要调用字典接口&#xff0c;需要写个循环将…

IIOT与IOT:什么是工业物联网?为什么需要工业物联网?

工业物联网也被称作工业4.0或工业互联网&#xff0c;是物联网的一个子集&#xff0c;其通过通信技术连接的众多工业设备组成的网络&#xff0c;使系统能够以前所未有的方式监控、收集、交换、分析和提供有价值的新见解&#xff0c;以帮助工业企业做出更智能、更快速的业务决策。…

告诉你playwright 不使用with sync_playwright() as编写脚本的新方法

大家都知道playwright代码的标准写法是&#xff1a; with sync_playwright() as p:browser p.chromium.launch(channel"chrome", headlessFalse)page browser.new_page()page.goto("http://www.baidu.com")print(page.title())browser.close() with sy…

解决ESP8266无法退出透传问题以及获取网络时间以及天气方法

网上很多配置ESP8266的教程&#xff0c;但是遇到无法退出透传模式的情况却没有找得到答案&#xff0c;不知道是大家都没遇到还是怎么样&#xff0c;以下是我的解决方法&#xff1a;实测有效 先发送“”&#xff08;三个加号&#xff09;&#xff08;如果是在串口调试助手调试&…

硕迪填报如何自动生成UUID并存入数据库

硕迪填报如何自动生成UUID并存入数据库 需求&#xff1a;1、在不修改jsp页面的情况下&#xff0c;如何生成一个UUID并存入数据库&#xff1f; 2、修改数据时&#xff0c;根据UUID去更新数据。 现在我总结一个更简洁的方法&#xff0c;具体操作步骤如下&#xff1a; 1、填报表…

SpringBoot知识点回顾01

Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 Spring是如何简化Java开发的 为了降低Java开发的复杂性&#xff0c;Spring采用了以下4种关键策略&#xff1a; 1、基于POJO的轻量级和最小侵入性编程&#xff0c;所有东西都是bean&#xff1b; 2、通…

WebGL开发虚拟旅游应用

WebGL可以用于开发虚拟旅游应用&#xff0c;提供用户在浏览器中探索虚拟景点和环境的交互体验。以下是在WebGL中开发虚拟旅游应用的一般流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析…

Sqoop入门:如何下载、配置和使用

下载和配置 Sqoop是Apache的一个开源工具&#xff0c;主要用于在Hadoop和关系数据库之间传输数据。以下是一些关于如何下载和配置Sqoop的步骤&#xff1a; 下载Sqoop&#xff1a;你可以从Apache的官方网站下载Sqoop。大多数企业使用的Sqoop版本是Sqoop1&#xff0c;例如sqoop-…

flink 读取 apache paimon表,查看source的延迟时间 消费堆积情况

paimon source查看消费的数据延迟了多久 如果没有延迟 则显示0 官方文档 Metrics | Apache Paimon

杰发科技AC7840——SPM电源管理之低功耗模式

0、SPM简介 很早以前就听过低功耗模式&#xff0c;一直没有怎么深入了解&#xff0c;最近遇到几个项目都是跟低功耗有关。正好AutoChips的芯片都有电源管理的功能&#xff0c;在此借用AC7840的SPM对低功耗进行测试。 1、AC7840的5种功耗模式 2、AC7840的模式转换 3、唤醒 在…