政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(二){Image tutorial}·{Python语言}

咱们接着上一篇,这次咱们讲使用Matplotlib绘制图像的简短尝试。

我的这个系列的上一篇文章在这里:

政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(一){Pyplot tutorial}icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136096870

简介

Matplotlib是一个用于绘制图表的Python库,它包含了丰富的图形绘制功能,其中,Matplotlib的Image功能是用于处理和显示图像数据的模块。

使用Matplotlib的Image功能,可以读取、展示和处理图像数据,它支持常见的图像格式,如JPEG、PNG等,并提供了各种方法和函数来操作图像数据。

要读取图像数据,可以使用imread()函数,它可以将图像文件加载到一个NumPy数组中。加载后的图像数据可以通过imshow()函数来显示。

Matplotlib的Image功能还提供了一系列的图像处理函数,如调整图像大小、裁剪、旋转、滤波等。这些函数可以在图像数据上进行操作,并返回处理后的图像数据。

除了基本的图像处理功能外,Matplotlib的Image功能还提供了一些高级的特性,如图像的融合、图像的绘制和叠加、图像的透明度调整等,这些功能可以应用于各种图像处理和视觉化任务中。

总之,Matplotlib的Image功能提供了丰富而强大的图像处理和显示功能,使得用户可以方便地处理和展示图像数据,无论是简单的图像操作还是复杂的图像处理任务,Matplotlib的Image功能都能提供灵活和高效的解决方案。

启动命令

让咱们启动IPython。

它是标准Python提示的一个非常好的增强功能,并且与Matplotlib非常紧密地关联在一起。可以直接在shell上启动IPython,也可以在Jupyter Notebook中启动(其中IPython作为一个运行内核)。

启动IPython后,我们现在需要连接到一个图形用户界面事件循环。

这告诉IPython在哪里(以及如何)显示图形。要连接到GUI循环,请在IPython提示符处执行%matplotlib魔术命令。关于此命令的详细信息,请参阅IPython文档中有关GUI事件循环的部分。

如果您正在使用Jupyter Notebook,相同的命令也可以使用,但人们通常将特定的参数用于%matplotlib魔术命令:

%matplotlib inline

咱们依旧在Conda虚拟环境中启动Jupyter Notebook:

这将打开内联绘图,绘图图形将显示在你的笔记本中。这对交互性有重要的影响。

对于内联绘图,在输出绘图的单元格下面的单元格中的命令不会影响绘图。

例如,无法从创建绘图的单元格下面的单元格中更改色图。

然而,对于其他后端,如打开一个单独窗口的Qt,下面的单元格将更改绘图 - 它是内存中的一个活动对象。

本篇将使用Matplotlib的隐式绘图接口pyplot。

这个接口维护全局状态,非常适用于快速简便地尝试不同的绘图设置。另一种选择是显式接口,更适合于大型应用程序开发。

现在,让我们开始隐式方法的学习

from PIL import Imageimport matplotlib.pyplot as plt
import numpy as np

将图像数据导入到NumPy数组中

Matplotlib依赖Pillow库来加载图像数据。

下面是我们要使用的图像:

这是一张24位RGB的PNG图像(每个颜色通道的位数为8位)。

根据获得数据的方式,您可能会遇到其他类型的图像,最常见的是包含透明度的RGBA图像,或者单通道灰度(亮度)图像。

我们使用Pillow来打开图像(使用PIL.Image.open),然后立即将PIL.Image.Image对象转换为8位(dtype=uint8)的numpy数组。

img = np.asarray(Image.open('./stinkbug.png'))
print(repr(img))

(小伙伴们可以将这张图像拷贝到工作目录中)

我的执行如下:

每个内部列表代表一个像素,在这里,对于一个 RGB 图像,有 3 个值。由于这是一张黑白图片,R、G 和 B 都是相似的。一个 RGBA 图像(其中 A 代表 alpha 或透明度)每个内部列表有 4 个值,而一个简单的亮度图像只有一个值(因此只是一个 2D 数组,而不是一个 3D 数组)。对于 RGB 和 RGBA 图像,Matplotlib 支持 float32 和 uint8 数据类型。对于灰度图像,Matplotlib 只支持 float32。如果你的数组数据不符合上述描述,你需要重新缩放它。

将numpy数组绘制为图像

您刚才已经将数据存储在一个numpy数组中(通过导入或生成)。

我们可以使用Matplotlib的imshow()函数来显示它,在这里,我们将获取绘图对象,这个对象可以方便地在提示符下操作绘图。

imgplot = plt.imshow(img)

我的执行如下:

        (您还可以绘制任何NumPy数组。

将伪彩色方案应用于图像绘图

伪彩色可以是增强对比度和更轻松地可视化数据的有用工具,当使用投影仪展示数据时,这尤其有用-它们的对比度通常很差。

伪彩色只与单通道、灰度、亮度图像相关。我们目前有一个RGB图像,由于R、G和B都相似(可在上方或数据中自行查看),我们可以使用数组切片来选择数据的一个通道(您可以在Numpy教程中了解更多信息)。

lum_img = img[:, :, 0]
plt.imshow(lum_img)

现在,对于一张亮度(2D,无色彩)图像,会应用默认的色彩映射表(也称为查找表,LUT)。默认的色彩映射表被称为viridis。还有很多其他选择。

plt.imshow(lum_img, cmap="hot")

我的执行如下:

请注意,您还可以使用set_cmap()方法来更改现有绘图对象的颜色映射:

imgplot = plt.imshow(lum_img)
imgplot.set_cmap('nipy_spectral')

注意:

请记住,在使用内联后端的Jupyter Notebook中,无法对已呈现的图进行更改。如果您在一个单元格中创建了imgplot,则不能在以后的单元格中调用set_cmap()并期望更早的绘图发生变化。确保您将这些命令一起输入一个单元格中。plt命令不会更改之前单元格中的绘图。

还有许多其他的颜色映射方案可供选择,请查看颜色映射的列表和图像。

颜色标度参考

在图表中添加一个颜色条是有助于了解颜色所代表的价值的。

imgplot = plt.imshow(lum_img)
plt.colorbar()

我的执行:

检查特定的数据范围

有时候,您可能希望增强图像的对比度,或者在牺牲不太变化或不重要的颜色细节的情况下,扩大特定区域的对比度。一个很好的工具来找到有趣的区域是直方图。为了创建我们图像数据的直方图,我们使用hist()函数。

plt.hist(lum_img.ravel(), bins=range(256), fc='k', ec='k')

通常,图像中“有趣”的部分通常在峰值附近,通过裁剪峰值上方和/或下方的区域,可以获得额外的对比度,在我们的直方图中,高端似乎没有太多有用的信息(图像中没有太多白色物体),让我们调整上限,以便我们有效地“放大”直方图的一部分。  

我们通过设置colormap限制clim来实现这一点。

可以通过在调用imshow时传递一个clim关键字参数来实现这一点:

plt.imshow(lum_img, clim=(0, 175))

这也可以通过调用返回的图像绘制对象的set_clim()方法来实现,但是在使用Jupyter Notebook时,请确保在与绘图命令相同的单元格中进行操作,否则它不会更改先前单元格中的绘图。

imgplot = plt.imshow(lum_img)
imgplot.set_clim(0, 175)

数组插值方案

插值计算了像素的颜色或值,根据不同的数学方案,计算出像素“应该”是什么。

一个常见的应用场景是调整图像的大小,像素的数量发生了变化,但你希望保留相同的信息。

由于像素是离散的,存在着缺失的空间,插值就是用来填充这个空间的方法,这就是为什么当你放大图像时,图像有时会出现像素化的效果。当原始图像和放大后的图像之间的差异越大时,效果就更加明显,让我们来缩小一下我们的图像,我们有效地丢弃了一些像素,只保留了一小部分,现在当我们绘制它时,这些数据被放大到屏幕上的尺寸,旧的像素不再存在,计算机必须绘制像素来填充那个空间。

我们将使用"pillow"库来加载图片并调整图片的大小。

img = Image.open('./stinkbug.png')
img.thumbnail((64, 64))  # resizes image in-place
imgplot = plt.imshow(img)

在这里,我们使用默认的插值方法(“nearest”),因为我们没有给imshow()函数传递任何插值参数。

让我们尝试一些其他的词。这是“双线性”的意思:

imgplot = plt.imshow(img, interpolation="bilinear")

和双三次插值:

imgplot = plt.imshow(img, interpolation="bicubic")

双三次插值经常用于放大照片 - 人们倾向于模糊而不是像素化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IM聊天系统为什么需要做消息幂等?如何使用Redis以及Lua脚本做消息幂等【第12期】

0前言 消息收发模型 第一张图是一个时序图,第二张图是一个标清楚步骤的流程图,更加清晰。消息的插入环节主要在2步。save部分。主要也是对这个部分就行消息幂等的操作。 前情提要:使用Redis发布 token 以及lua脚本来共同完成消息的幂等 目…

119.乐理基础-五线谱-五线谱的标记

内容参考于:三分钟音乐社 上一个内容:音值组合法(二) 力度记号:简谱里什么意思,五线谱也完全是什么意思,p越多就越弱,f越多就越强,然后这些渐强、渐弱、sf、fp这些标记…

Proteus -模拟串口被关闭后怎样打开

Proteus -模拟串口被关闭后怎样打开 点击恢复弹出窗口,即可重新打开

WPF中值转换器的使用

什么是值转换器 在WPF(Windows Presentation Foundation)中,值转换器(Value Converter)是一种机制,允许你在绑定时转换绑定源和绑定目标之间的值。值转换器实现了 IValueConverter 接口,该接口…

【华为 ICT HCIA eNSP 习题汇总】——题目集12

1、企业网络内部常常采用私有 IP 地址进行通信,以下哪个地址属于私有 IP 地址? A、0.1.1.1 B、127.5.4.3 C、128.0.0.5 D、172.24.35.36 考点:网络层 解析:(D) A类 IP 地址中,10.0.0.0 ~ 10.255…

深入学习《大学计算机》系列之第1章 1.7节——图灵机的一个例子

一.欢迎来到我的酒馆 第1章 1.7节,图灵机的一个例子。 目录 一.欢迎来到我的酒馆二.图灵机2.1 艾伦-图灵简介2.2 图灵机简介 三.图灵机工作原理3.1 使用图灵机打印二进制数3.2 图灵机工作原理总结 四.总结 二.图灵机 本节内容主要介绍计算机科学之父——艾伦-图灵、…

Java学习-常用API-新增时间

1.学习JDK8新增时间的原因? 2.JDK8新增了那些时间? 代替calendar的 localDate localTime localDateTime 常用APi及代码示例: ZoneIdZonedDateTime 常用方法 代码示例: 代替Date的 Instant常见方法及其代码示例: 注…

权限提升:利用Linux漏洞提权

目录 Linux权限基础 Linux用户权限 Linux文件权限 特殊的Linux文件权限 Linux本机信息收集 利用Linux漏洞进行提权 脏牛漏洞 pkexec Linux权限基础 Linux用户权限 在Linux中,根据权限的不同,大致可以分为三种:超级用户(…

C#,卢卡斯数(Lucas Number)的算法与源代码

1 卢卡斯数(Lucas Number) 卢卡斯数(Lucas Number)是一个以数学家爱德华卢卡斯(Edward Lucas)命名的整数序列。爱德华卢卡斯既研究了这个数列,也研究了有密切关系的斐波那契数(两个…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月13日,星期二

每天一分钟,知晓天下事! 2024年2月13日 星期二 农历正月初四 1、 春节假期旅游爆火!多地景区宣布门票售罄,建议错峰错区游览。 2、 中国旅游研究院:预计2024年全年国内旅游人数将超过60亿人次。 3、 应急管理部&#…

Solidworks:从2D走向3D

Sokidworks 的强大之处在于三维实体建模,这个形状看似复杂,实际上只需要拉伸一次,再做一次减法拉伸就行了。第一次做三维模型,费了不少时间才搞明白。 接下来做一个稍微复杂一点的模型,和上面这个操作差不多&#xff0…

基于Seaborn和Matplotlib的可视化案例分析

处理数据有时会有点无聊。将原始数据转换为可理解的格式是整个过程中最重要的部分之一,那么为什么只停留在数字上,当我们可以将数据可视化为令人兴奋的图表时,这些图表可以在python中获取。这篇文章将重点探索耐人寻味的预处理之旅。 Seabor…

SSM+SpringBoot框架

单例bean是线程安全的吗 AOP Spring事务失效 第四种,在方法内部使用,需要用代理类调用此方法 bean生命周期 bean的循环依赖 SpringMVC执行流程 、 SpringBoot自动配置原理 Spring常见注解 MyBatis执行流程 MyBatis延迟加载 MyBatis缓存

最新在线看4K高清电影网站推荐

随着互联网技术的发展,观看高清电影已经不再是难事。这里我为大家分享几个最新的在线看4K高清电影网站,让您在家就能享受到极致观影体验。 通过下面这个即可 1. 【超清影视】 【超清影视】是国内新兴的4K高清电影网站,拥有海量的影片资源&a…

000——对i.MAX6uLL进行开箱检查

目录 00外观检查 01有线网卡检查 02USB-host测试 03耳机测试 04按键测试 05查看CPU温度 00外观检查 看起来没什么问题,买了半年了刚开始要做 01有线网卡检查 开机启动正常,韦东山老师还写了个欢迎界面,这个我后面因为要用于毕业设计&am…

《Linux 简易速速上手小册》第5章: 用户与群组管理(2024 最新版)

文章目录 5.1 管理用户账户5.1.1 重点基础知识5.1.2 重点案例:创建一个新的开发者账户5.1.3 拓展案例 1:禁用用户登录5.1.4 拓展案例 2:设置账户到期 5.2 群组概念与管理5.2.1 重点基础知识5.2.2 重点案例:为项目团队设置群组5.2.…

《Linux 简易速速上手小册》第3章: 文件系统与权限(2024 最新版)

文章目录 3.1 Linux 文件系统结构3.1.1 重点基础知识3.1.2 重点案例:设置一个 Web 服务器3.1.3 拓展案例 1:日志文件分析3.1.3 拓展案例 2:备份用户数据 3.2 理解文件权限3.2.1 重点基础知识3.2.2 重点案例:共享项目文件夹3.2.3 拓…

FPGA_简单工程_数码管静态显示

一 理论 数码管是一种半导体发光器件,基本单位是发光二极管。 以六位八段数码管为例,每段需要一个端口信号,6814位。 74HC595芯片: 8位串行输入,并行输出的位移缓存器,其内部具有8位移位寄存器和一个存储…

Javaweb之SpringBootWeb案例之 登录功能的详细解析

1. 登录功能 1.1 需求 在登录界面中,我们可以输入用户的用户名以及密码,然后点击 "登录" 按钮就要请求服务器,服务端判断用户输入的用户名或者密码是否正确。如果正确,则返回成功结果,前端跳转至系统首页面…

算法学习——LeetCode力扣二叉树篇4

算法学习——LeetCode力扣二叉树篇4 222. 完全二叉树的节点个数 222. 完全二叉树的节点个数 - 力扣(LeetCode) 描述 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中&#xf…