Pillow:强大的Python图像处理库
目录
一、引言
二、Pillow 库的安装
三、Pillow 库的基本概念
四、图像的读取和保存
五、图像的基本属性
六、图像的裁剪、缩放和旋转
七、图像的颜色调整
八、图像的滤镜效果
九、图像的合成和叠加
十、图像的绘制
十一、示例程序:制作图片水印
十二、总结
一、引言
在当今数字化的时代,图像处理在各个领域都有着广泛的应用,从图像编辑软件到网页设计,从科学研究到人工智能。Python 作为一种功能强大且易于学习的编程语言,拥有众多优秀的库来处理图像。其中,Pillow 库是 Python 中最常用的图像处理库之一。
Pillow是Python Imaging Library(PIL)的一个友好分支,它提供了广泛的功能,包括图像读取、保存、编辑、转换、绘制等。无论你是一名专业的软件开发人员,还是一个对图像处理感兴趣的爱好者,Pillow都能为你提供强大的工具来处理图像。
本文将详细介绍Pillow库的功能、用法和示例,帮助你快速掌握这个强大的图像处理库。
二、Pillow库的安装
在使用Pillow库之前,我们需要先安装它。可以使用以下命令来安装Pillow:
pip install pillow
安装完成后,我们就可以在Python程序中导入Pillow库了:
from PIL import Image
三、Pillow 库的基本概念
1. 图像对象
在Pillow中,图像由Image类的对象表示。可以通过多种方式创建图像对象,例如从文件中读取图像、创建一个新的空白图像等。
2. 图像模式
图像模式指定了图像中每个像素的表示方式。常见的图像模式有RGB(红、绿、蓝三原色)、 RGBA(红、绿、蓝、透明度)、 L (灰度)等。
3. 坐标系统
Pillow使用笛卡尔坐标系统来表示图像中的位置。左上角的坐标为(0, 0),x坐标从左到右增加,y 坐标从上到下增加。
四、图像的读取和保存
1. 从文件中读取图像
可以使用Image.open()函数从文件中读取图像。该函数返回一个Image对象,表示读取的图像。
2. 保存图像
可以使用Image.save()函数将图像保存到文件中。该函数接受一个文件名作为参数,并将图像保存到指定的文件中。
示例:
from PIL import Image# 从文件中读取图像image = Image.open('image.jpg')# 保存图像image.save('new_image.jpg')
五、图像的基本属性
1. 图像尺寸
可以使用Image.size属性获取图像的尺寸。该属性返回一个包含图像宽度和高度的元组。
# 获取图像尺寸width, height = image.sizeprint(f'图像尺寸:{width} x {height}')
2. 图像模式
可以使用Image.mode属性获取图像的模式。
# 获取图像模式mode = image.modeprint(f'图像模式:{mode}')
3. 图像格式
可以使用Image.format属性获取图像的格式。
# 获取图像格式format = image.formatprint(f'图像格式:{format}')
六、图像的裁剪、缩放和旋转
1. 裁剪图像
可以使用Image.crop()函数裁剪图像。该函数接受一个包含四个坐标值的元组作为参数,表示裁剪区域的左上角和右下角坐标。
# 裁剪图像cropped_image = image.crop((100, 100, 300, 300))
2. 缩放图像
可以使用Image.resize()函数缩放图像。该函数接受一个包含新宽度和新高度的元组作为参数,并返回一个缩放后的Image对象。
# 缩放图像resized_image = image.resize((500, 500))
3. 旋转图像
可以使用Image.rotate()函数旋转图像。该函数接受一个角度作为参数,并返回一个旋转后的Image对象。
# 旋转图像rotated_image = image.rotate(45)
七、图像的颜色调整
1. 调整亮度
可以使用ImageEnhance.Brightness类来调整图像的亮度。该类的enhance()方法接受一个亮度调整因子作为参数,并返回一个调整后的Image对象。
2. 调整对比度
可以使用ImageEnhance.Contrast类来调整图像的对比度。
3. 调整饱和度
可以使用ImageEnhance.Color类来调整图像的饱和度。
from PIL import ImageEnhance# 调整亮度enhancer = ImageEnhance.Brightness(image)brightened_image = enhancer.enhance(1.5)# 调整对比度enhancer = ImageEnhance.Contrast(image)contrasted_image = enhancer.enhance(2)# 调整饱和度enhancer = ImageEnhance.Color(image)saturated_image = enhancer.enhance(1.5)
八、图像的滤镜效果
1. 模糊效果
可以使用ImageFilter.BLUR滤镜来实现模糊效果。
2. 锐化效果
可以使用ImageFilter.SHARPEN滤镜来实现锐化效果。
3. 边缘检测效果
可以使用ImageFilter.FIND_EDGES滤镜来实现边缘检测效果。
示例:
from PIL import ImageFilter# 模糊效果blurred_image = image.filter(ImageFilter.BLUR)# 锐化效果sharpened_image = image.filter(ImageFilter.SHARPEN)# 边缘检测效果edged_image = image.filter(ImageFilter.FIND_EDGES)
九、图像的合成和叠加
1. 图像合成
可以使用Image.composite()函数来合成两个图像。该函数接受两个Image对象和一个遮罩图像作为参数,并返回一个合成后的Image对象。
2. 图像叠加
可以使用Image.blend()函数来叠加两个图像。该函数接受两个Image对象和一个混合因子作为参数,并返回一个叠加后的Image对象。
示例:
from PIL import Image# 打开两张图像
image1 = Image.open('image1.jpg')
image2 = Image.open('image2.jpg')# 合成图像
# 假设这里的 mask 可以根据实际情况进行设置
mask = Image.new('L', image1.size, 128)
composite_image = Image.composite(image1, image2, mask=mask)# 叠加图像
blended_image = Image.blend(image1, image2, alpha=0.5)# 显示合成后的图像
composite_image.show()# 显示叠加后的图像
blended_image.show()
十、图像的绘制
1. 绘制矩形
可以使用ImageDraw.Draw类的rectangle()方法来绘制矩形。该方法接受一个包含四个坐标值的元组作为参数,表示矩形的左上角和右下角坐标。
2. 绘制圆形
可以使用ImageDraw.Draw类的ellipse()方法来绘制圆形。该方法接受一个包含四个坐标值的元组作为参数,表示圆形的外接矩形的左上角和右下角坐标。
3. 绘制文本
可以使用ImageDraw.Draw类的text()方法来绘制文本。该方法接受一个坐标元组、文本内容和字体颜色作为参数。
from PIL import ImageDraw# 绘制矩形draw = ImageDraw.Draw(image)draw.rectangle((100, 100, 300, 300), outline='red')# 绘制圆形draw.ellipse((200, 200, 400, 400), outline='blue')# 绘制文本draw.text((100, 400), 'Hello, Pillow!', fill='green')
十一、示例程序:制作图片水印
以下是一个使用 Pillow 库制作图片水印的示例程序:
from PIL import Image, ImageDraw, ImageFont# 打开原始图像image = Image.open('original_image.jpg')# 创建一个新的透明图像,大小与原始图像相同watermark_image = Image.new('RGBA', image.size, (0, 0, 0, 0))# 创建一个绘图对象draw = ImageDraw.Draw(watermark_image)# 设置水印文本和字体text = 'Watermark'font = ImageFont.truetype('arial.ttf', 50)# 获取水印文本的尺寸text_width, text_height = draw.textsize(text, font)# 计算水印文本的位置x = image.width - text_width - 10y = image.height - text_height - 10# 在透明图像上绘制水印文本draw.text((x, y), text, font=font, fill=(255, 255, 255, 128))# 将水印图像叠加到原始图像上result_image = Image.alpha_composite(image.convert('RGBA'), watermark_image)# 保存结果图像result_image.save('watermarked_image.jpg')
十二、总结
Pillow库是一个功能强大且易于使用的Python 图像处理库。它提供了广泛的功能,包括图像读取、保存、编辑、转换、绘制等。通过本文的介绍,你应该对Pillow库的功能和用法有了更深入的了解。希望你能在实际项目中充分利用Pillow库的强大功能,实现各种图像处理任务。
无论是进行简单的图像编辑,还是进行复杂的图像处理算法开发,Pillow库都能为你提供有力的支持。同时,Pillow库还具有良好的文档和社区支持,如果你在使用过程中遇到问题,可以随时查阅文档或在社区中寻求帮助。
总之,Pillow库是Python图像处理领域的一颗明珠,值得每一位开发者去探索和使用。
相关文章:
Pillow:强大的Python图像处理库
目录 一、引言 二、Pillow 库的安装 三、Pillow 库的基本概念 四、图像的读取和保存 五、图像的基本属性 六、图像的裁剪、缩放和旋转 七、图像的颜色调整 八、图像的滤镜效果 九、图像的合成和叠加 十、图像的绘制 十一、示例程序:制作图片水印 十二、…...

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算
微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…...
为什么类 UNIX 操作系统通常内置编译器?为什么 Windows 更倾向于直接使用二进制文件?
操作系统是否内置编译器,取决于该系统的设计目标、用户群体以及常见的使用场景。以下是内置编译器和直接使用二进制的设计理念和原因的分析: 为什么类 UNIX 操作系统通常内置编译器? 面向开发者的需求: 类 UNIX 系统(如…...

吉林大学23级数据结构上机实验(第7周)
A 去火车站 寒假到了,小明准备坐火车回老家,现在他从学校出发去火车站,CC市去火车站有两种方式:轻轨和公交车。小明为了省钱,准备主要以乘坐公交为主。CC市还有一项优惠政策,持学生证可以免费乘坐一站轻轨&…...

实验13 使用预训练resnet18实现CIFAR-10分类
1.数据预处理 首先利用函数transforms.Compose定义了一个预处理函数transform,里面定义了两种操作,一个是将图像转换为Tensor,一个是对图像进行标准化。然后利用函数torchvision.datasets.CIFAR10下载数据集,这个函数有四个常见的…...
【开发文档】资源汇总,持续更新中......
文章目录 AI大模型数据集PytorchPythonUltralyticsOpenCVNetronSklearnCMakeListsNVIDIADocker刷题网站持续更新,欢迎补充 本文汇总了一些常用的开发文档资源,涵盖了常用AI大模型、刷题网站、Python、Pytorch、OpenCV、TensorRT、Docker 等技术栈。通过这…...
【k8s实践】 创建第一个Pod(Nginx)
环境 Rocky Linux9.4 x86_64 VM安装了Microk8s (参考:Microk8s安装方法) 说明: 其他k8s(例如: k3s, kubernetes)创建Pod的方法和Microk8s没啥区别,可以参考本文 目标 创建一个Nginx的Pod,映射宿主机30000端口到Pod容器的80端口;客户端能通…...

盘古大模型实战
0 前言 前一段时间,在学习人工智能的同时,也去了解了一下几乎是作为人工智能在气象上应用的一大里程碑式的研究成果-华为盘古气象大模型。正是盘古大模型的出现,促使天气预报的未来发展方向多了个除天气学方法、统计学方法、数值预报方法之外…...

Python subprocess.run 使用注意事项,避免出现list index out of range
在执行iOS UI 自动化专项测试的时候,在运行第一遍的时候遇到了这样的错误: 2024-12-04 20:22:27 ERROR conftest pytest_runtest_makereport 106 Test test_open_stream.py::TestOpenStream::test_xxx_open_stream[iPhoneX-xxx-1-250] failed with err…...
包管理器npm,cnpm,yarn和pnpm
npm (Node Package Manager) 核心技术与工作原理 依赖解析: 广度优先搜索(BFS):npm 使用 BFS 算法来解析依赖树,尽量扁平化 node_modules 目录以减少重复的依赖项。冲突处理:如果两个包需要同一个依赖的不…...
树莓派4B使用opencv读取摄像头配置指南
本文自己记录,给我们lab自己使用,其他朋友们不一定完全适配,请酌情参考。 一. 安装opecnv 我们的树莓派4B默认是armv7l架构,安装的miniconda最新的版本 Miniconda3-latest-Linux-armv7l.sh 仍然是python3.4几乎无法使用ÿ…...
Spring Boot 进阶话题:部署
部署是将应用程序从开发环境移动到可以供用户访问的生产环境的过程。Spring Boot提供了多种部署选项,包括打包为可执行jar文件,使用Docker容器化,以及部署到云平台。 打包Spring Boot应用 Spring Boot应用可以打包为包含所有依赖、类和资源…...
Python 3 和 MongoDB 的集成使用
Python 3 和 MongoDB 的集成使用 MongoDB 是一个流行的 NoSQL 数据库,以其灵活的数据模型和强大的查询功能而闻名。Python 3 作为一种广泛使用的编程语言,与 MongoDB 的集成变得日益重要。本文将介绍如何在 Python 3 环境中集成和使用 MongoDBÿ…...
perl语言中模式匹配的左右关系
这里简单记录一下,在perl语言中,关于模式匹配的一个细节: 在进行模式匹配的时候,左边写需要查找的字符串,右侧写匹配的关键字. 两边的顺序不一样就会导致匹配结果不一样. 测试代码:…...
【漏洞复现】网动统一通信平台(ActiveUC)接口iactiveEnterMeeting存在信息泄露漏洞
🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 @TOC 一、漏洞概述 1.1漏洞简介 漏洞名称:网动统一通信平台(ActiveUC)接口iactiveEnterMeeting存在信息泄露漏洞漏洞编号:无漏洞类型:信息泄露漏洞威胁等级:高危影…...

C++ STL 容器系列(三)list —— 编程世界的万能胶,数据结构中的百变精灵
STL系列学习参考: C STL系列__zwy的博客-CSDN博客https://blog.csdn.net/bite_zwy/category_12838593.html 学习C STL的三个境界,会用,明理,能扩展,STL中的所有容器都遵循这个规律,下面我们就按照这三个境…...
Java经典面试题总结(附答案)2025
点击获取PDF版 10、如何将字符串反转? 添加到StringBuilder中,然后调用reverse()。 11、String 类的常用方法都有那些? equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpt…...

Stylus 浏览器扩展开发-Cursor AI辅助
项目起源 作为一个经常需要长时间盯着屏幕的开发者,我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单:将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展,但我想要一个更加轻量且可定制的解决方案。 这个简单的需求逐渐…...

DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集
目录 01背包理论基础(一) 基本思路 C代码 01背包理论基础(二) 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础(一) 题目链接:卡码网46. 携带研究材料 文字…...
创建空向量:std::vector<int> v,刚创建时大小为0
创建一个空的std::vector<int> v会在刚创建时具有大小(size)为0的特点。这意味着此时向量中没有任何元素,而且其容量(capacity)也返回0,表明还没有为这个向量分配任何内存空间3。换句话说,…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...