PIL 图像与 NumPy 数组转换指南:轻松处理图像数据
2024-03-19 14:01:18
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")