pytorch读取图像数据转成opencv格式实例
作者:若曦爹 发布时间:2021-01-31 03:12:22
标签:pytorch,数据,opencv
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
欢迎大家留言批评指正
来源:https://blog.csdn.net/gbz3300255/article/details/105807220


猜你喜欢
- 指定变量类型有时您可能需要为变量指定类型,这可以通过 casting 来完成,Python 是一门面向对象的语言,因此它使用类来定义数据类型
- 本文实例讲述了PHP闭包定义与使用。分享给大家供大家参考,具体如下:<?phpfunction getClosure($i){ &nb
- PDOStatement::executePDOStatement::execute — 执行一条预处理语句(PHP 5 >= 5.1
- 之前版本的代理中,可以使用fiddler进行HTTP包的代理,但是代理HTTPS包时,执行错误 self._sslobj.do_
- 在开发国际化网站的时候,难免会与时区打交道,通用CMS更是如此,毕竟其 * 户可能是来自于全球各地的。Django在时区这个问题上下了不少功
- 一、mysql主(称master)从(称slave)复制的原理: (1).mas
- 本文实例讲述了Python实现随机创建电话号码的方法。分享给大家供大家参考,具体如下:当需要随机的生成一些电话号码的时候,可以使用以下脚本,
- 使用TensorFlow的一个优势是,它可以维护操作状态和基于反向传播自动地更新模型变量。 TensorFlow通过计算图来更新变量和最小化
- 通过视图来访问数据,其优点是非常明显的。如可以起到数据保密、保证数据的逻辑独立性、简化查询操作等等。但是,话说回来,SQL Server数据
- 中间件中间件是放在客户端和服务端的中间。 当你的客户端对某个接口发起一个请求,但是在到达接口2之前,这里是有一层中间件的处理。一般
- 方法一:def dict_to_numpy_method1(dict): dict_sorted=sorted(dict.iteritems
- 当在函数中定义默认值时,值初始化只会进行一次,就是执行到def methodname时执行。看下面代码:from datetime impo
- 本次爬取网站为opgg,网址为:” http://www.op.gg/champion/statistics”由网站界面可以看出,右侧有英雄
- 说明:通过随机产生密码,然后将密码EMail给注册用户,你可以确认用户的EMail填写是否正确。自动产生的密码往往安全性更高,同时,你可以过
- 要求:#出租车计费*************************************************************
- 这是一份来自网络的代码,经过了我的修改和验证。 首先我的运行环境是Python3.7,需要安装PyUserInput库。直接上代码
- Static(静态)关键字用来定义静态方法和属性,static 也可用于定义静态变量以及后期静态绑定。1、静态变量 static varia
- 本文实例为大家分享了python Tkinter版学生管理的具体代码,供大家参考,具体内容如下Tkinter是python自带的UI包,无需
- 投资有风险,选择需谨慎。 股票交易数据分析可直观股市走向,对于如何把握股票行情,快速解读股票交易数据有不可替代的作用!1 数据预处
- 问题:MySQL 5.0不能使用自动增加字段。具体原因:引起的原因是在MySQL5.0.2版本中的The Server SQL Mode 中