这篇文章主要用实例分析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认识的玩意 tpath2="dddd/"+"yy0" + str(100 * i + idx) + '.jpg' cv2.imwrite(tpath2, img1)

补充知识:pytorch的tensor,Image,numpy和opencv四种格式的相互转换

话不多说,先上代码

# -*- coding: utf-8 -*-# @Time : 2019/4/28 13:52# @Author : ljfimport torchfrom torchvision import transformsfrom PIL import Imageimport numpy as npimport 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 opencv2numpyarray2 = cv2.imread("./gray.jpg") # 这里使用opencv读取的是三通道,plt读取的是单通道。。暂时还没搞懂print(array2.shape)print(array2.dtype)# 4.1 opecv2Imageimage3 = 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)

看完上述内容,是不是对用实例分析pytorch读取图像数据如何转成opencv格式有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。