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 相关文章推荐
c++生成dll使用python调用dll的方法
Jan 20 Python
使用Python下的XSLT API进行web开发的简单教程
Apr 15 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
对python添加模块路径的三种方法总结
Oct 16 Python
django 自定义过滤器的实现
Feb 26 Python
Python发展简史 Python来历
May 14 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
基于Python3.7.1无法导入Numpy的解决方式
Mar 09 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
python基于turtle绘制几何图形
Jun 15 Python
Python制作一个随机抽奖小工具的实现
Jul 07 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
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
使用Web Uploader实现多文件上传
2016/06/08 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
python动态性强类型用法实例
2015/05/09 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
Python实现微信机器人的方法
2019/09/06 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
一些.net面试题
2014/10/06 面试题
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
客服文员岗位职责
2013/11/29 职场文书
汽车维修专业个人求职信范文
2014/01/01 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python
学会Python数据可视化必须尝试这7个库
2021/06/16 Python