参考链接:
https://mp.weixin.qq.com/s/yz8l54VusPWmF6dWkYL1VA
https://zhuanlan.zhihu.com/p/87441580
https://www.jb51.net/article/177575.htm
image = PIL.Image.fromarray(ndarray.astype(uint8))
ndarray = np.asarray(PIL.Image.open(path))
image = cv2.cvtColor(numpy.asarray(PIL.Image.open(path)),cv2.COLOR_RGB2BGR)
image = PIL.Image.fromarray(cv2.cvtColor((cv2.imread(path),cv2.COLOR_BGR2RGB))
ndarray = tensor.cpu().numpy()
tensor = torch.from_numpy(ndarray).float()
tensor = torch.from_numpy(ndarray.copy()).float() # If ndarray has negative stride.
# pytorch中的张量默认采用[N, C, H, W]的顺序,并且数据范围在[0,1],需要进行转置和规范化
# torch.Tensor -> PIL.Image
image = PIL.Image.fromarray(torch.clamp(tensor*255, min=0, max=255).byte().permute(1,2,0).cpu().numpy())
image = torchvision.transforms.functional.to_pil_image(tensor) # Equivalently way
# PIL.Image -> torch.Tensor
path = r'./figure.jpg'
tensor = torch.from_numpy(np.asarray(PIL.Image.open(path))).permute(2,0,1).float() / 255
tensor = torchvision.transforms.functional.to_tensor(PIL.Image.open(path)) # Equivalently way
tensor转list
a = torch.ones([1,5])
# tensor([[1., 1., 1., 1., 1.]])
b = a.tolist()
# [[1.0, 1.0, 1.0, 1.0, 1.0]]
list转tensor
a=list(range(1,6))
# [1, 2, 3, 4, 5]
b=torch.tensor(a)
# tensor([1, 2, 3, 4, 5])
tensor = torch.Tensor(3, 5)
# torch.long() 将tensor投射为long类型
newtensor = tensor.long()
# torch.half()将tensor投射为半精度浮点类型
newtensor = tensor.half()
# torch.int()将该tensor投射为int类型
newtensor = tensor.int()
# torch.double()将该tensor投射为double类型
newtensor = tensor.double()
# torch.float()将该tensor投射为float类型
newtensor = tensor.float()
# torch.char()将该tensor投射为char类型
newtensor = tensor.char()
# torch.byte()将该tensor投射为byte类型
newtensor = tensor.byte()
# torch.short()将该tensor投射为short类型
newtensor = tensor.short()
注意: 这种转化方式会将数据归一化,不过cv2.imshow()显示图片时会自动将归一化的像素值乘以255,自己之前将经过ToTensor归一化的像素值直接乘以255再输入给imshow函数结果都是白色,原来imshow函数内部判断数据类型是float32会自己处理。
https://www.zhihu.com/question/310094451
因为pytorch很多函数都是设计成假设你的输入是 (c,h,w)的格式,当然你如果不嫌麻烦的话可以每次要用这些函数的时候转成chw格式,但我想这会比你输入的时候就转成chw要麻烦很多至于为什么pytorch选择设计成chw而不是hwc(毕竟传统的读图片的函数opencv的cv2.imread或者sklearn的imread都是读成hwc的格式的)这点确实比较令初学者困惑。个人感觉是因为pytorch做矩阵加减乘除以及卷积等运算是需要调用cuda和cudnn的函数的,而这些接口都设成成chw格式了,故而pytorch为了方便起见也设计成chw格式了那新问题就来了,cuda和cudnn为什么设计成chw格式呢?我想这是由于涉及到图片操作的都是和卷积相关的,而内部做卷积运算的加速设计成chw在操作上会比hwc处理起来更容易,更快。题主如果想进一步了解可以google一下cudnn的卷积实现。
对于imshow函数,opencv的官方注释指出:根据图像的深度,imshow函数会自动对其显示灰度值进行缩放,规则如下:
1.如果图像数据类型是8U(8位无符号),则直接显示。
2.如果图像数据类型是16U(16位无符号)或32S(32位有符号整数),则imshow函数内部会自动将每个像素值除以256并显示,即将原图像素值的范围由[0255*256]映射到[0255]
3.如果图像数据类型是32F(32位浮点数)或64F(64位浮点数),则imshow函数内部会自动将每个像素值乘以255并显示,即将原图像素值的范围由[01]映射到[0255](注意:原图像素值必须要归一化)
Opencv中的imshow函数详解