pytorch读取图像数据转成opencv格式实例

作者:若曦爹 时间:2021-01-31 03:12:22 

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

标签:pytorch,数据,opencv
0
投稿

猜你喜欢

  • Flask模板引擎之Jinja2语法介绍

    2021-11-15 21:08:11
  • pytorch加载预训练模型与自己模型不匹配的解决方案

    2023-06-17 14:22:24
  • django rest framework 数据的查找、过滤、排序的示例

    2023-07-18 16:33:39
  • python递归&迭代方法实现链表反转

    2021-05-04 20:42:04
  • 使用Python项目生成所有依赖包的清单方式

    2022-02-18 19:14:49
  • mysql提示Changed limits: max_open_files: 2048 max_connections: 1910 table_cache: 64的解决

    2024-01-23 11:01:32
  • python通过pillow识别动态验证码的示例代码

    2023-08-27 02:29:21
  • WSC脚本部件技术:利用Javascript编写ActiveX控件

    2008-05-05 13:13:00
  • python将.ppm格式图片转换成.jpg格式文件的方法

    2023-02-16 19:19:54
  • Centos7安装 mysql5.6.29 shell脚本

    2024-01-15 22:17:41
  • 960 Grid System 基本原理及使用方法

    2009-02-28 13:35:00
  • 微信小程序技巧之show内容展示,上传文件编码问题

    2023-09-23 07:25:30
  • Python 异步之推导式示例详解

    2021-05-16 17:31:08
  • python实现简单银行管理系统

    2021-01-24 17:59:28
  • Python redis模块的使用教程指南

    2021-03-22 12:08:02
  • 详解Python验证码识别

    2023-11-12 23:46:40
  • Golang 单元测试和基准测试实例详解

    2024-05-05 09:27:58
  • python pdb调试方法分享

    2022-02-15 22:39:22
  • python实现单机五子棋对战游戏

    2022-01-11 04:38:10
  • python在windows下创建隐藏窗口子进程的方法

    2021-05-19 14:44:51
  • asp之家 网络编程 m.aspxhome.com