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定时检查启动某个exe程序适合检测exe是否挂了
Jan 21 Python
深入理解python中的浅拷贝和深拷贝
May 30 Python
用python实现对比两张图片的不同
Feb 05 Python
python 保存float类型的小数的位数方法
Oct 17 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
Python中psutil的介绍与用法
May 02 Python
Django ORM 查询管理器源码解析
Aug 05 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
Python单链表原理与实现方法详解
Feb 22 Python
django 装饰器 检测登录状态操作
Jul 02 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 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源码之 ext/mysql扩展部分
2009/07/17 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
python如何将图片转换为字符图片
2020/08/19 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
Python图片的横坐标汉字实例
2019/12/04 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
电大自我鉴定范文
2013/10/01 职场文书
教师实习的自我鉴定
2013/10/26 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
安全环保演讲稿
2014/08/28 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers