当前位置: 首页 > news >正文

python 打开pytorch_pytorch学习(五)—图像的加载/读取方式

图像加载问题

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

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

三种主流图像处理库的比较:

函数/方法

返回值

图像像素格式

像素值范围

图像矩阵表示

skimage

io.imread(xxx)

numpy.ndarray

RGB

[0, 255]

(H X W X C)

cv2

cv2.imread(xxx)

numpy.ndarray

BGR

[0, 255]

(H X W X C)

Pillow(PIL)

Image.open(xxx)

PIL.Image.Image对象

根据图像格式,一般为RGB

[0, 255]

开发/实验环境

Ubuntu 18.04

pycharm

pytorch1.0, opencv-python 3.4.3,skimage, numpy,PIL

实验内容

读取图像

准备一张测试图像,彩色32bit

cfca9c4338e7

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方式显示,图像通道顺序不一致。

cfca9c4338e7

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

# ------------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)

显示:

cfca9c4338e7

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()

显示:

cfca9c4338e7

image.png

End

相关文章:

  • 本周技术关注[面向webapps运维]:你养着工作还是工作养着你?
  • python保持登录状态_Python-保持登录状态进行接口测试
  • 有人见过在Windows Server 2003下面出现这样的字体变形模糊的异常吗?
  • 华为p10多屏互动在哪_华为p10如何投屏到电视?手机还有这些使用技巧
  • 关于南沙新厂的弱电工程(设想中,未完)
  • java中文转编码_利用JAVA将中文转Unicode编码
  • 电脑工程师职责要求
  • HTTP错误代码解释
  • c java http_Java Http协议
  • 网络最全最详细的经典命令行
  • java properties 冒号_java集合(四)Map集合之Properties详解
  • 几个事情随便说一下
  • java io 机器名_计算机等级二级Java考试辅导:Java IO机试题及解答(第2部分)
  • 申请了一个ASP免费的空间
  • inputdstream mysql_Spark Streaming编程模型
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript设计模式系列一:工厂模式
  • Java的Interrupt与线程中断
  • JS基础之数据类型、对象、原型、原型链、继承
  • MySQL-事务管理(基础)
  • PHP CLI应用的调试原理
  • 程序员该如何有效的找工作?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 浅谈web中前端模板引擎的使用
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用common-codec进行md5加密
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 数据可视化之下发图实践
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • (Note)C++中的继承方式
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读11/100)Fast R-CNN
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (五)Python 垃圾回收机制
  • (一)Dubbo快速入门、介绍、使用
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .gitignore文件—git忽略文件
  • .NET DataGridView数据绑定说明
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net连接oracle数据库
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @property python知乎_Python3基础之:property
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [BJDCTF 2020]easy_md5
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [CSS3备忘] transform animation 等
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件