OpenCV/CV2,PIL,Tensor之间如何互相转化

  参考资料:

  torchvision文档

  众所周知OpenCV/CV2和PIL是Python领域最常使用的图像处理库,而Pytorch Tensor则是我们在深度学习领域接触最多的张量数据结构,知道这几种格式之间的相互转化方式是非常有必要的。三类,一共6种相互转化的链路,下面一一道来:

  1. OpenCV/CV2(ndarray)

  cv2不像PIL Image那样有特定的图像存储类,因此cv2格式其实是一个伪命题。使用cv2读取图片,实际上获得的是一个ndarray。ndarray更是我们的老熟人,它是numpy包中的张量数据类型。

  ndarray to tensor:

复制代码
image_nd = cv2.imread("XX.jpg")
A = ( torch.tensor(image_nd) / 255. ).flip(-1)

  上面是一个典型的代码片,需要注意cv2读到的ndarray是uint8类型,并且默认通道顺序是BGR,因此需要先除以255然后反转最后一个维度(Pytorch不支持::-1这种切片逆转语法)。

  ndarray to pil

复制代码
image_nd = cv2.imread("/data1/chaishang.cs/Tryon/31_human.jpg")
image_pil = Image.fromarray(image_nd[..., ::-1])

  只需使用Image.fromarray方法,需要注意pil图片的通道顺序是RGB,因此也需要先对通道进行反转。

**  2. PIL image**

**  pil to tensor**

复制代码
import torchvision.transforms.functional as F
F.pil_to_tensor(image_pil) / 255.

  pil to ndarray

复制代码
image_nd = np.array(image_pil)

  3. Tensor

**  tensor to ndarray**

直接对tensor调用.numpy()函数即可,如果tensor位于cuda上,需要先运行.cpu()

  tensor to pil

复制代码
import torchvision.transforms.functional as F
F.to_pil_image(tensor)

  需要注意tensor需要是C, H, W的格式,并且归一化到0, 1区间。

相关推荐
m4Rk_15 小时前
【论文阅读】Agent 记忆机制(77):TSM——让记忆回到事件真正发生的时间
论文阅读·人工智能·学习·开源·github
陈天伟教授15 小时前
技能人才评价考评员(高级考评员)备考要点-模块一技能人才评价制度体系与政策法规
人工智能·具身智能
陈年老古董15 小时前
MediaPipe 姿态检测与脸部关键点检测
笔记·python·opencv·学习·dlib
ksueh15 小时前
2026网文有声化新规落地:AI配音的边界划在了哪里
人工智能·ai写作·ai工具·ai写小说
旺仔小馒头wang15 小时前
AI 智能手机发布会:赋予人类的五种新能力
人工智能·学习·音视频
人工智能培训15 小时前
未来三年,AI 落地的五个确定性判断
大数据·人工智能·学习·生活·ai写作
围炉聊科技15 小时前
TencentDB Agent Memory 架构梳理:读源码看清 Codex 接记忆的硬冲突
人工智能
LONGZETECH15 小时前
一线职教实测:风光 580 汽车故障诊断仿真系统,破解实车实训四大核心痛点
人工智能·学习·安全·架构·汽车
Java_AI工程师15 小时前
90%的人写Function Calling,只写了"把参数传给工具执行"这一步,剩下的参数校验、错误重试、超时控制、结果格式化,全是空白。
java·人工智能·程序员
黄啊码15 小时前
【黄啊码】Jev 的出现,Agent 进化速度突然实现日行千里
人工智能