torchvision.transforms.ToTensor(ndarry/PIL)
注意: 这种转化方式会将数据归一化,不过cv2.imshow()显示图片时会自动将归一化的像素值乘以255,自己之前将经过ToTensor归一化的像素值直接乘以255再输入给imshow函数结果都是白色,原来imshow函数内部判断数据类型是float32会自己处理。
为什么pytorch中transforms.ToTorch要把(H,W,C)的矩阵转为(C,H,W)?
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函数详解