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

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 等也提供了类似的功能来实现高斯模糊滤镜。具体的使用方法可能会有所不同,但基本原理和效果是相似的。

相关文章:

PIL/Pillow

Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能&#xff0c;包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年&#xff0c;因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…...

ARM 汇编入门

ARM 汇编入门 引言 ARM 汇编语言是 ARM 架构的汇编语言&#xff0c;用于直接控制 ARM 处理器。虽然现代软件开发更多地依赖于高级语言和编译器&#xff0c;但理解 ARM 汇编仍然对于深入了解系统、优化代码和进行低级调试非常重要。本文将为您提供一个简单的 ARM 汇编入门指南…...

SQL进阶:多表查询

在SQL基础部分&#xff0c;我们在讲解的过程中只用到了单表查询。但实际上&#xff0c;常见的业务场景单表查询不能满足&#xff0c;或者拆分查询性能过慢。这个时候我们就需要用到连接查询。即查询多表按一定规则合并后的数据。 注意&#xff0c;合并后的数据也是表&#xff…...

多层负载均衡实现

1、单节点负载均衡 1&#xff09;站点层与浏览器层之间加入了一个反向代理层&#xff0c;利用高性能的nginx来做反向代理 2&#xff09;nginx将http请求分发给后端多个web-server 优点&#xff1a; 1&#xff09;DNS-server不需要动 2&#xff09;负载均衡&#xff1a;通过ngi…...

Redis取最近10条记录

有时候我们有这样的需求&#xff0c;就是取最近10条数据展示&#xff0c;这些数据不需要存数据库&#xff0c;只用于暂时最近的10条&#xff0c;就没必要在用到Mysql类似的数据库&#xff0c;只需要用redis即可&#xff0c;这样既方便也快&#xff01; 具体取最近10条的方法&a…...

Mybatis之增删改查

目录 一、引言 二、Mybatis——增 举例&#xff1a;添加用户 三、Mybatis——删 举例&#xff1a;删除用户 四、Mybatis——改 举例&#xff1a;修改用户 五、Mybatis——查 六、注意 END&#xff1a; 一、引言 书接上回&#xff0c;我们在了解完mybatis之后&#xff0c;肯…...

Go 代码检查工具 golangci-lint

一、介绍 golangci-lint 是一个代码检查工具的集合&#xff0c;聚集了多种 Go 代码检查工具&#xff0c;如 golint、go vet 等。 优点&#xff1a; 运行速度快可以集成到 vscode、goland 等开发工具中包含了非常多种代码检查器可以集成到 CI 中这是包含的代码检查器列表&…...

SwiftUI 趣谈之:绝不可能(Never)的 View!

概览 SwiftUI 的出现极大的解放了秃头码农们的生产力。SwiftUI 中众多原生和自定义视图对于我们创建精彩撩人的 App 功不可没&#xff01; 不过&#xff0c;倘若小伙伴们略微留意过 SwiftUI 框架头文件里的源代码&#xff0c;就会发现里面嵌有一些奇怪 Never 类型&#xff0c…...

etcd是什么

目录 1.关于etcd2.应用场景 本文主要介绍etcd 概念和基本应用场景。 1.关于etcd etcd是一个开源的、分布式的键值存储系统&#xff0c;用于共享配置和服务发现。它是由CoreOS团队开发的&#xff0c;主要用于实现分布式系统的配置管理和服务发现。 etcd的主要特性包括&#x…...

应用全局的UI状态存储AppStorage

目录 1、概述 2、StorageProp 2.1、观察变化和行为表现 3、StorageLink 3.1、观察变化和行为表现 4、从应用逻辑使用AppStorage和LocalStorage 5、从UI内部使用AppStorage和LocalStorage 6、不建议借助StorageLink的双向同步机制实现事件通知 6.1、推荐的事件通知方式…...

MySQL数据库 触发器

目录 触发器概述 语法 案例 触发器概述 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义的soL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性&#xff0c;日志记录&am…...

C语言学习之给定任意的字符串,清除字符串中的空格

实例要求&#xff1a;给定任意的字符串&#xff0c;清除字符串中的空格&#xff0c;并将其输出&#xff1b;实例分析&#xff1a;1、指针函数实现&#xff0c;需要注意指针函数的返回值是一个指针类型&#xff1b;2、字符类型的数组实现&#xff0c;循环遍历并赋给新的数组&…...

由实验数据进行函数拟合的python实现

0.引言 已知公式求参的过程&#xff0c;对工程而言&#xff0c;一般是一个线性拟合或者非线性拟合的过程。我们现在来以代码片段为例&#xff0c;来描述如何求参。一般这个过程会涉及超定方程的计算。这个过程&#xff0c;原本需要使用matlab&#xff0c;现在python照样可以做…...

<JavaEE> 基于 UDP 的 Socket 通信模型

目录 一、认识相关API 1&#xff09;DatagramSocket 2&#xff09;DatagramPacket 3&#xff09;InetSocketAddress 二、UDP数据报套接字通信模型概述 三、回显客户端-服务器通信 1&#xff09;服务器代码 2&#xff09;客户端代码 一、认识相关API 1&#xff09;Data…...

Golang 链表的基础知识

文章目录 链表链表基础知识部分链表的存储方式链表的定义链表的操作性能分析 链表 更多有关于go链表的内容可以见这篇文章链表的创建和读取 链表基础知识部分 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;…...

webpack 常见面试题

1、什么是webpack&#xff08;必会&#xff09; webpack是一个打包模块化javascript的工具&#xff0c;在webpack里一切文件皆模块&#xff0c;通过loader转换文件&#xff0c;通过plugin注入钩子&#xff0c;最后输出由多个模块组合成的文件&#xff0c;webpack专注构建模块化…...

three.js实战模拟VR全景视图

文章中使用到的案例图片都来源于&#xff1a;Humus - Textures 里面有很多免费的资源&#xff0c;可以直接下载&#xff0c;每个资源里面都提供6个不同方位的图片&#xff0c;我们通过threejs稍微处理一下&#xff0c;就能实现以下3D效果的场景了。 <template><div …...

聊聊Spring Boot配置文件:优先级顺序、bootstrap.yml与application.yml区别详解

Spring Boot 配置文件 优先级顺序 在Spring Boot中&#xff0c;配置文件的优先级顺序是&#xff1a;bootstrap.yml > application.yml > application-{profile}.yml&#xff0c;其中 {profile} 表示不同的环境配置&#xff0c;如 dev、test、prod 等。当存在相同名称的…...

Milvus向量数据库基础用法及注意细节

1、Milvus数据类型与python对应的数据类型 Milvus Python DataType.INT64 numpy.int64 DataType.INT32 numpy.int32 DataType.INT16 numpy.int16 DataType.BOOL Boolean DataType.FLOAT numpy.float32 DataType.DOUBLE numpy.double DataType.ARRAY list DataT…...

虚拟机多开怎么设置不同IP?虚拟机设置独立IP的技巧

随着虚拟化技术的不断发展&#xff0c;虚拟机已经成为了许多人的必备工具。在虚拟机中&#xff0c;我们可以轻松地创建多个虚拟机&#xff0c;并在每个虚拟机中设置不同的IP地址。下面&#xff0c;我们将介绍如何在虚拟机中设置独立IP地址的方法。 一、虚拟机多开设置不同IP的方…...

创业团队如何利用多模型聚合平台优化AI应用开发成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 创业团队如何利用多模型聚合平台优化AI应用开发成本 对于资源有限的创业团队或独立开发者而言&#xff0c;在开发智能客服、内容生…...

物联网芯片设计挑战:EDA工具如何应对极致功耗与面积约束

1. 物联网浪潮下的EDA设计挑战&#xff1a;一次回归本质的审视十年前&#xff0c;当那篇关于物联网与EDA需求的文章发表时&#xff0c;很多人可能觉得“30亿联网设备”的预测有些遥远。今天回头看&#xff0c;这个数字早已被超越&#xff0c;物联网已经从概念变成了我们生活与产…...

Android定位模拟技术全解析:Xposed Hook实现位置伪造的完整指南

Android定位模拟技术全解析&#xff1a;Xposed Hook实现位置伪造的完整指南 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 在移动应用开发和测试领域&#xff0c;Android定位模拟…...

天津螺旋涂塑钢管哪家好

天津螺旋涂塑钢管哪家好&#xff0c;聚鸿管道厂家值得关注 在天津的众多管道产品中&#xff0c;螺旋涂塑钢管以其独特的性能优势&#xff0c;在各类工程建设中发挥着重要作用。那么&#xff0c;天津螺旋涂塑钢管哪家好呢&#xff1f;聚鸿管道厂家是值得深入探讨的选择。 产品质…...

书匠策AI(http://www.shujiangce.com)居然藏了个“期刊论文外挂“?

大家好&#xff0c;我是你们的论文写作搭子。 今天不聊选题有多头疼&#xff0c;也不扯文献有多难找&#xff0c;咱来聊点"偷塔"级别的操作——书匠策AI&#xff08; 官网直达&#xff1a;www.shujiangce.com&#xff0c;微信公众号搜"书匠策AI"就能找到&…...

csp信奥赛C++高频考点专项训练之字符串 --【回文字符串】:回文拼接

csp信奥赛C高频考点专项训练之字符串 --【回文字符串】&#xff1a;回文拼接 题目描述 一个字符串是回文串&#xff0c;当且仅当该字符串从前往后读和从后往前读是一样的&#xff0c;例如&#xff0c;aabaa\texttt{aabaa}aabaa 和 ccddcc\texttt{ccddcc}ccddcc 都是回文串&…...

The Incredible PyTorch终极指南:探索全球开发者贡献者墙的完整资源宝库

The Incredible PyTorch终极指南&#xff1a;探索全球开发者贡献者墙的完整资源宝库 【免费下载链接】the-incredible-pytorch The Incredible PyTorch: a curated list of tutorials, papers, projects, communities and more relating to PyTorch. 项目地址: https://gitc…...

SuperMap GIS 三维性能跃迁:从硬件选型到显卡驱动的深度调优指南

1. 为什么你的SuperMap三维场景总是卡顿&#xff1f; 每次打开大型三维场景时&#xff0c;是不是总遇到画面卡顿、加载缓慢的问题&#xff1f;作为从业十年的GIS工程师&#xff0c;我见过太多项目因为硬件配置不当导致性能浪费的情况。上周刚帮某规划院优化了一个城市级三维项目…...

从树莓派Pico到Linux开发板:手把手教你移植MPU6050 I2C驱动(附完整源码)

从树莓派Pico到Linux开发板&#xff1a;MPU6050 I2C驱动移植实战指南 当你在树莓派Pico上轻松驱动了MPU6050传感器后&#xff0c;想要将这个功能迁移到Linux开发板上时&#xff0c;可能会发现两者之间的差异远比想象中大。本文将带你深入理解Linux内核驱动框架&#xff0c;并手…...

告别Apache POI!用Spire.XLS for Java 12.11.8搞定复杂Excel报表(附完整代码示例)

深度解析Spire.XLS for Java&#xff1a;企业级Excel报表开发实战指南 在企业级Java应用开发中&#xff0c;Excel报表的生成与处理一直是高频需求场景。传统方案如Apache POI虽然功能全面&#xff0c;但在处理复杂报表时往往面临性能瓶颈和内存溢出风险。本文将基于Spire.XLS f…...