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 相关文章推荐
python实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
Python的gevent框架的入门教程
Apr 29 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
Python3内置模块random随机方法小结
Jul 13 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 Python
python多线程案例之多任务copy文件完整实例
Oct 29 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
Python装饰器结合递归原理解析
Jul 02 Python
Python图片处理之图片裁剪教程
May 27 Python
Python Matplotlib库实现画局部图
Nov 17 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中将数组转成XML格式的实现代码
2011/08/08 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
子页向父页传值示例
2013/11/27 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
JavaScript模拟push
2016/03/06 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
python yield关键词案例测试
2019/10/15 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
python调用私有属性的方法总结
2020/07/24 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
应届毕业生简历自我评价
2014/01/31 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
python基础之while循环语句的使用
2021/04/20 Python
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL