Pytorch可视化(显示图片)及格式转换问题

目录
  • 读取RGB文件
  • 读取HSI文件
  • 在显示图片之前需要注意的几个问题
  • 显示Tensor/numpy的数据类型
  • Tensor进行数据类型的转换
  • Numpy进行数据类型的转换
  • 显示图片
  • 保存RGB图像
  • 总结

读取RGB文件

  • matplotlib

注意 读入的图片的格式:

.jpg格式->uint8~~~~~~~~~~~~~~~~.png格式->float32

import matplotlib.image as mpimg  # mpimg 用于读取图片
a = mpimg.imread(r'C:\Users\Administrator\Desktop\real.jpg')

from torchvision.transforms import ToPILImage
show = ToPILImage() # 可以把Tensor转成Image,方便可视化
show(im).show()
# 这个地方可以用这个show函数来显示图片
  • PIL

对图像内容进行操作的函数,不建议用来读取图片。

from PIL import Image
im = Image.open(r'C:\Users\Administrator\Desktop\real.jpg')
im.show()
  • cv2(推荐)cv2详细介绍

不论什么格式的文件,读入都是uint8

import cv2
# cv2.imread()接口读图像,读进来直接是BGR 格式数据格式在 0~255,通道格式为(W,H,C)
img_BGR = cv2.imread(r'C:\Users\Administrator\Desktop\real.jpg')
rgb = cv2.cvtColor(rgb, cv2.COLOR_BGR2RGB) #转成RGB
rgb = np.transpose(rgb, [2, 0, 1]) # 进行tensor操作时需要将维度放到前面

读取HSI文件

  • scipy
from scipy.io import loadmat
filenames_hyper = glob.glob(os.path.join(opt.data_path, 'NTIRE2020_Train_Spectral', '*.mat'))
# 返回一个list,存放该目录下所有.mat格式的文件路径
for k in range(len(filenames_hyper)):
	mat = loadmat(filenames_hyper[k])
	hyper = np.float32(np.array(mat['cube']))
  • h5py(有时候会出问题…)
import h5py
filenames_hyper = glob.glob(os.path.join(opt.data_path, 'NTIRE2020_Train_Spectral', '*.mat'))
for k in range(len(filenames_hyper)):
	mat = h5py.File(filenames_hyper[k], 'r')

在显示图片之前需要注意的几个问题

矩阵的shape:

  • 一般情况下是[ 行数, 列数, 维数 ](如[ 482, 512, 3 ]),这样显示出来会感觉不自然,但确实就是这样,RGB文件读入时一般也是这样。
  • 使用ToPILImage函数时要注意,详见Pytorch显示一个Tensor类型的图片数据

数据类型是0-1的float型,还是0-255的int型或者uint8型:

  • 只要是浮点数,就会默认是0-1范围内。
  • 只要是整形,就会默认取值范围是2-255。
  • 下面会介绍Tensor和numpy如何进行数据类型的转换;

注意要操作的矩阵是Tensor类型还是numpy类型

显示Tensor/numpy的数据类型

  • dtype
a = torch.Tensor(1,2,3)
print(a.dtype)
print(a.numpy().dtype)

结果:

torch.float32

float32

Tensor进行数据类型的转换

a = torch.randn(10, 20, 3)

a = a.long()/half()/int()...
# torch.long() 将tensor投射为long类型
# torch.half()将tensor投射为半精度浮点类型
# torch.int()将该tensor投射为int类型
# torch.double()将该tensor投射为double类型
# torch.float()将该tensor投射为float类型
# torch.char()将该tensor投射为char类型
# torch.byte()将该tensor投射为byte类型
# torch.short()将该tensor投射为short类型

# 好像没有uint8

Numpy进行数据类型的转换

  • astype()函数
a = np.random.randint(0, 255, 300)
# 在0-255(包括0,不包括255)范围内产生300个随机整形,是一个行向量哦!
a = a.reshape(10,10,3)
a = a.astype(np.uint8)
# .float/.int/...

NumPy 支持比 Python 更多种类的数值类型。

下表显示了 NumPy 中定义的不同标量数据类型。

序号 数据类型 及描述
1. bool 存储为一个字节的布尔值(真或假)
2. int 默认整数,相当于 C 的long,通常为int32或int64
3. int16 16 位整数(-32768 ~ 32767)
4. int32 32位整数(-32768 ~ 32767)
5. uint8 8 位无符号整数(0 ~ 255)
6. float16 半精度浮点:符号位,5 位指数,10 位尾数
6. float32 单精度浮点:符号位,8 位指数,23 位尾数
7. float64 双精度浮点:符号位,11 位指数,52 位尾数

显示图片

  • plt()
from matplotlib import pyplot as plt
import numpy as np
a = abs(torch.randn(10,20,3))*100
plt.imshow(a) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
# 显示单通道,也就是热力图,也就是说可以用它来显示HSI.mat文件
plt.imshow(a[:,:,0])
plt.imshow(a[:,:,0], cmap='Greys_r') #显示单通道黑白图
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
plt.subplot(2,2,1) #与matlab语法很相似
plt.imshow(img_BGR)
plt.axis('off')
plt.title('BGR')
# 使用plt显示图片时tensor和numpy都可
  • ToPILImage()
from torchvision.transforms import ToPILImage
show = ToPILImage() # 可以把Tensor转成Image,方便可视化
import matplotlib.image as mpimg  # mpimg 用于读取图片
im = mpimg.imread(r'C:\Users\Administrator\Desktop\real.jpg')
show(im).show()
# **只有两种情况能用这个show**
 - tensor + 0-1的float + [3,482,512]
 - numpy + uint8 + [482,512,3]

保存RGB图像

保存 matplotlib 画出的图像,相当于一个 screencapture。(会有白边)

plt.savefig('a.png')
  • cv2
# 要保存的数据必须是numpy格式
# 都以uint8格式保存,也就是说如果之前是0-1的float32格式数据会全是0
cv2.imwrite(r'C:\Users\Administrator\Desktop\a.jpg',a)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# 对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3.
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
# cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
# cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小。

将 array 保存为图像

好像有点问题之后再改~

from scipy import misc
misc.imsave('lena_new_sz.png', lena_new_sz)

直接保存 array(直接保存numpy,而不是以图片格式保存)

读取之后还是可以按照前面显示数组的方法对图像进行显示,这种方法完全不会对图像质量造成损失

np.save(r'C:\Users\Administrator\Desktop\a', a) # 会在保存的名字后面自动加上.npy
img = np.load('lena_new_sz.npy') # 读取前面保存的数组

torchvision.utils.save_image

推荐使用

from torchvision.utils import save_image
dir1 = 'C:/Users/Administrator/Desktop/noise.png'
a = torch.randn(3,400,500)    #注意该tensor的形状
show(a).show()
save_image(a,dir1)
# 还可以用该函数生成雪碧图(许多小图拼接成一幅大图)
save_image(torch.stack(image), nrow=8, padding=2, normalize=True, range=(-1, 1))
# 给定 4D mini-batch Tensor,形状为 (B x C x H x W),或者一个a list of image,做成一个size为(B / nrow, nrow),每幅图之间间隔(黑条)是padding的雪碧图。
# 其中从第三个参数开始为函数make_grid()的参数,主要用于生成雪碧图。normalize=True ,会将图片的像素值归一化处理;range=(min, max), min和max是数字,那么min,max用来规范化image
# 所以这个时候需要使用torch.stack()函数将许多图拼接起来(3维->4维)
# 这里再说下和torch.cat()函数的区别,cat是沿着第0个维度进行拼接,并不会增加维度
a = torch.randn(3,400,500)
b = torch.randn(3,400,500)
print(torch.stack((a,b)).shape) #注意拼接时需要时元组或者列表,所以需要加个()/[]
print(torch.cat((a,b)).shape)
'''
结果:
torch.Size([2, 3, 400, 500])
torch.Size([6, 400, 500])
'''

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • pytorch 数据集图片显示方法

    图片显示 pytorch 载入的数据集是元组tuple 形式,里面包括了数据及标签(train_data,label),其中的train_data数据可以转换为torch.Tensor形式,方便后面计算使用. 同样给一些刚入门的同学在使用载入的数据显示图片的时候带来一些难以理解的地方,这里主要是将Tensor与numpy转换的过程,理解了这些就可以就行转换了 CIAFA10数据集 首先载入数据集,这里做了一些数据处理,包括图片尺寸.数据归一化等 import torch from torch.a

  • pytorch 可视化feature map的示例代码

    之前做的一些项目中涉及到feature map 可视化的问题,一个层中feature map的数量往往就是当前层out_channels的值,我们可以通过以下代码可视化自己网络中某层的feature map,个人感觉可视化feature map对调参还是很有用的. 不多说了,直接看代码: import torch from torch.autograd import Variable import torch.nn as nn import pickle from sys import path

  • pytorch对梯度进行可视化进行梯度检查教程

    目的: 在训练神经网络的时候,有时候需要自己写操作,比如faster_rcnn中的roi_pooling,我们可以可视化前向传播的图像和反向传播的梯度图像,前向传播可以检查流程和计算的正确性,而反向传播则可以大概检查流程的正确性. 实验 可视化rroi_align的梯度 1.pytorch 0.4.1及之前,需要声明需要参数,这里将图片数据声明为variable im_data = Variable(im_data, requires_grad=True) 2.进行前向传播,最后的loss映射为

  • Pytorch可视化的几种实现方法

    一,利用 tensorboardX 可视化网络结构 参考 https://github.com/lanpa/tensorboardX 支持scalar, image, figure, histogram, audio, text, graph, onnx_graph, embedding, pr_curve and video summaries. 例子要求tensorboardX>=1.2 and pytorch>=0.4 安装 pip install tensorboardX 或 pip

  • pytorch实现mnist数据集的图像可视化及保存

    如何将pytorch中mnist数据集的图像可视化及保存 导出一些库 import torch import torchvision import torch.utils.data as Data import scipy.misc import os import matplotlib.pyplot as plt BATCH_SIZE = 50 DOWNLOAD_MNIST = True 数据集的准备 #训练集测试集的准备 train_data = torchvision.datasets.M

  • Pytorch可视化(显示图片)及格式转换问题

    目录 读取RGB文件 读取HSI文件 在显示图片之前需要注意的几个问题 显示Tensor/numpy的数据类型 Tensor进行数据类型的转换 Numpy进行数据类型的转换 显示图片 保存RGB图像 总结 读取RGB文件 matplotlib 注意 读入的图片的格式: .jpg格式->uint8~~~~~~~~~~~~~~~~.png格式->float32 import matplotlib.image as mpimg # mpimg 用于读取图片 a = mpimg.imread(r'C:

  • python实现批量图片格式转换

    本文实例为大家分享了python实现批量格式转换的具体代码,供大家参考,具体内容如下 深度学习过程中总是绕不开数据集的制作,有时候实际图片格式或大小可能与需要关心的图片信息不一致,那么我们只能手动做好数据预处理,再进行training dataset.现在将介绍最简单的格式转换问题.可以支持批量图片任意格式转换. 直接上代码: # 将jpg格式转位png import os from PIL import Image import shutil import sys # Define the i

  • Winform中实现图片格式转换

    场景 选择一张照片并选择保存位置和要转换的图片格式实现图片格式转换. 项目运行效果 实现 新建一个窗体页面,然后设计页面布局如下 选择图片按钮点击事件中 private void toolStripButton3_Click(object sender, EventArgs e)//选择转换文件的按钮 { if (openFileDialog1.ShowDialog() == DialogResult.OK) //判断是否选择文件 { listView1.Items.Clear(); //清空l

  • 利用C#实现批量图片格式转换功能

    目录 实践过程 效果 代码 实践过程 效果 代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } string[] path1 = null; //用于存储选择的文件列表 string path2 = ""; //用于存储保存的路径 Bitmap bt; //声明一个转换图片格式的Bitmap对象 Thread td; //声明一个线程 int Imgtype1; //声明一个变

  • java图片格式转换的三段代码

    网上关于java图片格式内容的文章不是很多,也不是很完整,小编搜集了三段java图片格式转换代码,分享给大家: 第一段:java图片格式转换代码 import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Scanner; import javax.imageio.*; public class FormatConversion { public st

  • PyTorch读取Cifar数据集并显示图片的实例讲解

    首先了解一下需要的几个类所在的package from torchvision import transforms, datasets as ds from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np #transform = transforms.Compose是把一系列图片操作组合起来,比如减去像素均值等. #DataLoader读入的数据类型是PIL.Image

  • java实现截取PDF指定页并进行图片格式转换功能

    1.引入依赖 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.16</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifa

  • PHP简单实现图片格式转换(jpg转png,gif转png等)

    需求 开发过程中总会遇到一些需求需要对图片格式进行转换.比如 gif转png,jpg转png 如最近使用某平台的图片文件识别,居然不支持gif格式,那么就需要将gif处理成png等. 依赖 php扩展 gd 和 exif 实现 /** * 图片格式转换 * @param string $image_path 文件路径或url * @param string $to_ext 待转格式,支持png,gif,jpeg,wbmp,webp,xbm * @param null|string $save_p

  • C# 图片格式转换的实例代码

    在日常工作中,经常需要不同格式的图片,有时还需要进行图片格式的相互转换,本文以一个简单的小例子,简述图片格式转换的常见方法,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点 OpenFileDialog 打开文件对话框,用于选择文件,可以设置过滤后缀. FolderBrowserDialog 文件夹选择对话框,用于选择一个文件夹,可以新增. ImageFormat 图片类型枚举. Bitmap 位图对象,包含对应的属性和内容. Stream 流对象的基类. FlowLayoutPanel

  • python利用tkinter实现图片格式转换的示例

    代码 import os from PIL import Image import tkinter import tkinter.filedialog import tkinter.messagebox class Window(): def __init__(self): self.root = root = tkinter.Tk() self.menu = tkinter.Menu(root) self.submenu = tkinter.Menu(self.menu, tearoff=0)

随机推荐