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

python-三方库-PyTorch-Pillow (PIL Fork)

1 需求

需求:获取图像格式

需求:获取图像尺寸

需求:获取图像颜色模式


2 接口

https://pillow.readthedocs.io/en/stable/reference/Image.html#

Functions

  • PIL.Image.open(fp: StrOrBytesPath | IO[bytes], mode: Literal['r'] = 'r', formats: list[str] | tuple[str, ...] | None = None)

The Image Class

  • Image.convert(mode: str | None = None, matrix: tuple[float, ...] | None = None, dither: Dither | None = None, palette: Palette = Palette.WEB, colors: int = 256)
  • Image.crop(box: tuple[float, float, float, float] | None = None)
  • Image.resize(size: tuple[int, int] | list[int] | NumpyArray, resample: int | None = None, box: tuple[float, float, float, float] | None = None, reducing_gap: float | None = None)
  • Image.rotate(angle: float, resample: Resampling = Resampling.NEAREST, expand: int | bool = False, center: tuple[float, float] | None = None, translate: tuple[int, int] | None = None, fillcolor: float | tuple[float, ...] | str | None = None)
  • Image.save(fp: StrOrBytesPath | IO[bytes], format: str | None = None, **params: Any)
  • Image.show(title: str | None = None)
  • Image.load()
  • Image.close()

Image Attributes

  • Image.filename
  • Image.format
  • Image.mode
  • Image.size
  • Image.width
  • Image.height

import PIL.Image as Image# 打开指定路径下的图像文件,这里假设"./data/train/1_1.jpg"是要打开的图像路径
image = Image.open("./data/train/1_1.jpg")# 打印图像的文件名,注意这里的文件名可能包含路径信息,具体取决于打开图像时的设置
print(image.filename)# 打印图像的格式,比如常见的格式有'JPEG'、'PNG'等,它表示图像文件的存储格式类型
print(image.format)# 打印图像的颜色模式,常见的模式有'RGB'(彩色图像,包含红、绿、蓝三个通道)、'L'(灰度图像,单通道)等
print(image.mode)# 打印图像的尺寸,它返回一个包含两个元素的元组,分别表示图像的宽度和高度(单位为像素)
print(image.size)# 打印图像的宽度
print(image.width)# 打印图像的高度
print(image.height)# 获取图像的像素访问对象,通过这个对象可以使用坐标来访问图像中的每个像素
pixels = image.load();# 通过两层循环遍历图像的每一个像素
# 外层循环控制行,从图像的顶部开始,逐行向下遍历,循环次数为图像的高度值
for i in range(image.height):# 内层循环控制列,从图像的左侧开始,逐列向右遍历,循环次数为图像的宽度值for j in range(image.width):# 打印出坐标为(i, j)的像素值# 对于彩色图像(如'RGB'模式),这里会打印出一个包含三个元素的元组,分别对应红、绿、蓝三个通道的值# 对于灰度图像(如'L'模式),这里会打印出一个表示灰度值的整数print(pixels[i, j])

3 获取图像属性相关操作

  • 获取图像尺寸:通过size属性可以获取图像的宽度和高度,它返回一个包含两个元素的元组(宽度, 高度)。例如:
from PIL import Image
image = Image.open("example.jpg")
width, height = image.size
print(f"图像宽度为 {width} 像素,高度为 {height} 像素")
  • 获取图像格式format属性用于获取图像的格式,如JPEGPNG等。例如:
from PIL import Image
image = Image.open("example.jpg")
print(f"图像格式为 {image.format}")
  • 获取图像模式(颜色模式)mode属性可以获取图像的模式,常见的有L(灰度图,单通道)、RGB(彩色图,三通道)、RGBA(带透明度的彩色图,四通道)等。例如:
from PIL import Image
image = Image.open("example.jpg")
print(f"图像模式为 {image.mode}")
  • 获取图像的像素数据类型dtype属性用于获取图像像素数据的类型,在不同的图像模式下可能不同。例如,对于8位的图像(如常见的LRGB模式的8位图像),数据类型通常是uint8
from PIL import Image
image = Image.open("example.jpg")
print(f"图像像素数据类型为 {image.dtype}")

3 图像显示操作

  • 简单显示图像:可以使用show()方法在系统默认的图像查看器中显示图像。不过这种方式在一些环境下可能不太方便,例如在服务器环境中没有图形界面时无法使用。例如:
from PIL import Image
image = Image.open("example.jpg")
image.show()

3 图像转换操作

  • 转换为其他模式:使用convert()方法可以将图像转换为其他模式。例如,将彩色图像转换为灰度图像:
from PIL import Image
color_image = Image.open("color_example.jpg")
gray_image = color_image.convert("L")
  • 转换为不同的数据类型:可以将图像的像素数据转换为其他数据类型,比如将uint8类型的像素数据转换为float32类型。这在一些需要进行高精度计算的场景(如某些图像分析算法)中可能会用到。不过,这种操作可能会改变图像的像素值范围等属性。
from PIL import Image
image = Image.open("example.jpg")
new_image = image.astype("float32")

3 图像裁剪操作

  • 使用crop()方法裁剪图像:通过指定一个包含左上角坐标(xy)和右下角坐标(x + widthy + height)的元组来裁剪图像。例如,裁剪图像的中心部分:
from PIL import Image
image = Image.open("example.jpg")
width, height = image.size
left = width * 0.25
top = height * 0.25
right = width * 0.75
bottom = height * 0.75
cropped_image = image.crop((left, top, right, bottom))

3 图像缩放和旋转操作

  • 缩放图像:可以使用resize()方法按照指定的尺寸来缩放图像。例如,将图像缩小到原来的一半大小:
from PIL import Image
image = Image.open("example.jpg")
new_size = (int(image.size[0] * 0.5), int(image.size[1] * 0.5))
resized_image = image.resize(new_size)
  • 旋转图像:使用rotate()方法可以按照指定的角度旋转图像。例如,将图像逆时针旋转90度:
from PIL import Image
image = Image.open("example.jpg")
rotated_image = image.rotate(90)

3 图像保存操作

  • 保存图像为其他格式或文件名:使用save()方法可以将图像保存为其他格式或文件名。例如,将打开的JPEG图像保存为PNG格式:
from PIL import Image
image = Image.open("example.jpg")
image.save("example.png")
  • 设置保存选项:在保存图像时,可以设置一些选项,比如图像质量(对于JPEG格式)、压缩级别等。例如,保存JPEG图像时设置质量为80%:
from PIL import Image
image = Image.open("example.jpg")
image.save("new_example.jpg", quality = 80)

4 参考资料

io.open()和PIL.Image.open()

  1. 数据格式和处理目的的差异
    • open接口:Python 的open接口主要用于打开文本文件或二进制文件,以字节流的形式读取文件内容。当用于打开图片文件时,它仅仅是读取了文件中的字节数据,这些字节数据没有经过任何图像格式相关的解析。例如,对于 JPEG 或 PNG 格式的图像,open读取到的只是它们存储在文件中的原始字节序列,无法直接将这些字节转换为适合深度学习模型输入的张量格式。
    • PIL.Image.open接口PIL(Python Imaging Library,更常用的是其分支Pillow)中的Image.open接口是专门为处理图像而设计的。它能够识别多种常见的图像格式(如 JPEG、PNG、BMP 等),并将图像文件的字节数据解析为图像对象。这个图像对象包含了图像的尺寸、颜色模式等信息,并且可以方便地进行各种图像操作,如缩放、裁剪、旋转等。在将图像转换为张量时,PIL.Image.open能够提供一个经过格式解析的、包含完整图像信息的中间对象,从而更方便地将其转换为张量。
  2. 数据维度和通道顺序的考虑
    • open接口:如果仅使用open接口读取图像文件,开发者需要自己了解图像文件的格式细节来提取和组织像素数据。例如,对于彩色图像,需要知道像素的通道顺序(如 RGB 或 BGR)、每个通道的数据存储方式等。而且,读取到的字节数据可能需要复杂的处理才能转换为正确的维度格式。通常,深度学习模型期望的图像张量格式是(通道数, 高度, 宽度),而通过open接口读取后很难直接得到这种符合要求的格式。
    • PIL.Image.open接口PIL.Image.open读取图像后,可以方便地获取图像的高度、宽度和通道数等信息。并且,在将图像转换为张量时,PIL库可以按照深度学习框架(如 PyTorch)期望的格式进行转换。例如,在 PyTorch 中,transforms.ToTensor函数与PIL.Image.open配合使用时,能够自动将图像的像素值转换为合适的范围(通常是0 - 1),并将图像的维度调整为(通道数, 高度, 宽度)的张量格式,便于后续作为模型的输入进行处理。
  3. 与深度学习生态系统的集成便利性
    • open接口:使用open接口读取的图像数据与深度学习库(如 PyTorch)的集成较为困难。因为深度学习库通常需要特定格式的输入数据,如张量格式,并且可能还需要对数据进行归一化、数据增强等预处理操作。仅通过open读取的图像字节数据无法直接满足这些要求,需要编写大量额外的代码来进行数据格式转换和预处理。
    • PIL.Image.open接口PIL库与 PyTorch 等深度学习库有很好的集成。例如,torchvision.transforms模块中的许多函数(如ToTensorNormalize等)都是基于PIL.Image.open读取的图像对象进行操作的。这种集成使得在深度学习项目中处理图像数据变得更加高效和便捷,从图像读取到数据预处理再到模型输入的整个流程可以无缝衔接。

PIL.Image.open().mode()

当使用PIL.Image.open打开一张图像后,可以通过image.mode属性来获取图像的模式,进而确定通道数。常见的模式有:

  • L模式(灰度图):表示单通道图像,通道数为 1。这种模式下图像的像素值范围通常是 0 - 255,表示灰度级别。
  • RGB模式(彩色图):代表三通道图像,通道数为 3,分别对应红(Red)、绿(Green)、蓝(Blue)三个颜色通道。每个通道的像素值范围一般也是 0 - 255。
  • RGBA模式(带透明度的彩色图):这是一个四通道的模式,通道数为 4,在 RGB 三个颜色通道的基础上增加了一个透明度(Alpha)通道,用于表示图像的透明度信息。像素值范围和 RGB 模式类似,透明度通道的值范围通常也是 0 - 255,其中 0 表示完全透明,255 表示完全不透明。

http://www.mrgr.cn/news/74680.html

相关文章:

  • Mac的极速文件搜索工具,高效管理文件
  • Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测
  • 随笔20241113 数据分组与期次累加计算功能实现
  • Autosar CP 基于CAN的时间同步规范导读
  • Spring Boot 的生命周期
  • 【Vue】Vue3.0(二十四)Vue3.0中$refs 、$parent 的概念和使用场景
  • 植物神经紊乱不用怕,科学锻炼助你找回平衡✨
  • Go语言开发基于SQLite数据库实现用户表查询详情接口(三)
  • 【前端学习指南】Vue computed 计算属性 watch 监听器
  • 2024 ECCV | DualDn: 通过可微ISP进行双域去噪
  • 2024-在Gentoo claculate Linux中设置中文支持
  • 【云原生开发】K8S多集群管理系统成果展示
  • WinCC Professional S5Time及Time数据显示
  • Ubuntu20.04.3.LTS安装ftp
  • .NET 9中数据集合类型及其性能比较与应用场景分析
  • 管家婆财贸ERP BB092.物配任务工作台凭证引入
  • MySQL索引创建原则总结
  • 现代网络安全:关键技术与实战策略
  • 利用 React 构建现代化 Web 应用的核心实践
  • BFS 算法专题(三):BFS 解决边权为 1 的最短路问题
  • PostgreSQL 一键安装部署脚本化
  • 【算法】【优选算法】前缀和(上)
  • SQLI LABS | Less-45 POST-Error Based-String-Stacked-Bilnd
  • Python防检测之鼠标移动轨迹算法
  • 英语中常用的两者及以上的词表示,并且比较它们
  • Bootstrap 5 轮播