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中日期和时间格式化输出的方法小结
Mar 19 Python
Python的动态重新封装的教程
Apr 11 Python
Flask框架的学习指南之开发环境搭建
Nov 20 Python
Python中%r和%s的详解及区别
Mar 16 Python
Python下简易的单例模式详解
Apr 08 Python
Django REST framework 分页的实现代码
Jun 19 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Python任务自动化工具tox使用教程
Mar 17 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 Python
Python利用zhdate模块实现农历日期处理
Mar 31 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中的字符串函数
2006/11/24 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
php表单处理操作
2017/11/16 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Python Socket传输文件示例
2017/01/16 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
python自动化报告的输出用例详解
2018/05/30 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
秘书英文求职信
2014/04/16 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
安全生产标语大全
2014/10/06 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
创业计划书之甜品店
2019/09/18 职场文书
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL