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)