返回

PIL 图像与 NumPy 数组转换指南:轻松处理图像数据

python

PIL 图像与 NumPy 数组之间的转换:深入解析

图像处理中,灵活地在 PIL 图像和 NumPy 数组之间进行转换至关重要。在本篇文章中,我们将深入探讨如何将 PIL 图像转换为 NumPy 数组,修改数组,然后将其转换回 PIL 图像。

PIL 图像转换为 NumPy 数组

要将 PIL 图像转换为 NumPy 数组,只需使用 numpy.array(pic.getdata())。这将返回一维像素数组。然后使用 reshape() 方法将其重塑为三维数组,其中第一维表示高度,第二维表示宽度,第三维表示颜色通道 (RGB)。

pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)

NumPy 数组转换为 PIL 图像

要将 NumPy 数组转换为 PIL 图像,只需使用 Image.fromarray(pix)

pic = Image.fromarray(pix)

修改数组

在修改 NumPy 数组时,可以使用标准的 NumPy 操作。例如,要将左上角像素设置为红色,可以使用以下代码:

pix[0, 0] = [255, 0, 0]

避免使用 putdata() 方法

在某些情况下,putdata() 方法可能无法正常工作。一种替代方法是使用 tobytes() 方法将 NumPy 数组转换为字节流,然后使用 frombytes() 方法将其加载到 PIL 图像中:

pic = Image.frombytes("RGB", pic.size, pix.tobytes())

示例代码

以下代码片段展示了如何将 PIL 图像转换为 NumPy 数组,修改数组,然后将其转换回 PIL 图像:

from PIL import Image
import numpy as np

pic = Image.open("foo.jpg")
pix = np.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
pix[0, 0] = [255, 0, 0]
pic = Image.fromarray(pix)
pic.save("modified_foo.jpg")

结论

通过使用 numpy.array()reshape()Image.fromarray()tobytes() 方法,可以在 PIL 图像和 NumPy 数组之间轻松转换。了解这些转换技术对于图像处理和分析至关重要。

常见问题解答

1. 什么情况下应该使用 NumPy 数组而不是 PIL 图像?

当需要进行像素级操作时,NumPy 数组的处理速度比 PIL 图像更快。

2. 为什么要避免使用 putdata() 方法?

putdata() 方法在某些情况下可能无法正常工作,而使用 tobytes()frombytes() 方法是一种更可靠的方法。

3. 如何将 NumPy 数组转换为灰度图像?

将 NumPy 数组转换为灰度图像,可以将其转换为一维数组并取其平均值:

gray_pix = np.mean(pix, axis=2)

4. 如何将 NumPy 数组裁剪为特定区域?

可以使用 array.shape() 属性获取 NumPy 数组的形状,然后使用 array[y1:y2, x1:x2] 裁剪特定区域。

5. 如何将 PIL 图像保存为不同的文件格式?

可以使用 Image.save() 方法将 PIL 图像保存为不同的文件格式,例如:

pic.save("new_image.png", "PNG")