Pytorch D2L Subplots方法对画图、图片处理

2023-11-21 08:01

本文主要是介绍Pytorch D2L Subplots方法对画图、图片处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题代码

def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): #@save
"""绘制图像列表"""
figsize = (num_cols * scale, num_rows * scale)
_, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)
axes = axes.flatten()
for i, (ax, img) in enumerate(zip(axes, imgs)):
if torch.is_tensor(img):
# 图片张量
ax.imshow(img.numpy())
else:
# PIL图片
ax.imshow(img)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
if titles:
ax.set_title(titles[i])
return axes

d2l.plt.subplots返回值

plt.subplots是matplotlib库中的一个函数,用于创建一个新的Figure对象,并在其中创建一个或多个子图(subplot)。
它的基本用法是:

fig, ax = plt.subplots(nrows=1, ncols=1, **kwargs)
其中,nrowsncols分别指定了子图的行数和列数。如果只想创建一个子图,可以省略其中一个参数。

返回值fig是Figure对象ax则是一个或多个子图的Axes对象(如果只创建了一个子图,则返回一个单独的Axes对象;如果创建了多个子图,则返回一个Axes对象列表)。

kwargs是可选的关键字参数,用于设置Figure和子图的属性。例如,可以使用figsize参数设置Figure的大小,使用sharexsharey参数来共享子图的x轴和y轴。

axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)

解释:

d2l.plt.subplots创建了一个包含多个子图的网格(grid);

num_rows和num_cols分别指定了网格中子图的行数和列数;
figsize指定了整个图像的尺寸,即包含所有子图的画布大小。
返回值axes是一个由网格的子图对象组成的NumPy数组。
我们可以使用它来访问、控制和绘制每个子图。

举例说明:

axes是一个由子图对象组成的NumPy数组,它可以用来访问、控制和绘制每个子图。具体来说,axes是一个大小为(num_rows, num_cols)的NumPy数组,其中axes[i, j]表示第 i + 1 i+1 i+1行和第 j + 1 j+1 j+1列的子图对象。

例如,如果我们使用以下代码创建一个包含 2 2 2行 3 3 3列子图的网格:


import matplotlib.pyplot as pltimport d2lfigsize = (6, 4)num_rows, num_cols = 2, 3axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)那么`axes`将是一个大小为$(2, 3)$的NumPy数组,可以通过索引来访问每个子图对象。例如,我们可以在第$1$行第$2$列的子图中绘制一条直线:axes[0, 1].plot([0, 1], [0, 1])

或者我们可以在所有子图中添加一个标题:


for i in range(num_rows):for j in range(num_cols):axes[i, j].set_title(f'Subplot ({i+1}, {j+1})')

原链接

subplot()、subplots()

subplot()、subplots()在实际过程中,先创建了一个figure画窗,然后通过调用add_subplot()来向画窗中各个分块添加坐标区,其差别在于是分次添加(subplot())还是一次性添加(subplots())

在这里插入图片描述
3.plt.subplots()
语法格式:

matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False,
sharey=False, squeeze=True,subplot_kw=None, gridspec_kw=None, **fig_kw)
-nrows:默认为 1,设置图表的行数。
-ncols:默认为 1,设置图表的列数。
-sharex、sharey:设置 x、y 轴是否共享属性,默认为 false,可设置为 ‘none’、‘all’、‘row’ 或 ‘col’。 False 或 none 每个子图的 x 轴或 y 轴都是独立的,True 或 ‘all’:所有子图共享 x 轴或 y 轴,‘row’ 设置每个子图行共享一个 x 轴或 y 轴,‘col’:设置每个子图列共享一个 x 轴或 y 轴。

import matplotlib.pyplot as plt
import numpy as np# 创建一些测试数据 
x = np.linspace(0,100, 4)
y = np.sin(x**2)# 创建一个画像和子图 -- 图1
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')# 创建两个子图 -- 图2
#如图figure2,四个子图中上两幅图并无x轴(与下子图共享),因为已设置sharex=True
#若改为sharey=True,可观察到四副子图中右两幅无y轴(即与左子图共享)
f, ([ax1, ax2],[ax3,ax4]) = plt.subplots(2, 2, sharex=True)
ax1.plot(x, y)
ax1.set_title('Sharing x axis')
ax2.scatter(x, y)
ax3.scatter(x, y)
ax4.scatter(x, y)# 创建四个子图 -- 图3
#通过对subplot_kw传入参数,生成关于极坐标系的子图
fig, axs = plt.subplots(2, 2, subplot_kw=dict(projection="polar"))
axs[0, 0].plot(x, y)
axs[1, 1].scatter(x, y)plt.show()

在这里插入图片描述

文章来源地址

python内置函数:zip()函数搭配enumerate函数使用,用在for循环中

简介enumerate()

enumerate()函数是Python的内置函数,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),可以利用enumerate函数同时获取对象的索引和值。

x=np.arange(0,100,10)
for i in enumerate(x):index = i[0]; xval = i[1]print(index,xval)
0 0
1 10
2 20
3 30
4 40
5 50
6 60
7 70
8 80
9 90
简介zip()

zip函数是Python的内置函数,它用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象(即对多个序列进行并行迭代)。如果各个迭代器元素个数不一致,zip()函数则在最短序列“用完”时就会停止。

sz = np.arange(1,100,10)
sx = np.arange(1,10,1)
for index, (szi, sxi) in enumerate(zip(sz, sx)):print(index,szi,sxi)
0 1 1
1 11 2
2 21 3
3 31 4
4 41 5
5 51 6
6 61 7
7 71 8
8 81 9

transforms.Compose(trans)

Compose()类会将transforms列表里面的transform操作进行遍历。实现的代码很简单:

## 这里对源码进行了部分截取。
def __call__(self, img):for t in self.transforms:	img = t(img)return img

pytorch通过深度学习进行预处理图片,离不开transforms.Compose(),torchvision.datasets.ImageFolder(),torch.utils.data.DataLoader()的用法。

源自于文章

1.Transform.Compose()详解

导入相应的库


import torch
import torchvision
import matplotlib.pyplot as plt
from torch.utils import data
from torchvision import datasets,transforms
from PIL import Image
%matplotlib inline

在这里插入图片描述

class torchvision.transforms.Compose(transforms):# Composes several transforms together.# Parameters: transforms (list of Transform objects) – list of transforms to compose.Example # 可以看出Compose里面的参数实际上就是个列表,而这个列表里面的元素就是你想要执行的transform操作。
>>> transforms.Compose([
>>>     transforms.CenterCrop(10),
>>>     transforms.ToTensor(),])

展示原始图片

pic = "./train/Chihuahua/n02085620_10074.jpg"img = plt.imread(pic)
plt.imshow(img)

定义图片预处理的对象。

traintransform = transforms.Compose([transforms.RandomRotation(20),           # 随机旋转20°transforms.ColorJitter(brightness=0.1), #随机改变图像的亮度对比度和饱和度transforms.Resize([150,150]),          # 转换为需要的尺寸transforms.ToTensor(),                #convert a PIL image to tensor (H*W*C)])
img1 = Image.fromarray(img)   #将numpy对象的img转换为PIL格式
img2 = traintransform(img1)# 图像预处理tensor
img3 = transforms.ToPILImage()(img2)#转换为PIL进行展示
plt.imshow(img3)

展示处理之后的图片,可以看出,图片旋转了20°,并且大小转换为(150,150)

附上——transforms中的函数如何使用?

# Resize:把给定的图片resize到given size
# Normalize:Normalized an tensor image with mean and standard deviation
# ToTensor:convert a PIL image to tensor (H*W*C) in range [0,255] to a torch.Tensor(C*H*W) in the range [0.0,1.0]
# ToPILImage: convert a tensor to PIL image
# Scale:目前已经不用了,推荐用Resize
# CenterCrop:在图片的中间区域进行裁剪
# RandomCrop:在一个随机的位置进行裁剪
# RandomHorizontalFlip:以0.5的概率水平翻转给定的PIL图像
# RandomVerticalFlip:以0.5的概率竖直翻转给定的PIL图像
# RandomResizedCrop:将PIL图像裁剪成任意大小和纵横比
# Grayscale:将图像转换为灰度图像
# RandomGrayscale:将图像以一定的概率转换为灰度图像
# FiceCrop:把图像裁剪为四个角和一个中心
# TenCrop
# Pad:填充
# ColorJitter:随机改变图像的亮度对比度和饱和度。

这篇关于Pytorch D2L Subplots方法对画图、图片处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400981

相关文章

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准