Python/Pytorch 显示图片

python如何显示图片是一个谜题,今天就让我们来揭秘它!
首先,python中一般采用plt.imshow()函数读取,今天我们主讲这个。

一、plt.imshow()函数参数:

通常直接采用 plt.imshow(img) 即可:
img图像数据,支持的数组形状是:
(M,N) : 带有标量数据的图像。数据可视化使用色彩图。
(M,N,3) :具有RGB值的图像(float或uint8)。
(M,N,4) :具有RGBA值的图像(float或uint8),即包括透明度。
前两个维度(M,N)定义了行和列图片,即图片的高和宽;
RGB(A)值应该在浮点数[0, …, 1]的范围内,或者整数[0, … ,255]。超出范围的值将被剪切为这些界限。

关键点:
(1)img必须是数组类型(不能是tensor或者dataframe)
(2)既可以是整数型[0, … ,255],也可以是浮点型[0, …, 1] 这俩显示的效果是一模一样的。
(3)必须是HWC类型的图像,通道必须在最后一维。(记住,只有卷积时通道的维度才是在前)

二、常见的一些操作/转换算法:

(1)tensor —> 数组转换:img=img.numpy()
(2)数组 —> tensor转换:img=torch.tensor(img)
(3)数组维度交换,例如将CHW交换为HWCimg = np.transpose(img, (1,2,0))
(4)tensor维度交换,例如将CHW交换为HWCimg.permute(1, 2, 0)
(5)数组行列交换(例如将第三行与第四行交换,有些图片格式是BGR而不是RGB,显示时需要先一步转换)img = img[:,:,[2,1,0]] 前面两个行和列不变,只变最后一个通道的顺序
(6)反归一化:有些时候处理的图是归一化的,如果想变为原来的像素,需要执行反归一化,只需令Mean = -Mean/Std,Std=1/Std,然后再次调用torchvision.transforms.Normalize函数,将反归一化后的平均值和标准差输入进去,即可实现。(当然,许多操作中直接进行了 img=(img+1)/2 操作,效果与反归一化一模一样, 这是由于dataset中往往会先Totensor,转换为0-1,再(0.5,0.5,0.5)的归一化为[-1,1] 因此上述操作等同于反归一化)
接上条,如果归一化时不是(0.5,0.5,0.5)这样简单的数怎么办呢?一方面还是通过上述公式手动计算,然后调用归一化函数。另一方面,如果步调用归一化函数,也可以采用如下代码:

```python
cifar_10_mean = (0.491, 0.482, 0.447) # mean for the three channels of cifar_10 images
cifar_10_std = (0.202, 0.199, 0.201) # std for the three channels of cifar_10 images
# convert mean and std to 3-dimensional tensors for future operations
mean = torch.tensor(cifar_10_mean).to(device).view(3, 1, 1)
std = torch.tensor(cifar_10_std).to(device).view(3, 1, 1)
#反归一化
img = ((img) * std + mean).clamp(0, 1) # to 0-1 scale

```
虽然这个img的维度是(batch, channel, height, weight)四维的,反归一化的维度是三维的的,不过tensor相乘时会自动转换为同样的size。
三、示例代码:
#从数据集中读取一张图片
img = dataset[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值