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 相关文章推荐
Windows下PyMongo下载及安装教程
Apr 27 Python
解析Python中的二进制位运算符
May 13 Python
python 对象和json互相转换方法
Mar 22 Python
通过Pandas读取大文件的实例
Jun 07 Python
在双python下设置python3为默认的方法
Oct 31 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
python常用数据重复项处理方法
Nov 22 Python
python 消费 kafka 数据教程
Dec 21 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
如何基于python实现不邻接植花
May 01 Python
Python使用eval函数执行动态标表达式过程详解
Oct 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与javascript的两种交互方式
2006/10/09 PHP
PHP中的正规表达式(一)
2006/10/09 PHP
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
php防止sql注入的方法详解
2017/02/20 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
vue实现购物车案例
2020/05/30 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
python快速查找算法应用实例
2014/09/26 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
numpy.array 操作使用简单总结
2019/11/08 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
Python pandas如何向excel添加数据
2020/05/22 Python
python 爬取小说并下载的示例
2020/12/07 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
理财投资建议书
2014/03/12 职场文书
初中生评语大全
2014/04/24 职场文书
免职证明样本
2014/10/23 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
检讨书模板
2015/01/29 职场文书
索赔员岗位职责
2015/02/15 职场文书
旗帜观后感
2015/06/08 职场文书
出生证明格式
2015/06/15 职场文书
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript