PIL图像转换为Numpy数组:技术与案例详解

简介: 本文介绍了如何将PIL图像转换为Numpy数组,以便利用Numpy进行数学运算和向量化操作。首先简要介绍了PIL和Numpy的基本功能,然后详细说明了转换过程,包括导入库、打开图像文件、使用`np.array()`或`np.asarray()`函数进行转换,并通过打印数组形状验证转换结果。最后,通过裁剪、旋转和缩放等案例展示了转换后的应用,以及如何将Numpy数组转换回PIL图像。此外,还介绍了处理base64编码图像的完整流程。

在Python的图像处理领域,PIL(Python Imaging Library,现已更名为Pillow)和Numpy是两个不可或缺的库。PIL以其强大的图像处理功能著称,而Numpy则因其高效的数组运算能力受到广泛青睐。在实际应用中,我们经常会遇到需要将PIL图像转换为Numpy数组的情况,以便利用Numpy进行进一步的数学运算和向量化操作。本文将通过通俗易懂的方式,结合代码和案例,详细介绍如何将PIL图像转换为Numpy数组。站大爷代理IP工具的验证功能介绍.png

一、PIL与Numpy简介
PIL(Pillow)是Python中最常用的图像处理库之一,提供了丰富的图像处理功能,如图像的打开、保存、裁剪、旋转、缩放等。Numpy则是Python中用于科学计算的基础库,支持高维数组与矩阵运算,以及大量的数学函数库。

在图像处理和计算机视觉任务中,PIL和Numpy经常需要协同工作。PIL负责图像的读取、显示和保存,而Numpy则负责图像的数值计算和矩阵操作。因此,将PIL图像转换为Numpy数组成为了一个常见的需求。

二、PIL图像转换为Numpy数组的方法
将PIL图像转换为Numpy数组的过程相对简单,主要利用Numpy库中的array()函数或asarray()函数。以下是详细的步骤和代码示例。

  1. 导入所需库
    首先,我们需要导入PIL和Numpy库。在Python代码中,这通常通过以下方式实现:

from PIL import Image
import numpy as np

  1. 打开图像文件
    接下来,我们使用PIL库的Image.open()函数打开一张图像文件。这里假设我们有一张名为example.jpg的图像文件:

image = Image.open("example.jpg")

  1. 将PIL图像转换为Numpy数组
    现在,我们可以使用Numpy库的array()函数或asarray()函数将PIL图像转换为Numpy数组。这两个函数在大多数情况下是等价的,都可以将PIL图像对象转换为Numpy数组。以下是两种方法的代码示例:

使用np.array()函数

image_array = np.array(image)

使用np.asarray()函数

image_array = np.asarray(image)

转换完成后,image_array就是一个包含图像像素值的Numpy数组,我们可以对其进行各种操作,如裁剪、旋转、缩放等。

  1. 打印数组形状
    为了验证转换是否成功,我们可以打印出Numpy数组的形状。对于一张彩色图像,其形状通常是一个三维数组,分别表示图像的高度、宽度和颜色通道数(对于RGB图像,颜色通道数为3):

python
print("图像数组形状:", image_array.shape)
假设我们的example.jpg图像是一个300x400的RGB图像,那么打印出的形状应该是(300, 400, 3)。

三、案例:图像裁剪、旋转和缩放
为了更直观地展示PIL图像转换为Numpy数组后的应用,我们可以对转换后的Numpy数组进行裁剪、旋转和缩放等操作,并将结果转换回PIL图像进行显示或保存。

  1. 裁剪图像
    我们可以使用PIL图像的crop()方法对图像进行裁剪,然后将裁剪后的图像转换为Numpy数组:

裁剪图像(左上角和右下角坐标)

cropped_image = image.crop((50, 50, 250, 250))
cropped_image_array = np.array(cropped_image)
print("裁剪后的图像数组形状:", cropped_image_array.shape)

  1. 旋转图像
    我们可以使用PIL图像的rotate()方法对图像进行旋转,然后将旋转后的图像转换为Numpy数组:

旋转图像(角度为45度)

rotated_image = image.rotate(45)
rotated_image_array = np.array(rotated_image)
print("旋转后的图像数组形状:", rotated_image_array.shape)

需要注意的是,旋转后的图像尺寸可能会发生变化,因此旋转后的Numpy数组形状也可能与原始数组不同。

  1. 缩放图像
    我们可以使用PIL图像的resize()方法对图像进行缩放,然后将缩放后的图像转换为Numpy数组:

缩放图像(新尺寸为100x100)

resized_image = image.resize((100, 100))
resized_image_array = np.array(resized_image)
print("缩放后的图像数组形状:", resized_image_array.shape)

同样地,缩放后的图像尺寸会发生变化,因此缩放后的Numpy数组形状也与原始数组不同。

四、将Numpy数组转换回PIL图像
在某些情况下,我们可能需要将Numpy数组转换回PIL图像对象。这可以通过PIL库的Image.fromarray()函数实现。以下是代码示例:

将Numpy数组转换为PIL图像

new_image = Image.fromarray(image_array)

保存新图像

new_image.save("new_example.jpg")

这样,我们就可以将处理后的Numpy数组转换回PIL图像对象,并进行显示或保存操作。

五、案例:处理base64编码的图像
在实际应用中,我们有时会遇到从HTTP请求中接收到的base64编码的图像。我们需要先将其解码为二进制数据,然后保存为图像文件,最后才能使用PIL进行处理。以下是一个处理base64编码图像的完整流程:

import base64

假设我们有一个base64编码的图像字符串(这里用test_image_base64_encoded表示)

test_image_base64_encoded = "..."

解码base64图像

base64_decoded = base64.b64decode(test_image_base64_encoded)

将解码后的图像写入文件

with open("sample.jpg", "wb") as sample:
sample.write(base64_decoded)

打开图像文件并使用PIL进行处理

image = Image.open("sample.jpg")
image_array = np.array(image)

打印图像数组形状

print("图像数组形状:", image_array.shape)

通过上述流程,我们可以将base64编码的图像转换为Numpy数组,并进行后续处理。

六、总结
本文详细介绍了如何将PIL图像转换为Numpy数组,并通过案例展示了转换后的应用。在实际应用中,我们可以根据需要对Numpy数组进行各种操作,如裁剪、旋转、缩放等,并将结果转换回PIL图像进行显示或保存。这种转换对于图像处理和分析非常重要,因为它使我们能够更容易地对图像进行数学运算和分析。希望本文能够帮助读者更好地理解和应用图像与数组的转换技术。

目录
相关文章
|
1月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
245 0
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
365 10
|
Python
Numpy学习笔记(四):如何将数组升维、降维和去重
本文介绍了如何使用NumPy库对数组进行升维、降维和去重操作。
219 1
|
Python
使用 NumPy 进行数组操作的示例
使用 NumPy 进行数组操作的示例
196 2
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
625 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
408 4
|
机器学习/深度学习 并行计算 调度
CuPy:将 NumPy 数组调度到 GPU 上运行
CuPy:将 NumPy 数组调度到 GPU 上运行
500 1
|
API Python
Numpy 数组的一些集合操作
Numpy 数组的一些集合操作
162 0
|
1月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
101 0
|
3月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
294 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程

热门文章

最新文章