pytorch读取图像数据转成opencv格式实例


Posted in Python onJune 02, 2020

pytorch读取图像数据转成opencv格式方法:先转成numpy通用的格式,再将其转换成opencv格式。

pytorch读取的数据使用loaddata这类函数实现。pytorch网络输入图像的格式为(C, H, W),就是(通道数,高,宽)而numpy中图像的格式为(H,W,C)。

那就将其通道调换一下。用到函数transpose。

转换方法如下

例如A 的格式为(c,h,w) 那么经过

A = A.transpose(1,2,0)

后就变成了(h,w,c)了

然后用语句

B= cv2.cvtColor(A,cv2.COLOR_RGB2BGR)

结果就变成opencv可用的图像了。 如果不做transpose转换,那么得到的图像是一个1*h大小的图.......

完整代码:

变换部分:

一般的pytorch会进行裁剪 放缩 归一化等操作。例如

transforms = Compose([
      ToTensor(),//将数据除以255加载进来
      Resize(768),//裁剪768*768大小的图像
      ConvertMaskID(Cityscapes.classes),//与这个事无关不用去管它
      Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])// 归一化 利用均值方差归一化
    ])

那么被处理的数据就要反归一化回来呗

代码如下:三通道的数据

image_idx = x[idx].cuda().data.cpu().float().numpy() #经过上面处理的数据 在gpu上给取出来放在cpu上。是个numpy类型
      image_idx[0] = image_idx[0] * std[0] + mean[0]#三个通道分别进行反归一化...按公式来的
      image_idx[1] = image_idx[1] * std[1] + mean[1]
      image_idx[2] = image_idx[2] * std[2] + mean[2]
      
      image_idx[0][image_idx[0] > 1] = 1#对最大值最小值做次保护
      image_idx[0][image_idx[0] < 0] = 0
      
      image_idx[1][image_idx[1] > 1] = 1
      image_idx[1][image_idx[1] < 0] = 0
      
      image_idx[2][image_idx[2] > 1] = 1
      image_idx[2][image_idx[2] < 0] = 0
      
      image_idx = image_idx.transpose(1,2,0)

      img1 = cv2.cvtColor(image_idx * 255,cv2.COLOR_RGB2BGR)#转成opencv认识的玩意
      tpath1="dddd/"+"yy0" + str(100 * i + idx) + '.jpg'
      cv2.imwrite(tpath1, img1)

补充知识:pytorch的tensor,Image,numpy和opencv四种格式的相互转换

话不多说,先上代码

# -*- coding: utf-8 -*-
# @Time  : 2019/4/28 13:52
# @Author : ljf
import torch
from torchvision import transforms
from PIL import Image
import numpy as np
import cv2

# 1.1 tensor2Image Image格式进行绘图,展示
tensor1 = torch.randint(0,255,(300,300))
transform1 = transforms.ToPILImage(mode="L")
image1 = transform1(np.uint8(tensor1.numpy())) # Image接受的图像格式必须为uint8,否则就会报错
print(tensor1.size())
print(image1)
# image.show()
image1.save("gray.jpg")

# 1.2 Image2tensor tensor格式方便使用torch进行数据增强,也是模型训练的格式
# 先剪切,再转为tensor。底层也是PIL实现的
transform2 = transforms.Compose([transforms.RandomCrop([200,200],padding=10),transforms.ToTensor()])
image2 = Image.open("gray.jpg")
tensor2 = transform2(image2)
print(tensor2.size())

# 2.1 tensor2numpy 再1.1中也用到了,numpy格式主要用于容易转换数据格式,也有利于转为opencv格式。
array1 = tensor1.numpy()
print(array1.shape)
print(array1.dtype)

# 2.2 numpy2tensor 1.2有介绍,不再赘述
tensor3 = torch.Tensor(array1)
tensor4 = transforms.ToTensor()(array1)
print(tensor3.size())
print(tensor4.size()) # 会增加一个维度

# 3.1 numpy2opencv openc格式方便画目标框,图片上面写字(Image格式也可以实现,不是很熟悉,,,)
# opencv 读取出来就是numpy的数据格式
cv2.imshow("img",np.uint8(array1))
# cv2.waitKey()
# cv2.destroyAllWindows()

# 3.2 opencv2numpy
array2 = cv2.imread("./gray.jpg") # 这里使用opencv读取的是三通道,plt读取的是单通道。。暂时还没搞懂
print(array2.shape)
print(array2.dtype)

# 4.1 opecv2Image
image3 = Image.fromarray(array2,mode="RGB")
# image3.show()

# 4.2 Image2opencv
# 这里有两种方式,一种稍复杂点,但是可以保存数据形状
array3 = transforms.ToTensor()(image3).numpy()

# Image自带的属性,但是会打乱数据为一维
list1 = list(image3.getdata())
print(array3.shape)
print(list1)

上面的四种格式转换时在做一个“图像分类”的项目经常用到的,比如保存图片,图片上面加中文等等。因为这些代码不是很常用,不熟练,所以每次都要在网上找下。这个博文也方便我来查找,大家有需要的也可以进行保存。

后续更新解决opecv,matplotlib显示中文问题,以及分类模型中加入评价指标confusion matrix

欢迎大家留言批评指正

以上这篇pytorch读取图像数据转成opencv格式实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django中间件工作流程及写法实例代码
Feb 06 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
实时获取Python的print输出流方法
Jan 07 Python
Python中字符串List按照长度排序
Jul 01 Python
python json 递归打印所有json子节点信息的例子
Feb 27 Python
python关于变量名的基础知识点
Mar 03 Python
django 数据库返回queryset实现封装为字典
May 19 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
Python经典五人分鱼实例讲解
Jan 04 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
用Python制作音乐海报
Jan 26 Python
django注册用邮箱发送验证码的实现
Apr 18 Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 #Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 #Python
Pandas读取csv时如何设置列名
Jun 02 #Python
python os模块常用的29种方法使用详解
Jun 02 #Python
完美解决pycharm 不显示代码提示问题
Jun 02 #Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 #Python
基于python实现查询ip地址来源
Jun 02 #Python
You might like
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
基于jquery实现多级菜单效果
2017/07/25 jQuery
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
在Python程序中操作MySQL的基本方法
2015/07/29 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
python实现windows下文件备份脚本
2018/05/27 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
在python中bool函数的取值方法
2018/11/01 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
毕业生怎样写好自荐信
2013/11/11 职场文书
员工薪酬福利制度
2014/01/17 职场文书
九年级化学教学反思
2014/01/28 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
施工单位安全责任书
2014/07/24 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
Python OpenGL基本配置方式
2022/05/20 Python
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS