CV2,Image,PIL图片读取,并且与Tensor相互转化并展示

通过以下学习,可以在进行深度学习过程中,随意挑出图片进行展示,通过Tensor转化为numpy或者是PIL进行查看。

1 图片读取

读取方式 读入的格式 RGB顺序 HWC顺序
cv2.imread(path) numpy.ndarray BGR H、W、C
plt.imread(path) numpy.ndarray RGB H、W、C
Image.open(path) PIL RGB H、W、C

2 图片展示

都用plt.imshow() 展示就行了,太完美了,不过plt展示需要的是RGB顺序,所以展示cv2的图片会出现问题,但是只需要重构一下顺序就行了

举例:
在这里插入图片描述

这里的im_cv出现色彩失调问题,就是因为读入的是BGR,而plt展示的是按照RGB进行展示的,解决方法如下:

修改cv2的BGR顺序重新展示:
在这里插入图片描述

就是对cv2读取的数据进行RGB重构

3 ndarry和PIL相互转化

目的 方式
ndarry -> PIL img = Image.fromarray(img.astype(“uint8”)).convert(“RGB”)
PIL -> ndarry img = np.array(img)

举例:

'''PIL转成numpy数组:'''
img = Image.open(img_path)
print(type(img))  #<class 'PIL.Image.Image'>
img = np.array(img)  
print(type(img))  #<class 'numpy.ndarray'>
print('PIL',img.shape)  #(H,W,C)
'''numpy 转成 PIL'''
#input img is numpy type
img = Image.fromarray(img.astype('uint8')).convert('RGB')
print(type(img))    #<class 'PIL.Image.Image'>

4 Tensor与ndarry和PIL相互转化

目的 方式
PIL、ndarry -> Tensor transforms.ToTensor()
Tensor -> PIL transforms.ToPILImage()
Tensor -> ndarry .numpy()

Tensor 实际上就是ndarry数据类型加上自动微分的功能,所以将Tensor转化为ndarry只需要用.numpy()即可

5 例子

5.1 Tensor -> PIL -> 显示

在这里插入图片描述

Tensor通过ToPILImage() 进行转换,通道都不用改变,转换后的数据类型可以直接通过plt进行显示

5.2 Tensor -> ndarry ->显示

在这里插入图片描述

cv2的图片进行转为Tensor再转为图片,如果想要正常显示,需要进行数据扩大和astype操作,同时,因为TensorCHW形式的,所以转为ndarry,也需要通过np.transpose转换一下维度。

剩下的一种使用plt进行读入,抓为Tensor,再转为ndarry可以自己动手练一下,比5.2还要简单一点

猜你喜欢

转载自blog.csdn.net/qq_44864833/article/details/127337475