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图像进行显示或保存。这种转换对于图像处理和分析非常重要,因为它使我们能够更容易地对图像进行数学运算和分析。希望本文能够帮助读者更好地理解和应用图像与数组的转换技术。

目录
相关文章
|
2天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
|
9天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
11天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
8875 20
|
15天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
4769 12
资料合集|Flink Forward Asia 2024 上海站
|
15天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
23天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
11天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
10天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
877 58

热门文章

最新文章