torch读图 原作者:侠之大者_7d3f 链接:https://www.jianshu.com/p/cfca9c4338e7

图像加载问题
使用pytorch制作图像数据集时,需要将存储在磁盘、硬盘的图像读取到内存中,涉及到图像I/O问题。

在python中,图像处理主要采用的库:skimage, opencv-python, Pillow (PIL)。 这三个库均提供了图像读取的方法。

开发/实验环境
Ubuntu 18.04
pycharm
pytorch1.0, opencv-python 3.4.3,skimage, numpy,PIL
实验内容
读取图像
准备一张测试图像,彩色32bit

在这里插入图片描述

dog.jpg
import matplotlib.pyplot as plt
import skimage.io as io
import cv2
from PIL import Image
import numpy as np
import torch

dog.jpg width = 1599, height=1066, channel=3

使用skimage读取图像

img_skimage = io.imread('dog.jpg')        # skimage.io imread()-----np.ndarray,  (H x W x C), [0, 255],RGB
print(img_skimage.shape)

使用opencv读取图像

img_cv = cv2.imread('dog.jpg')            # cv2.imread()------np.array, (H x W xC), [0, 255], BGR
print(img_cv.shape)

使用PIL读取

img_pil = Image.open('dog.jpg')         # PIL.Image.Image对象
img_pil_1 = np.array(img_pil)           # (H x W x C), [0, 255], RGB
print(img_pil_1.shape)

plt.figure()
for i, im in enumerate([img_skimage, img_cv, img_pil_1]):
    ax = plt.subplot(1, 3, i + 1)
    ax.imshow(im)
    plt.pause(0.01)

显示图像:
从左到右分别为skimage, cv2, PIL 读取之后显示的图像。PIL读取的图像为PIL.Image.Image对象,无法用matplotlib直接显示,需要先转为numpy.ndarray对象。
图1,图3显示正常,图像显示不正常,因为opencv读取的图像为BGR格式,matplotllib使用RGB方式显示,图像通道顺序不一致。

image.png
图像转为torch.Tensor对象
在深度学习中,原始图像需要转换为深度学习框架自定义的数据格式,在pytorch中,需要转为torch.Tensor。
pytorch提供了torch.Tensor 与numpy.ndarray转换为接口:

方法名 作用
torch.from_numpy(xxx) numpy.ndarray转为torch.Tensor
tensor1.numpy() 获取tensor1对象的numpy格式数据
torch.Tensor 高维矩阵的表示: (nSample)x C x H x W

numpy.ndarray 高维矩阵的表示: H x W x C
因此在两者转换的时候需要使用numpy.transpose( ) 方法 。

Code


```python
# ------------np.ndarray转为torch.Tensor------------------------------------
# numpy image: H x W x C
# torch image: C x H x W
# np.transpose( xxx,  (2, 0, 1))   # 将 H x W x C 转化为 C x H x W
tensor_skimage = torch.from_numpy(np.transpose(img_skimage, (2, 0, 1)))
tensor_cv = torch.from_numpy(np.transpose(img_cv, (2, 0, 1)))
tensor_pil = torch.from_numpy(np.transpose(img_pil_1, (2, 0, 1)))
#torch.Tensor转numpy.ndarray
#np.transpose( xxx,  (2, 0, 1))   # 将 C x H x W 转化为 H x W x C

img_skimage_2 = np.transpose(tensor_skimage.numpy(), (1, 2, 0))
img_cv_2 = np.transpose(tensor_cv.numpy(), (1, 2, 0))
img_pil_2 = np.transpose(tensor_pil.numpy(), (1, 2, 0))

plt.figure()
for i, im in enumerate([img_skimage_2, img_cv_2, img_pil_2]):
    ax = plt.subplot(1, 3, i + 1)
    ax.imshow(im)
    plt.pause(0.01)

显示:

image.png
opencv图像BGR->RGB操作
opencv默认读取的图像为BGR形式,可以使用opencv提供的方法:cv2.cvtColor( ) 进行图像颜色空间转换

opencv 读取的图像为BGR

首先需要转为RGB

img_cv = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)

转torch.Tensor

tensor_cv = torch.from_numpy(img_cv)

tensor转numpy

img_cv_2 = tensor_cv.numpy()
plt.figure()
plt.title('cv')
plt.imshow(img_cv_2)
plt.show()

显示:

image.png
End

作者:侠之大者_7d3f
链接:https://www.jianshu.com/p/cfca9c4338e7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值