PIL、OpenCV、numpy处理图像格式的相互转化方式

PIL、OpenCV、numpy处理图像格式的相互转化方式

  • [1、PIL 读取、显示、保存图片](#1、PIL 读取、显示、保存图片)
  • [2、OpenCV 读取、显示、保存图片](#2、OpenCV 读取、显示、保存图片)
    • [1、采用 matplotlib 显示以 OpenCV 读取的图片](#1、采用 matplotlib 显示以 OpenCV 读取的图片)
  • [3、numpy 和 Image 的相互转换](#3、numpy 和 Image 的相互转换)
    • [1、Image 转换成 numpy](#1、Image 转换成 numpy)
    • [2、numpy 转换成 Image](#2、numpy 转换成 Image)

1、PIL 读取、显示、保存图片

python 复制代码
from PIL import Image

# PIL 读取、显示、保存图片
path = "D:/Deeplearning/img/dog.jpg"
image = Image.open(path)  # PIL Image 类型
print(image.size)  # (650, 433), 即(W, H)

image.show()  # 显示图片
image.save('new_image.jpg')

2、OpenCV 读取、显示、保存图片

OpenCV读取图像后返回的是一个代表图像的NumPy数组,采用的格式是 H×W×C,通道顺序为BGR

python 复制代码
import cv2

path = "D:/Deeplearning/img/dog.jpg"
image = cv2.imread(path)  # 返回的是 numpy 数组
print(image.shape)  # (433, 650, 3), 即 (H, W, C)

cv2.imshow("Image", image)
cv2.waitKey(0)  # 暂停显示图片,数字0代表按键后 0 ms执行

cv2.imwrite("new_image.jpg", image)  # 保存图片

1、采用 matplotlib 显示以 OpenCV 读取的图片

使用matplotlib绘图时,可以读取tesnor和numpy数据类型,图片通道顺序为RGB,且尺寸为(H,W,C)。

python 复制代码
# 采用 matplotlib 显示以 OpenCV 方式读取的图片(numpy)
import matplotlib.pyplot as plt
# 在 jupyter 中需要加上下面一行代码
# %matplotlib inline

# OpenCV 的通道顺序为 BGR
# 用 matplotlib 绘图时,需将其转换成 RGB 才能正常显示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# image = image[:, :, ::-1]  # 这是另一种 BGR 转换成 RGB的方式

plt.imshow(image)  # 显示图片
plt.axis("off")  # 不显示坐标轴
plt.show()

3、numpy 和 Image 的相互转换

1、Image 转换成 numpy

使用np.array(image)和np.asarray(image)可以将 PIL Image 图像转换成 numpy 数组。

python 复制代码
path = "D:/Deeplearning/img/dog.jpg"
image = Image.open(path)  # PIL Image 类型

image_array = np.array(image)  # 深拷贝,通道顺序是 RGB, (H,W,C)
print(type(image_array))  # numpy.ndarray

plt.imshow(image_array)  # 正常显示图片
plt.axis("off")
plt.show()
python 复制代码
image_array2 = np.asarray(image) # 浅拷贝,通道顺序是 RGB,(H,W,C)
print(type(image_array))  # numpy.ndarray

2、numpy 转换成 Image

使用Image.fromarray(np.uint8(image))进行转换。

python 复制代码
path = "D:/Deeplearning/img/dog.jpg"
image = cv2.imread(path)  

image = image[:,:,::-1]  # OpenCV 的通道顺序为 BGR, 转换成RGB

image_pil = Image.fromarray(np.uint8(image))
print(type(image_pil))  # PIL.Image.Image

image_pil.show()  # 显示正常

使用Image.fromarray(image.astype('uint8')).convert('RGB')进行转换,效果相同。.png格式的图像是4通道的,加.convert('RGB')可以将其转变成3通道。

python 复制代码
image_pil2 = Image.fromarray(image.astype('uint8'))  # .convert('RGB')
print(type(image_pil2))  # PIL.Image.Image

使用torchvision.transforms.ToPIL()也可以实现 numpy 到 PIL Image 的转换。

python 复制代码
from torchvision import transforms
trans = transforms.ToPILImage()
image_pil3 = trans(image)  
相关推荐
Raink老师5 小时前
【AI面试临阵磨枪-79】实时数据 RAG:订单、商家、物流、天气、动态库存
人工智能·面试·职场和发展
脑极体5 小时前
点亮星河AI+鸿蒙,一座艺术场馆的日神觉醒
人工智能·华为·harmonyos
Cosolar5 小时前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
BUG指挥官5 小时前
Claude Code的自动化编程
人工智能
意图共鸣6 小时前
意图共鸣科技《认知智能白皮书》——感知与执行分离:认知架构(CA)如何重塑大模型底层结构
人工智能·架构
等一个人的@6 小时前
让数据自己开口:数睿通智库新增智能问数模块
人工智能·自然语言处理
ZGi.ai6 小时前
人工审查节点:让自动化工作流多一步人工把关
运维·人工智能·自动化·人机协同·智能体工作流·人工审查
王莎莎-MinerU6 小时前
MinerU 深度技术解析:从架构原理到生产部署的全面指南
css·人工智能·自然语言处理·架构·ocr·个人开发
盘古信息IMS6 小时前
盘古信息IMS V6 8.0重磅发布:以薪火AI数智平台点燃离散制造数智化引擎
大数据·人工智能·制造
weilaieqi16 小时前
从音响制造到AI家庭娱乐生态:不见不散AI智能K歌音响亮相第二十届深圳国际金融博览会
人工智能·制造·娱乐