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 Cimg_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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
torch读图 原作者:侠之大者_7d3f 链接:https://www.jianshu.com/p/cfca9c4338e7相关推荐
- 首次超越人类!“读图会意”这件事,AI比你眼睛更毒辣 | 达摩院
金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在超越人类这件事上,AI 又拿下一分. 就在最近,国际权威机器视觉问答榜单VQA Leaderboard,更新了一项数据: AI在" ...
- 一键读图OCR 轻松搞定任意网页上出现的文字提取
谷歌Chrome浏览器 有个插件:一键读图OCR 用谷歌浏览器打开以下链接,点击 添加扩展, 直接安装即可. https://chrome.google.com/webstore/detail/%E4 ...
- Halcon读图出错怎么办?ReadImage常见错误与处理方法(C++)
点击下方卡片,关注"OpenCV与Halcon视觉"公众号. 视觉/图像重磅干货,第一时间送达! 导读 本文主要介绍Halcon读取读取图片算子read_image使用时可能出现的 ...
- GPT-4王者加冕!读图做题性能炸天,凭自己就能考上斯坦福
[导读]OpenAI的GPT-4在万众瞩目中闪亮登场,多模态功能太炸裂,简直要闪瞎人类的双眼.李飞飞高徒.斯坦福博士Jim Fan表示,GPT4凭借如此强大的推理能力,已经可以自己考上斯坦福了! 果然 ...
- Allan方差读图分析IMU误差指标
1.Allan方差公式推导 IMU噪声参数辨识-艾伦方差 - 知乎前言在统计学中描述随机变量的两个经典参数是均值和方差,早期在定量表征原子钟的频率稳定度时采用的就是经典方差方法.1996年,学者D.W ...
- 利用OpenCV读图绘制栅格导航
利用OpenCV读图绘制栅格导航 实现效果 利用PC的绘图工具预处理图像 利用OpenCV识别图像得出障碍点信息 图像像素row和col的解释 查看图像数据 将index数据导入MATLAB绘制栅格 ...
- C++读图txt文件,并将数据结构 图显示出来
目录 整个代码展示 下面分别是图的两个txt文件,现在用C++读取这个文件,并将图显示出来 第一行分别表示图的节点数和边数 13 13 0 5 4 3 0 1 9 12 6 4 5 4 0 2 11 ...
- pickel加速caffe读图
64*64*3小图(12KB),batchSize=128,训练样本100万, 全部load进来内存受不了,load一次需要大半天 训练时读入一个batch,ali云服务器上每个batch读入时间1. ...
- 自学python(2):利用opencv实现读图,显示,画框,裁剪的python代码
#读图,显示的代码 import cv2 # 读取图像 img = cv2.imread(r'C:/labs/opencvtest/1.jpg', cv2.IMREAD_COLOR) #第一个参数是路 ...
最新文章
- 最近工作好忙,自己的软件又得落下很长一段时间了~
- python 画三维函数图-Python之Numpy:二元函数绘制/三维数据可视化/3D
- c++ new[] delete[]底层分析
- Servlet 单例多线程
- Fibonacci in the Pocket
- JavaScript 音频处理库 pico.js
- 在N + 1场景中使用@NamedEntityGraph更有选择地加载JPA实体
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...
- ftp服务器在线浏览,ftp服务器PDF文件在线查看的实现方法
- MySQL学习笔记_10_MySQL高级操作(下)
- 网红奶茶雪糕高价背后,到底是真好吃还是智商税
- bzoj 2431: [HAOI2009]逆序对数列
- 《MPLS在Cisco IOS上的配置》一2.3 配置命令参考
- 发票勾选平台:验证口令失败--加密模块未打开(0x23) (错误代码:35)
- win7网上邻居_CentOS7 Linux访问Win7的共享文件夹
- 动态规划之钢条切割问题——Rod-cutting problem
- 肥鲨HDO和HD3买哪个?
- HADOOP安装指南-Ubuntu15.10和hadoop2.7.2
- AspectJ 学习笔记
- [Windows] 获取设备唯一标识
热门文章
- Serverless 是云时代软件架构的未来么?
- Python流体动力学共形映射库埃特式流
- 通俗理解Hilbert希尔伯特空间
- flex+FluorineFx ASP.NET 视频拍照
- 点亮你的LCD!(linux原子哥)
- 时间序列数据趋势分析 Cox-Stuart、Mann-Kendall、Dickey-Fuller
- python五环,python图形绘制奥运五环实例讲解
- 中国合成树脂行业“十三五”发展回顾及“十四五”前景展望「图」
- 拼多多商品详情接口测试及申请
- a股交易数据接口-API-说明