Python常用库(五):图像处理【Pillow】

news2025/1/21 18:50:02

1. Pillow

1.1 介绍

Pillow 是第三方开源的 Python 图像处理库,它支持多种图片格式,包括 BMP、GIF、JPEG、PNG、TIFF 等。Pillow 库包含了大量的图片处理函数和方法,可以进行图片的读取、显示、旋转、缩放、裁剪、转换等操作。在后续的深度学习中也不可或缺,是个比较重要的库。

Pillow是torchvison使用的图像处理库,而torchvison是PyTorch中专门用来处理图像的库

Github(截止当前 11.1K): https://github.com/python-pillow/Pillow

  • 官方文档: https://pillow.readthedocs.io/en/stable/index.html
  • 中文文档: https://www.osgeo.cn/pillow/

1.2 安装

$ pip install --upgrade Pillow

1.3 常用子模块

Pillow模块中有很多子模块,常用的子模块有:

  • Image: 该模块是 Pillow中最重要的模块之一,用于处理图像文件。它提供了打开、保存、调整大小、旋转、裁剪、滤镜等功能,是图像处理的核心。
  • ImageDraw: 该模块提供了在图像上绘制各种形状(如线条、矩形、圆形)和文本的功能。可以使用不同的颜色和宽度绘制,创建自定义的标记或绘制图表等。
  • ImageFont: 该模块用于加载和使用 TrueType字体文件,以便在图像上绘制文本时设置字体样式、大小和颜色。
  • ImageFilter: 该模块提供了各种滤镜效果,如模糊、锐化、边缘增强等。这些滤镜可以用于图像增强、特效处理和图像识别等应用。
  • ImageEnhance: 该模块用于调整图像的亮度、对比度、颜色饱和度等参数,使得图像更加清晰、明亮或具有特定的调色效果。
  • ImageChops: 该模块用于执行图像的逻辑和算术操作,如合并、比较、掩蔽等。可以进行图像合成、混合和提取等操作。
  • ImageOps: 该模块提供了各种图像处理操作,如镜像、翻转、自动对比度调整等。可以方便地进行图像变换和增强。
  • ImageStat: 该模块用于计算图像的统计信息,如均值、中位数、直方图等。可用于图像质量评估、颜色分析和特征提取等任务。

2. 图像基本操作

2.1 读取图片

使用Image.open()来打开图像后,可以直接访问其属性信息,属性信息如下:

from PIL import Image

if __name__ == '__main__':
    imgPath = "img/test.jpg"
    # 读取图像
    img = Image.open(imgPath)
    # 打印图像属性
    print("读取对象img:", img)
    print("图像文件名:", img.filename)
    print("图像扩展名:", img.format)
    print("图像描述:", img.format_description)
    print("图像尺寸:", img.size)
    print("图像模式:", img.mode)
    print("图像宽度(像素):", img.width)
    print("图像高度(像素):", img.height)
    print("图象有关的数据的字典:", img.info)
    print("---------------------- 计算图片大小 --------------------------")
    # 图片大小(文件大小)
    with open(imgPath, "rb"as f:
        size = len(f.read())
        print("{}图片的大小(按照文件大小方式): {} byte,{} kb,{} Mb".format(img.filename, size, size / 1e3, size / 1e6))

        
# ---------------------------- 输出 ------------------------------  
读取对象img: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=3840x2160 at 0x10F6F2910>
图像文件名: img/test.jpg
图像扩展名: JPEG
图像描述: JPEG (ISO 10918)
图像尺寸: (38402160)
图像模式: RGB
图像宽度(像素): 3840
图像高度(像素): 2160
图象有关的数据的字典: {'jfif'257'jfif_version': (11), 'jfif_unit'0'jfif_density': (7272), 'exif'b'Exif\x00\x00II*\x00\x08\x00\x00\x00\x02\x00\x1a\x01\n\x00\x01\x00\x00\x00&\x00\x00\x00\x1b\x01\n\x00\x01\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00''dpi': (7272), 'photoshop': {1028b'\x1c\x02A\x00\nTopaz Labs'}}
---------------------- 计算图片大小 --------------------------
img/test.jpg图片的大小(按照文件大小方式): 11422554 byte,11422.554 kb,11.422554 Mb

2.2 另存图片

from PIL import Image

if __name__ == '__main__':
    imgPath = "img/test.jpg"
    # 读取图像
    # ImageUse.openImg(imgPath)
    img = Image.open(imgPath)
    # 文件名 —> quality值
    imgNameMap = {
        "test_default"75,
        "test_compress"1,
        "test_quality"100,
    }
    # 不修改文件格式
    for fileName, qualityVal in imgNameMap.items():
        img.save("./img/{}.jpg".format(fileName), quality=qualityVal)

    # 修改文件格式
    for fileName, qualityVal in imgNameMap.items():
        img.save("./img/{}.png".format(fileName), quality=qualityVal)

1. 查看另存的图像大小信息:

# 使用ls -lh
$ ls -lh img/*
-rw-r--r--@ 1 liuqh  staff    11M Aug 29 10:04 img/test.jpg
-rw-r--r--  1 liuqh  staff   134K Sep  6 14:54 img/test_compress.jpg
-rw-r--r--  1 liuqh  staff    13M Sep  6 14:54 img/test_compress.png
-rw-r--r--  1 liuqh  staff   570K Sep  6 14:54 img/test_default.jpg
-rw-r--r--  1 liuqh  staff    13M Sep  6 14:54 img/test_default.png
-rw-r--r--  1 liuqh  staff   5.0M Sep  6 14:54 img/test_quality.jpg
-rw-r--r--  1 liuqh  staff    13M Sep  6 14:54 img/test_quality.png

2.使用说明

  • 另存为同类型格式时: save方法会默认进行压缩( quality=75),可以通过调整 quality(1-100)值的大小来调整压缩后的图片质量。
  • 另存为不同类型格式时: 上面示例发现图片从jpg转到png后,图片大小比原来的大了2M,具体原因还未搜索到....

2.3 调整图片

Pillow模块还提供对图片进行大小调整、逆时针方向旋转、上下翻转、左右翻转等方法

from PIL import Image

if __name__ == '__main__':
    img = Image.open("./img/a.jpg")
    # 更改图片大小为500 * 500
    img.resize((500500), Image.LANCZOS).save("./img/small.jpg")
    # ------------------------ 图片逆时针旋转 ----------------------
    # 图片逆时针旋转90
    img.rotate(90).save("./img/90.jpg")
    # 图片逆时针旋转120
    img.rotate(120).save("./img/120.jpg")
    # 图片逆时针旋转180
    img.rotate(180).save("./img/180.jpg")
    # ------------------------ 图片翻转 ----------------------
    # 图片左右翻转
    img.transpose(Image.FLIP_LEFT_RIGHT).save("./img/flip_left_right.jpg")
    # 图片上下翻转
    img.transpose(Image.FLIP_TOP_BOTTOM).save("./img/flip_top_bottom.jpg")

resize函数中的第二个参数说明:

参数:resample 一个可选的重采样过滤器,常用的常量含义如下:

  • Image.NEAREST: 从输入图像中选取一个最近的像素。忽略所有其他输入像素
  • Image.BILINEAR: 双线采样法
  • Image.LANCZOS: 力求输出最高质量像素的过滤器,只可用于 resize()thumbnail() 方法。
alt

2.4 编辑图片

from PIL import Image

if __name__ == '__main__':
    # 打开图片
    img = Image.open("./img/spider_man.jpg")
    # 复制原对象
    imgCopy = img.copy()
    # 创建缩略图
    size = (500500)
    img.thumbnail(size)
    img.save("./img/spider_man_thumb.jpg")
    # 裁剪左上角英文
    cropImg = imgCopy.crop((00500200))
    cropImg.save("./img/crop.jpg")
    # 裁剪蜘蛛侠头
    cropHeadImg = imgCopy.crop((210020029001000))
    cropHeadImg.save("./img/crop_head.jpg")

    # 图像合成-一次
    # cropHeadImg.show()
    onePasteImg = imgCopy.copy()
    onePasteImg.paste(cropHeadImg, (13000))
    onePasteImg.save("./img/paste_once.jpg")
    # onePasteImg.show()

    # 图像合成-铺满
    imgPaste = imgCopy.copy()
    for x in range(05000800):
        for y in range(10003400800):
            imgPaste.paste(cropHeadImg, (x, y))
    imgPaste.save("./img/paste_spread_out.jpg")

图像裁剪函数crop,接受的元组四个数字代表含义如下:(左上角的x轴坐标,左上角的y轴坐标,左上角的y轴坐标,左上角的y轴坐标)

alt

3. 图像绘制

3.1 绘制图形

图像绘制的功能基本都在 ImageDraw包内

from PIL import ImageDraw
from PIL import Image

if __name__ == '__main__':
    # 创建一个图像
    img = Image.new("RGBA", (10001000), "Cyan")
    # 获取绘制对象
    draw = ImageDraw.Draw(img)
    # 画点 黑色
    for x in range(02005):
        for y in range(02005):
            draw.point([(x, y)], fill="black")
    # 划线(十字架)
    draw.line([(5000), (5001000)], fill="red")
    draw.line([(0500), (1000500)], fill="blue")

    # 画圆
    draw.ellipse((180180480480), fill="green")
    # 画椭圆
    draw.ellipse((710100900410), fill="red")
    # 画矩形(蓝色底层、红色边框线)
    draw.rectangle((100520400800), fill="blue", outline="black")
    # 画多变形
    draw.polygon([(650650), (700510), (930880), (508711), (666999)], fill="Purple")
    # img.show()
    img.save("./img/draw.png")
alt

3.2 填充文字

from PIL import ImageDraw, ImageFont

from PIL import Image

if __name__ == '__main__':
    img = Image.open("./img/spider_man.jpg")
    # 获取绘制对象
    draw = ImageDraw.Draw(img)
    # 设置字体,mac用户字体位置在:/Library/Fonts
    imgFont = ImageFont.truetype("/Library/Fonts/AdobeKaitiStd-Regular.otf"150)
    # 写入中文
    draw.text((15001000), text="蜘蛛侠", font=imgFont, fill="red")
    # 写入英文
    imgFont2 = ImageFont.truetype("/Library/Fonts/AdobeKaitiStd-Regular.otf"80)
    draw.text((15001200), text="Spider Man", font=imgFont2)
    img.thumbnail((1000600))
    # img.save("./img/t.jpg")
    img.show()

draw.text() 部分参数说明:

  • xy: 文本的坐标。
  • text : 要绘制的字符串。
  • fill: 用于文本的颜色。
  • font: 一个 ImageFont实例。
  • stroke_width: 文本笔画的宽度。
  • stroke_fill: 用于文本描边的颜色。如果没有给出,将默认为填充参数。
alt

4. 图像滤镜

4.1 模糊

from PIL import ImageFilter
from PIL import Image

if __name__ == '__main__':
    img = Image.open("./img/girl.jpg")
    # 盒子模糊,数值越大越模糊
    boxObscureImg = img.filter(ImageFilter.BoxBlur(15))
    boxObscureImg.save("./img/boxObscureImg.jpg")
    # 高斯模糊
    gaussianBlur = img.filter(ImageFilter.GaussianBlur(15))
    gaussianBlur.save("./img/gaussianBlur.jpg")
alt

4.2 轮廓和浮雕

from PIL import ImageFilter
from PIL import Image

if __name__ == '__main__':
    img = Image.open("./img/girl.jpg")
    # 寻找图像轮廓信息
    contourImg = img.filter(ImageFilter.CONTOUR)
    contourImg.save("./img/contour.jpg")
    contourImg.show()
    # 寻图像的边界信息
    find_edgesImg = img.filter(ImageFilter.FIND_EDGES)
    find_edgesImg.save("./img/find_edges.jpg")
    find_edgesImg.show()
    # 浮雕滤波
    embossImg = img.filter(ImageFilter.EMBOSS)
    embossImg.save("./img/emboss.jpg")
    embossImg.show()
alt

4.3 增强

from PIL import ImageFilter
from PIL import Image

if __name__ == '__main__':
    img = Image.open("./img/girl.jpg")
    img.show()
    # 深度边缘增强滤波
    edgeEnhanceImg = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    edgeEnhanceImg.save("./img/edge_enhance_more.jpg")
    edgeEnhanceImg.show()

增强之后,图片是比之前的更清晰,具体图片这里就不在展示.下面列举几个增强参数

参数常量说明
ImageFilter.DETAIL细节滤波,使得图像显示更加精细
ImageFilter.EDGE_ENHANCE边界增强滤波
ImageFilter.EDGE_ENHANCE_MORE深度边缘增强滤波
ImageFilter.SHARPEN锐化滤波

微信搜索【猿码记】查看更多文章

本文由 mdnice 多平台发布

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

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

相关文章

python开发基础篇2——登陆机制

文章目录 一、管理平台页面布局二、登录页面2.1 token登录2.2. kubeconfig登录2.3 添加装饰器 一、管理平台页面布局 应用名称&#xff1a; dashboard&#xff1a;存放公共 k8s&#xff1a; Node&#xff1a;K8s集群计算节点。Namespaces&#xff1a;命名空间&#xff0c;用于…

ABAP WS_DELIVERY_UPDATE 报错 BS013

在使用 WS_DELIVERY_UPDATE 创建内向交货单时 报错&#xff1a;System status ESTO is active (EQU ***) 可以用事务代码IE03--->历史去看下 你可以手动将它的状态去改回EDEL 或者 SLOR IE02--> Special serial no. functions --> Manual transaction.

C#,《小白学程序》第十七课:随机数(Random)第四,移动平均值(Moving Average)的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十七课&#xff1a;随机数&#xff08;Random&#xff09;第四&#xff0c;移动平均值的计算方法与代码 /// 继续学习数据统计&#xff0c;移动平均值的计算方法 /// 移动平均值就是一定步长内数值的平均值&#xff0c;用…

Llama 2 论文《Llama 2: Open Foundation and Fine-Tuned Chat Models》阅读笔记

文章目录 Llama 2: Open Foundation and Fine-Tuned Chat Models1.简介2.预训练2.1 预训练数据2.2 训练详情2.3 LLAMA 2 预训练模型评估 3. 微调3.1 supervised Fine-Tuning(SFT)3.2 Reinforcement Learning with Human Feedback (RLHF)3.2.1 人类偏好数据收集3.2.2 奖励模型训…

Matlab 如何选择窗函数和 FFT 的长度

Matlab 如何选择窗函数和 FFT 的长度 1、常用的四种窗函数 对于实际信号序列&#xff0c;如何选取窗函数呢&#xff1f;一般来说&#xff0c;选择第一旁瓣衰减大&#xff0c;旁瓣峰值衰减快的窗函数有利于緩解截断过程中产生的頻泄漏问题。但具有这两个特性的窗函数&#xff0…

[BFS] 广度优先搜索

1. 数字操作 常见的模板 // 使用一个数组判断元素是否入过队 int inqueue[N] {0}; // 层数或者可以称为深度 int step 0; // 判断是否可以入队的条件 int isvalid(){ } BFS(int x){ // 将初始的元素压入队列 // 注意每次压队的时候都要将inque[x] 1,表明入队过…

python实现adb辅助点击屏幕工具

#!/usr/bin/env python # -*- coding: utf-8 -*-import re import os import time import subprocess import tkinter as tk from tkinter import messagebox from PIL import Image, ImageTk# 设置ADB路径&#xff08;根据你的系统和安装路径进行调整&#xff09; ADB_PATH C…

Ubuntu快速搭建内网NTP Server

文章目录 安装NTP服务配置NTP配置NTP 同步源配置NTP 允许客户端访问重启NTP服务使得配置生效 推荐阅读 NTP(Network Time Protocol)------网络时间协议-----应用层协议&#xff0c;用来在分布式时间服务器和客户端之间进行时间同步。 是对网络内所有具有时钟的设备进行时钟同步…

图解 LeetCode 算法汇总——链表

本文首发公众号&#xff1a;小码A梦 一般数据主要存储的形式主要有两种&#xff0c;一种是数组&#xff0c;一种是链表。数组是用来存储固定大小的同类型元素&#xff0c;存储在内存中是一片连续的空间。而链表就不同于数组。链表中的元素不是存储在内存中可以是不连续的空间。…

酒店类型的软文怎么写?

马上就放长假了&#xff0c;有不少酒店行业来找盒子做推广&#xff0c;其实酒店行业想要写好软文只要掌握三种类型就好了&#xff0c;今天就让盒子告诉大家酒店类型的软文怎么写才能吸引用户。 一、以故事打动用户 故事型软文大多用于民宿酒店&#xff0c;民宿酒店文案除了展现…

Docker认识即安装

Docker及相关概念 Docker和虚拟机方式的区别&#xff1a;虚拟机技术是虚拟出一套硬件后&#xff0c;在其上运行一个完整的操作系统&#xff0c;在该系统上在运行所需应用进程&#xff1b;而容器内的应用进程是直接运行于宿主的内核&#xff0c;容器内没有自己的内核&#xff0…

2023区块链应用操作员认证(4级)报名来弘博创新

区块链应用操作员&#xff0c;是指运用区块链技术及工具&#xff0c;从事政务、金融、医疗、教育、养老等场景系统应用操作的人员。 腾讯作为广东省第一批公布的社会培训评价组织&#xff0c;可开展职业技能等级认定职业(工种)区块链应用操作员(4-3-2-1级)。 证书含金量 证书是…

小节4:input()函数的一些讲究

千万注意&#xff1a;不管用户输入的是什么&#xff0c;input()返回的一律都是字符串&#xff0c;代码如下&#xff1a; user_input input("Please input something: ") print(type(user_input)) 所以&#xff0c;如果直接拿用户输入的内容去做数学运算&#xff0c…

JavaScript 之 常用迭代方法forEach、filter()、map()、reduce()

JavaScript 之 常用迭代方法forEach、filter、map、reduce 1. for、forEach1.1 for 遍历的3种写法1.2 forEach 回调函数 遍历1.3 forEach 箭头函数 遍历 2. filter()2.1 介绍2.2 例子1——简单过滤2.3 例子2——在修改数组时 filter() 方法的行为2.4 例子3——在数组中搜索 3…

生成式 AI 中的风险认知

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 直到几年前&#xff0c;你能想象一台机器可以创造艺术、制作故事&#xff0c;甚至理解复杂的数据&#xff0c;如医疗和法律文件吗&#xff1f; 应该不会。对于我们大多数人来说&#xff0c;它仅限于一部看似牵强附会的…

博客系统项目

文章目录 数据库的增删改查草稿箱草稿箱自动保存分页查询后端前端 评论区后端前端 md5加盐加密 md5加盐对用户密码进行加密; 全服用户博客列表页,实现分页查询; 用户博客列表页; 写博客,发博客,改博客; 博客草稿箱,自动保存,定时发布; 博客访问量,博客评论区,博客点赞; 数据库…

MojoTween:使用「Burst、Jobs、Collections、Mathematics」优化实现的Unity顶级「Tween动画引擎」

MojoTween是一个令人惊叹的Tween动画引擎&#xff0c;针对C#和Unity进行了高度优化&#xff0c;使用了Burst、Jobs、Collections、Mathematics等新技术编码。 MojoTween提供了一套完整的解决方案&#xff0c;将Tween动画应用于Unity Objects的各个方面&#xff0c;并可以通过E…

恒运资本:人民币汇率何时走出低谷?

9月7日&#xff0c;国家外汇管理局发布统计数据显现&#xff0c;到2023年8月末&#xff0c;我国外汇储藏规划为31601亿美元&#xff0c;较7月末下降442亿美元&#xff0c;降幅为1.38%。 国家外汇管理局相关负责人表明&#xff0c;2023年8月&#xff0c;受首要经济体微观经济数…

《机器人学一(Robotics(1))》_台大林沛群 第 7 周 【轨迹规划_综合】Quiz 7

题 4-5 存疑&#xff0c;仅供参考&#xff0c;欢迎交流 文章目录 题4-9&#xff1a;题4-5求解代码&#xff1a; Python题6-7求解代码&#xff1a; Python求解 θ4-θ6 时&#xff0c; 记得 将 R 改成相应的&#xff01;&#xff01;&#xff01;&#xff01; 题8-9求解代码&…

深浅拷贝与赋值

数据类型 数据类型 在JavaScript中&#xff0c;数据类型有两大类。一类是基本数据类型&#xff0c;一类是引用数据类型。 基本数据类型有六种&#xff1a;number、string、boolean、null、undefined、symbol。 基本数据类型存放在栈中。存放在栈中的数据具有数据大小确定&a…