首页 > 编程语言 >python-三方库-PyTorch-Pillow (PIL Fork)

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

时间:2024-11-14 14:44:45浏览次数:3  
标签:Fork None PIL python Image 图像 open image

1 需求

官网:https://python-pillow.org/

docs:https://pillow.readthedocs.io/en/stable/


需求:

  • Image.filename

需求:获取图像格式

  • Image.format

需求:获取图像尺寸

  • Image.size
  • Image.width
  • Image.height

需求:获取图像颜色模式

  • Image.mode

需求:获取图像像素值

  • Image.load()[x, y]

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 表示完全不透明。

标签:Fork,None,PIL,python,Image,图像,open,image
From: https://blog.csdn.net/pwp032984/article/details/143730474

相关文章

  • python毕设KTV点歌系统的设计与实现程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着信息技术的快速发展,娱乐行业也在不断进步。KTV作为一种流行的娱乐方式,已经成为了人们休闲放松的重要场所。然而,传统的KTV点歌系统存在......
  • Python讲解(第六篇)
    上一篇讲了运算符和字符串扩展的三种定义方法。但是字符串的扩展内容较多,分为了多篇讲解,所以这篇讲解字符串的扩展的字符串的拼接和字符串格式化。1.字符串的拼接在Python中,字符串拼接是指将两个或多个字符串合并成一个新的字符串。字符串拼接有多种方法,以下是几种常见的方......
  • python毕设仓库管理系统的设计程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于仓库管理系统的研究,现有研究多以特定行业或大规模企业的需求为主,专门针对用Python实现涵盖多种角色(如仓管员、采购员、财务员等)和......
  • 使用 Python 和 OpenCV 实现摄像头人脸检测并截图
    概述在现代应用中,人脸检测是一项非常重要的技术,广泛应用于安全监控、身份验证等领域。本文将详细介绍如何使用Python和OpenCV库实现摄像头人脸检测并截图,并通过具体的代码示例来展示整个过程。环境准备在开始编写代码之前,确保已经安装了OpenCV库。可以使用以下命令......
  • 探索 Python 函数式编程的瑞士军刀:Toolz 库
    文章目录探索Python函数式编程的瑞士军刀:Toolz库第一部分:背景介绍第二部分:Toolz库概述第三部分:安装Toolz库第四部分:Toolz库函数使用方法1.高阶函数2.计算管道3.字典合并4.分组5.累积计算第五部分:Toolz库使用场景场景1:学生分数统计场景2:数据流处理场景3:......
  • 探索视频编辑的无限可能:揭秘Python的MoviePy库
    文章目录探索视频编辑的无限可能:揭秘Python的MoviePy库第一部分:背景介绍第二部分:MoviePy是什么?第三部分:如何安装MoviePy?第四部分:简单库函数使用方法第五部分:实际应用场景第六部分:常见问题及解决方案第七部分:总结探索视频编辑的无限可能:揭秘Python的MoviePy库第一......
  • python共享全局变量的方案
    在Python中实现全局状态共享,可以采用以下几种方案:使用全局变量:在程序的任何地方都可以访问的变量称为全局变量。可以在一个模块中定义全局变量,并在另一个模块中使用它。例如,在module1.py中定义一个全局变量,并在module2.py中使用它。使用模块:将全局变量放在一个模块中,......
  • 使用Python爬虫获取商品订单详情:从API到数据存储
    在电子商务日益发展的今天,获取商品订单详情成为了许多开发者和数据分析师的需求。无论是为了分析用户行为,还是为了优化库存管理,订单数据的获取都是至关重要的。本文将详细介绍如何使用Python编写爬虫,通过API获取商品订单详情,并将数据存储到本地。环境搭建在开始编写爬虫之前......
  • python爬虫获得淘宝商品类目 API 返回值说明
    哎呀,说到淘宝商品类目API,这可真是个技术活。想象一下,你坐在电脑前,敲打着键盘,就像是探险家一样,准备深入淘宝这个巨大的宝藏岛。不过,别担心,我们的Python爬虫就是一把锋利的铲子,能帮你挖掘出那些闪闪发光的宝贝信息。首先,得有个计划。我们要用Python,这个强大的工具,来编写一个爬......
  • 面试合集2-python篇
    1、统计在一个队列中的数字,有多少个正数,多少个负数,如[1,3,5,7,0,-1,-9,-4,-5,8]2、字符串“axbyczdj”,如果得到结果“abcd” 3、已知一个字符串为“www.baidu.com”,如何得到一个队列[“www”,”baidu”,”com”]4、已知一个数字为1,如何输出“0001” 5、已......