图片的读取通常有两种格式,一种是PIL,一种是opencv。两种读取方式存在一些区别

  1. 图片格式不同,Image读入的是“RGB”,Opencv读入的是“BGR”
  2. 读入图片的尺寸不同,Image读入的是 w h,Opencv读入的是h w c。其中w是宽,h是高,c是通道数。
  3. Image读入是Image类无法直接显示其像素点的值(可以转换成numpy显示),Opencv读入的直接是numpy的格式。可以直接显示其像素值。

PIL和opencv读取图片

import os.path
from PIL import Image
import cv2
import numpy as np
import matplotlib.pyplot as plt
import torchvision.transforms as transforms##Image 读取图片
image = Image.open("1.jpg").convert("RGB")
##opencv 读取图片
image2 = cv2.imread("1.jpg")
print("Image read",image.size)  # w h
print("Opencv read",image2.shape)  # h w c

PIL 读取的图片是PIL格式,需要转换为numpy或者tensor格式进行数据处理。opencv读取的图片直接就是numpy格式。

PIL与tensor的相互转换

可以利用torchvision中的transforms类中ToTensor()和ToPILImage()两个函数将PIL的格式和tensor格式互相转换。注意,转换后的像素点发生的变化..。

这里opencv像素点范围是0-255,tensor像素点范围是0-1

import os.path
from PIL import Image
import cv2
import numpy as np
import matplotlib.pyplot as plt
import torchvision.transforms as transformsimage = Image.open("1.jpg").convert("RGB")
image2 = cv2.imread("1.jpg")
image_tensor = transforms.ToTensor()(image)
image_recover = transforms.ToPILImage()(image_tensor)
image_tensor_add = image_tensor.unsqueeze(0)  ##增加一维
print("Image read",image.size)  # w h
print("Opencv read",image2.shape)  # h w c
print("tensor",image_tensor.size()) #c h w
print("tensor recover to Image",image_recover.size)
print("tensor add ",image_tensor_add.size())

numpy 和 tensor 相互转换

注意:numpy格式的图片是numpy.uint8,tensor格式的图片的数据类型是torch.float32。

import os.path
from PIL import Image
import cv2
import numpy as np
import matplotlib.pyplot as plt
import torchvision.transforms as transforms#方法一:直接转换
image_tensor_from_numpy = transforms.ToTensor()(image)
print("image_tensor_from_numpy: ",image_tensor_from_numpy.shape)
#方法二
image_tensor_from_numpy2 = cv2.cvtColor(image,cv2.COLOR_BGR2RGB) #先将 BGR 变为 RGB
image_tensor_from_numpy2 = torch.from_numpy(image_tensor_from_numpy2.transpose((2, 0, 1)))
# 将 (h,w,c)转换为 (c,h,w)
image_tensor_from_numpy2 = image_tensor_from_numpy2.float().div(255) #归一化到[0,1]
print("image_tensor_from_numpy2 :",image_tensor_from_numpy2.size())
image_numpy_form_Image = np.array(image)
image_numpy_form_Image = cv2.cvtColor(image_numpy_form_Image,cv2.COLOR_RGB2BGR)
print("image_numpy_form_Image ",image_numpy_form_Image.shape)

注意:PIL和opencv读取的图片格式不同,因此通常进行格式转换

参考文献:

pytorch中图片类型的转换——PIL、tensor、numpy_长歌丶采薇的博客-CSDN博客_pil转numpy

Pytorch中Tensor与各种图像格式(PIL 和 Numpy)的相互转化_Phoenixtree_DongZhao的博客-CSDN博客_pil 转化为numpy

numpy PIL tensor之间的相互转换相关推荐

  1. [开发技巧]·TensorFlow中numpy与tensor数据相互转化(支持tf1.x-tf2.x)

    推荐对比阅读: [开发技巧]·PyTorch中Numpy,Tensor与Variable深入理解与转换技巧 『带你学AI』带你学AI与TensorFlow2实战之入门初探:如何速成深度学习开发 鉴于t ...

  2. c# image转换为bitmap_Python PIL.Image与numpy.array之间的相互转换

    前言 有时我们使用PIL库读入图像数据后需要查看图像数据的维度,比如shape,或者有时我们需要对图像数据进行numpy类型的处理,所以涉及到相互转化,这里简单记录一下. 方法 当使用PIL.Imag ...

  3. PyTorch | Tensor、Numpy、Variable之间的转换

    其中,Numpy和Variable之间的转换可以通过tensor推导出来. Numpy->Variable:拆分为两步, Numpy->Tensor: torch.from_numpy(t ...

  4. 一文看懂所有图像与numpy矩阵(三维、四维均包含)之间的相互转换

    图像与numpy矩阵之间的相互转换: 1.RGB–>灰度图: from PIL import Image # 加载RGB图片 I = Image.open('/home/timg.jpg') I ...

  5. PIL,cv2读取类型及转换,以及PIL,numpy,tensor格式以及cuda,cpu的格式转换

    PIL,cv2读取类型,以及PIL,numpy,tensor格式以及cuda,cpu的格式转换 一.PIL,cv2读取数据图片以及之间的转换 二.PIL,数组类型以及tensor类型的转换 1.PIL ...

  6. list,numpy,tensor之间相互转换的方法

    list,numpy,tensor之间相互转换的方法: a=[[1,2],[3,4]]#list print(a) b=np.array(a)#list->numpy print(b) c=to ...

  7. 2021-07-26 TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the

    can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first. 意思是:如果 ...

  8. DLPack构建跨框架深度学习编译器-实现张量之间的相互转换【pytorch】

    文章目录 1 概述 2 pytorch使用torch.utils.dlpack实现DLPack与张量之间的相互转换 2.1 将DLPack解码为张量. 2.2 将张量转换为DLPack 3 在 PyT ...

  9. PInvoke复习之深入理解char*与wchar_t*与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下 #ifndef USE_H_ #define USE_H_ #i ...

最新文章

  1. 对抗性分割损失素描着色
  2. 自然语言处理中的N-Gram模型
  3. 开发安全的 API 所需要核对的清单
  4. 皮一皮:泡沫面膜,直男慎送此礼物...
  5. .net httpwebrequest 并发慢_go语言并发之MPG模型
  6. ibm招mysql_IBM-ETP实训之MySql基本命令总结
  7. PostgreSQL的postmaser的fork的学习体会
  8. 微信联系人一键导出的方法在这里
  9. Excel数据透视表经典教程九《数据透视表计算》
  10. matlab gui 分辨率,MATLAB GUI控件大小和字体适应界面和电脑分辨率
  11. 使程序在后台运行,后台进程实现原理
  12. PyCharm小技巧分享—主菜单消失再显示
  13. 奥拉星插件flash下载手机版下载安装_flash控件手机版
  14. ps在线版 Photoshop在线精简版-toolfk程序员在线工具网
  15. 计算机符号的名字,空格符号怎么打 游戏名字空格怎么打
  16. 在聊天群中,如何快速获取信息,了解群中讨论的话题。
  17. 打印1000-2000年的闰年
  18. 带你揭秘华为5G为何地表最强
  19. wifi 配网方式总结
  20. 对话哈希未来贾英昊:资产上链的第一性原理 |链捕手

热门文章

  1. 程序员初入职场第一年—— 程序员羊皮卷 连载 13
  2. 计算机专业前端实习生的实习经历
  3. 【GPLT 三阶题目集】L3-013 非常弹的球
  4. mongodb journal
  5. sqlserver 查询语句时,显示列名无效
  6. 磊科路由虚拟服务器设置,磊科路由器虚拟转发服务如何设置
  7. Linux下常用软件推荐列表
  8. 腾讯云4核8g10M服务器多少人同时在线?
  9. cpolar内网穿透外网远程访问本地网站
  10. 【总结】Throwable/Error/Exception/RuntimeException区别