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

一、PIL,cv2读取数据图片以及之间的转换

cv2PIL
读取a=cv2.imread()a=Image.open()
读取类型数组类型PIL类型
读取尺寸排列(H,W,C)(W,H,C)
显示图片cv2.imshow(“a”, a)
cv2.waitKey (0)
a.show()
相互之间转换显示Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))a=numpy.array(a)#先转换为数组
a=cv2.cvtColor(a,cv2.COLOR_RGB2BGR) #转变颜色通道
转换为数组类型cv2读取的就是数组类型a = numpy.array(a)
#cv2显示图像
img_path="E:\expression_recognition\\1.jpg"
img_cv2 = cv2.imread(img_path)  # cv2读取的是数组类型  BGR  H W C
cv2.imshow("img_cv2", img_cv2)
cv2.waitKey (0)#PIL显示图像
img_path="E:\expression_recognition\\1.jpg"
img_PIL = Image.open(img_path)  # PIL读取的是PIL类型  RGB  W H C
img_PIL.show()#cv2转变为PIL进行图像显示
img_path="E:\expression_recognition\\1.jpg"
img_cv2 = cv2.imread(img_path)  # cv2读取的是数组类型  BGR  H W C
img_cv2_PIL = Image.fromarray(cv2.cvtColor(img_cv2,cv2.COLOR_BGR2RGB))
img_cv2_PIL.show()#PIL转变为cv2进行图像展示
img_path="E:\expression_recognition\\1.jpg"
img_PIL = Image.open(img_path)  # PIL读取的是PIL类型  RGB  W H C
img_PIL = numpy.array(img_PIL)#先转换为数组   H W C
img_PIL_cv2 = cv2.cvtColor(img_PIL,cv2.COLOR_RGB2BGR)
cv2.imshow("img_PIL_cv2",img_PIL_cv2)
cv2.waitKey (0)

二、PIL,数组类型以及tensor类型的转换

1、PIL转换为tensor类型(包含CPU和GPU)

主要有两种方式:

transforms.ToTensor()torch.from_numpy
能转换的格式PIL和数组格式只能转换数组格式
具体转换过程a = transforms.ToTensor()
a(img_PIL)
a(img_array)
torch.from_numpy(img_array)
# 1、PIL转换为tensor的CPU、GPU格式
img_path="E:\expression_recognition\\1.jpg"
img_tensor = transforms.ToTensor()img_PIL = Image.open(img_path)  # PIL读取的是PIL类型  RGB  W H C
img_PIL_tensor_CPU = img_tensor(img_PIL)
img_PIL_tensor_GPU = img_tensor(img_PIL).cuda()

2、数组转换为tensor类型(包含CPU和GPU)

# 1、数组转换为tensor的CPU、GPU格式
img_path="E:\expression_recognition\\1.jpg"
img_tensor = transforms.ToTensor()img_PIL = Image.open(img_path)  # PIL读取的是PIL类型  RGB  W H C
img_array = numpy.array(img_PIL)  # PIL转换为数组类型  H W C
img_array_tensor1_CPU = img_tensor(img_array)  # 将数组格式转换tensor格式
img_array_tensor1_GPU = img_tensor(img_array).cuda()img_array_tensor2_CPU = torch.from_numpy(img_array)
img_array_tensor2_GPU = torch.from_numpy(img_array).cuda()   

3、tensor类型转换为数组类型

注意在tensor类型转换为数组类型中,tensor类型只能是cpu tensor类型

img_cpu.numpy()   #cpu类型直接转换
img_gpu.cpu().numpy()   #gpu类型先转换为cpu类型然后再转换为数组类型

4、tensor、数组类型转换为PIL类型

tensor(可以是GPU也可以是CPU)转换为PIL格式数组转换为PIL格式
第一步img_array = numpy.uint8(img_array)img_tensor = img_tensor.float()
第二步a = transforms.ToPILImage()
img_PIL = a(img_array)
a = transforms.ToPILImage()
img_PIL = a(img_tensor)
img_path="E:\expression_recognition\\1.jpg"
img = Image.open(img_path)
img_array = numpy.array(img)
a1 = transforms.ToTensor()
img_tensor = a1(img)# 1、数组转换为PIL格式
a2 = transforms.ToPILImage()
img_array = numpy.uint8(img_array)  # 满足类型需求
img_PIL = a2(img_array)# 2、tensor转换为PIL格式
img_tensor = img_tensor.float()  # 满足类型需求
img_PIL = a2(img_tensor)

三、CPU tensor类型与GPU tensor类型的转换

img_gpu = cpu_img_tensor.cuda() #cpu转换为gpu
img_cpu = gpu_img_tensor.cpu()  #gpu转换为cpu

四、总结

CPU tensorGPU tensorPILarray
CPU tensor
(cpu_img_tensor)
cpu_img_tensor.cuda()a = transforms.ToPILImage()
img_tensor = img_tensor.float()
img_PIL = a(img_tensor)
cpu_img_tensor.numpy()
GPU tensor (gpu_img_tensor)gpu_img_tensor.cpu()同cpu tensor的转换方式gpu_img_tensor.cpu().numpy()
PIL (img_PIL)a = transforms.ToTensor() a(img_PIL)a = transforms.ToTensor() a(img_PIL).cuda()numpy.array(img_PIL)
array
(img_array)
a = transforms.ToTensor()
a(img_array)

torch.from_numpy(img_array)
a = transforms.ToTensor()
a(img_array).cuda()

torch.from_numpy(img_array).cuda()
a = transforms.ToPILImage()
img_array=numpy.uint8(img_array)
img_PIL = a2(img_array)

tips:注意PIL与cv2转换要变换颜色通道。

参考:https://blog.csdn.net/hjkdh/article/details/123097434

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(5)》(21)

《Linux操作系统原理分析之linux存储管理(5)》(21) 6 Linux存储管理6.6 Linux 物理空间管理6.6.1 Linux 物理内存空间6.6.2 物理页面的管理6.6.3 空闲页面管理——buddy 算法 6.7 内存的分配与释放6.7.1 物理内存分配的数据结构 6…

canvas绘制小丑

说明&#xff1a; 借鉴博主基于canvas绘制一个爱心(10行代码就够了) - 掘金 (juejin.cn) 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

实现简单的Http服务器+SpringMvc,集成到Spring

实现简单的Http服务器SpringMvc&#xff0c;集成到Spring 1、Http协议 1.1、HTTP 协议请求格式 方法 空格 URL 空格 版本 回车符 换行符头部域名称&#xff1a;头部域值 回车符 换行符...头部域名称&#xff1a;头部域值 回车符 …

《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-03-嵌入式

文章目录 1. 基本概念2. 嵌入式系统的组成3. 嵌入式系统的特点4. 嵌入式系统分类4.1 分类4.2 实时系统(Real-Time System,RTS)4.3 安全攸关系统 (Safety-Critical System)7. 嵌入式软件7.1. 嵌入式系统软件组成架构7.1.1 硬件层7.1.2 抽象层7.1.3 操作系统层7.1.4 中间件层7.1…

【云备份】服务端热点管理业务处理模块

28. 服务端热点管理模块实现-热点管理实现思路 服务器端的热点文件管理是对上传的非热点文件进行压缩存储&#xff0c;节省磁盘空间。 而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内&#xff0c;比如如果一个文件一天都没有被访问过我们就认为这是…

【UGUI】sprite精灵的创建与编辑

如何切图&#xff08;sprite editor&#xff09; 有时候一张图可能包含了很多张子图&#xff0c;就需要在Unity 临时处理一下&#xff0c;切开&#xff0c;比如动画序列帧图集 虽然我们可以在PS里面逐个切成一样的尺寸导出多张&#xff0c;再放回Unity&#xff0c;但是不需要这…

音视频技术开发周刊 | 322

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 超级AI不会主宰人类&#xff0c;但人工智能必须开源&#xff01;LeCun最新采访引全网300万人围观 LeCun最新访谈视频中&#xff0c;再次坦露了自己对开源AI的看法。超级AI…

安路Anlogic FPGA下载器的驱动安装教程

安路FPGA下载器驱动安装教程 安路FPGA下载器&#xff1a;EN-ALC10,是一款高性能FPGA下载线&#xff08;编程器&#xff09;&#xff0c;支持安路的开发软件TDS和全系列FPGA芯片下载编程&#xff0c;支持全速USB2.0与电脑进行数据通信&#xff0c;通过JTAG协议与FPGA进行程序下…

鸿蒙开发:UIAbility组件间交互探索实战【鸿蒙专栏-22】

UIAbility组件间交互(设备内) 在设备内,UIAbility(用户界面能力)是系统调度的最小单元,它们负责展示用户界面和执行相关的业务逻辑。设备内的不同功能模块之间的交互是应用程序开发中的重要部分。本文将探讨设备内UIAbility之间的交互方式,包括启动应用内的UIAbility、…

LeetCode330. Patching Array

文章目录 一、题目二、题解 一、题目 Given a sorted integer array nums and an integer n, add/patch elements to the array such that any number in the range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of…

Redux

一、纯函数 1、react 中的纯函数 react 中组件就被要求像是一个纯函数&#xff08;因为还有类组件&#xff09;redux 中有一个reducer 的概念&#xff0c;也是要求必须是一个纯函数 2、 纯函数的条件 确定的输入一定会产生确定的输出函数在执行过程中&#xff0c;不能产生副…

vue自定义指令:指定文字高亮

vue自定义指令&#xff1a;指定文字高亮 自定义指令 除了核心功能默认内置的指令 (v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令。注意&#xff0c;在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对…

【重点】【区间问题】56.合并区间

题目 注意有个类似的题目&#xff1a;&#xff0c;注意区分。 class Solution {public int[][] merge(int[][] intervals) {List<List<Integer>> res new ArrayList<>();Arrays.sort(intervals, (a1, a2) -> {return a1[0] - a2[0];});int left Intege…

JS实现成才网注册系统(网页数据验证)

主代码 <!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Conten…

Hadoop进阶学习---HDFS分布式文件存储系统

1.hdfs分布式文件存储的特点 分布式存储:一次写入,多次读取 HDFS文件系统可存储超大文件,时效性较差. HDFS基友硬件故障检测和自动快速恢复功能. HDFS为数据存储提供很强的扩展能力. HDFS存储一般为一次写入,多次读取,只支持追加写入,不支持随机修改. HDFS可以在普通廉价的机器…

Linux: 文档 :相关接口文档手册还是需要仔细阅读

接口文档的阅读&#xff0c;一定要仔细。最近遇到一个问题&#xff0c;明明文档里有说&#xff0c;read函数读取到的是一个或者多个events&#xff0c;但是代码里依然按照一个来处理。就会导致漏event的可能。漏了event&#xff0c;后续的逻辑就会受影响。 Each successful rea…

llama.cpp部署(windows)

一、下载源码和模型 下载源码和模型 # 下载源码 git clone https://github.com/ggerganov/llama.cpp.git# 下载llama-7b模型 git clone https://www.modelscope.cn/skyline2006/llama-7b.git查看cmake版本&#xff1a; D:\pyworkspace\llama_cpp\llama.cpp\build>cmake --…

Leetcode1038. 从二叉搜索树到更大和树(每日一题)

目录 ⚽题目&#xff1a; &#x1f3d0;题目分析&#xff1a; &#x1f3c0;题目解答&#xff1a; &#x1f94e;代码如下&#xff1a; ⚽题目&#xff1a; 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值…

Stream 流

配合Lambda表达式&#xff0c;简化集合和数组的操作 获取Stream流对象 集合 Collection接口中的方法&#xff1a;stream() 单列&#xff1a;直接调用stream() 多列&#xff1a;间接获取&#xff0c;map.entrySet() ArrayList<String> list new ArrayList<>();…

SSM项目实战-前端-在Index.vue中展示第一页数据

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/schedule.js import request from "../util/request.js";export let getSchedu…