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