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操作,同时,因为Tensor为CHW形式的,所以转为ndarry,也需要通过np.transpose转换一下维度。
剩下的一种使用plt进行读入,抓为Tensor,再转为ndarry可以自己动手练一下,比5.2还要简单一点