matplotlib从起点出发(3)_Tutorial_3_Image

news2024/11/18 9:24:34

1 图像教程

matplotlib可以简单地处理并显示图像,当然,它不是一个专业的图像处理库,所以也不要拿它来与opencv进行比较。

2 启动命令

首先,让我们启动IPython。它是对标准python提示符的最出色的增强,它与matplotlib的关系密切。直接在shell上启动IPython,或者使用Jupyter Notebook(其中IPython作为正在运行的内核)。

随着IPython的启动,我们现在需要连接到GUI事件循环。这告诉IPython在哪里(以及如何)显示绘图。要连接到GUI循环,请在IPython提示符下执行%matplotlib魔法。有关其确切作用的更多详细信息,请参阅IPythonu关于GUI事件循环的文档。

如果你使用的是Jupyter Notebook(或者Jupyter Lab),则可以使用相同的命令,但人们通常使用%matplotlib魔术的特定参数:

%matplotlib inline

以下是在jupyter lab中的实际操作情况
在这里插入图片描述

这将打开内联绘图,其中绘图图形将显示在笔记本中。这对交互性具有重要意义。对于内联绘图,输出绘图的单元格下方单元格中的命令不会影响绘图。例如,无法从创建绘图的单元格下方的单元格更改颜色映射表。但是,对于打开单独窗口的其他后端,例如Qt,创建绘图的单元格正文的单元格将更改绘图——它是内存中的活动对象。

本教程将使用matplotlib的隐式绘图接口pyplot。此界面保持全局状态,对于快速轻松地尝试各种绘图设置非常有用,另一种选择是显式的,它更适合大型应用程序开发。有关隐式接口和显式接口之间的权衡说明,请参阅matplotlib应用程序接口(API)和开始使用显示接口的快速入门指南。现在,让我们继续使用隐式方法:

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

3 将图像数据导入Numpy数组

matplotlib 通过Pillow库来载入图像数据。

我们用来演示的图像是这一张:
在这里插入图片描述

这是一个24位RGB PNG格式的图像(R、G、B各8位)。根据你获取数据的位置,你最可能遇到的其他类型的图像是允许透明度的RGBA图像或者单通道(灰度)图像。

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

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

输出:

array([[[104, 104, 104],
        [104, 104, 104],
        [104, 104, 104],
        ...,
        [109, 109, 109],
        [109, 109, 109],
        [109, 109, 109]],

       [[105, 105, 105],
        [105, 105, 105],
        [105, 105, 105],
        ...,
        [109, 109, 109],
        [109, 109, 109],
        [109, 109, 109]],

       [[107, 107, 107],
        [106, 106, 106],
        [106, 106, 106],
        ...,
        [110, 110, 110],
        [110, 110, 110],
        [110, 110, 110]],

       ...,

       [[112, 112, 112],
        [111, 111, 111],
        [110, 110, 110],
        ...,
        [116, 116, 116],
        [115, 115, 115],
        [115, 115, 115]],

       [[113, 113, 113],
        [113, 113, 113],
        [112, 112, 112],
        ...,
        [115, 115, 115],
        [114, 114, 114],
        [114, 114, 114]],

       [[113, 113, 113],
        [115, 115, 115],
        [115, 115, 115],
        ...,
        [114, 114, 114],
        [114, 114, 114],
        [113, 113, 113]]], dtype=uint8)

每个内部列表代表一个像素,在这里,对于RGB图像,有3个值,由于它是黑白图像,因此R、G、B都是一样的。RGBA(其中A是alpha即透明度)每个内部列表有4个值,而简单的灰度图像只有一个值(因此只是一个二维数组,而不是一个三维数组)。对于RGB和RGBA图像,matplotlib支持float32和uint8数据类型。对于灰度,matplotlib仅支持float32。如果数组数据不符合这些描述之一,则需要重新调整它。

4 将numpy数组像图像一样绘制出来

因此,你将数据放在numpy数组中(通过导入或生成它),让我们渲染它。在matplotlib中,这是使用imshow()函数执行的(有意思的是在opencv中显示图像也是相同名称的函数)。在这里,我们将抓取绘图对象。此对象为你提供了一种从提示语操作绘图的简单方法。

imgplot = plt.imshow(img)

在这里插入图片描述

你可以绘制任意的numpy数组(当然不一定是有序的图片,也可能是随机数数组)。

将伪彩色方案应用于图像

伪彩色可以成为增强对比度和更轻松地可视化数据的有用工具。这在使用投影仪学示数据时特别有用——它们的对比度通常很差。

伪彩色仅与单通道、灰度、亮度图像有关。我们目前有一个RGB图像。由于R、G、B都是相同的,我们可以使用数组切片来选择数据的一个通道(你可以在numpy教程中内容):

在这里插入图片描述

现在,对于灰度(2D,无颜色)图像,将应用默认颜色图(也称为查找表,LUT)。默认值称为viridis,但还有其他多种配色方案可供选择。

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

在这里插入图片描述

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

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

在这里插入图片描述

注意
但是,请记住,在具有内联后端的 Jupyter 笔记本中,无法对已呈现的绘图进行更改。如果在一个单元格中创建 imgplot,则不能在后面的单元格中对其调用 set_cmap() 并期望较早的绘图发生变化。确保在一个单元格中一起输入这些命令。plt 命令不会更改早期单元格的绘图。

色标参考

了解颜色代表什么值是有帮助的。我们可以通过为你的图形来添加颜色条来做到这一点:

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

在这里插入图片描述

检视特定的数据分布

有时,你希望增强图像中的对比度,或扩展特定区域的对比度,同时牺牲变化不大或无关紧要的颜色的细节。查找感兴越区域的一个好工具是直方图。为了创建图像数据的直方图,我们使用hist()函数。

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

在这里插入图片描述

大多数情况下,图像的“感兴趣”部分在峰值附近,你可以通过剪切峰值上方和/或下方的区域来获得额外的对比度。在我们的直方图中,高端看起来没有太多有用的信息(图像中没有很多白色的东西)。让我们调整上限,以便有效地“放大”直方图的一部分。我们通过设置clim,即颜色图限制来做到这一点。

这可以通过在调用 imshow 时传递 clim 关键字参数来完成。

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

在这里插入图片描述

这也可以通过调用返回的图像绘图对象的 set_clim() 方法来完成,但请确保在使用 Jupyter Notebook 时在与 plot 命令相同的单元格中执行此操作 ——它不会更改早期单元格的绘图。

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

数组插值方案

插值根据不同的数学方案计算像素“应该”的颜色或值。发生这种情况的一个常见位置是调整图像大小时。像素数会发生变化,但你需要相同的信息。由于像素是离散的,因此缺少空间。插值是填充该空间的方式。这就是为什么当你严重压缩图像时,有时会看起来像素化的原因。当原始图像和扩展图像之间的差异较大时,效果更明显。让我们采用我们的图像并缩小它。我们实际上丢弃了像素,只保留了少数几个像素。现在,当我们绘制它时,这些数据会被放大到屏幕上的大小。旧的像素不再存在,计算机必须绘制像素来填充该空间。

我们将使用用于加载图像的Pillow来调整图像大小。

img = Image.open('../../doc/_static/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.coloradmin.cn/o/788767.html

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

相关文章

OpenHarmony与HarmonyOS联系与区别

目录 1. 背景 2.OpenHarmony 3.HarmonyOS 4.鸿蒙生态 5.OpenHarmony与HarmonyOS的技术上实现区别 1.语言支持 2.SDK 的不同 3.运行调测方式不同 4.对APK的兼容性不同 5.包含关系 6.调试命令 6.何时选择OpenHarmony或是HarmonyOS? 1. 背景 开篇就说“关于…

企业数字化转型中容易出现哪些误区?

对信息化和数字化的投入产出认识有误 在和一些从事企业信息化数字化建设的朋友的沟通中,发现很多企业老板对信息化和数字化投入产出认知上确实有偏差,他们总觉得投入一部分,就得有相应的产出,在他们心里信息化的投入产出如下图曲线…

强化学习SAC算法对数概率公式推导

强化学习 SAC算法 对数概率推导 先上原论文: 首先对公式 ( 20 ) (20) (20) 做推导。 公式 ( 20 ) (20) (20) 的数据流应该是这样的: s → π ( u ∣ s ) → u → a tanh ⁡ ( u ) → a \mathbf{s}\rightarrow \pi(\mathbf{u}|\mathbf{s}) \rightar…

Vue3标签(Tag)

APIs 参数说明类型默认值必传closable标签是否可以关闭booleanfalsefalsecolor标签颜色,预置多种常用颜色:success, processing, error, warn, pink, red, orange, green, cyan, blue, purplestring‘’falseicon设置图标string | slot‘’false Event…

【深度学习】【Image Inpainting】Generative Image Inpainting with Contextual Attention

Generative Image Inpainting with Contextual Attention DeepFillv1 (CVPR’2018) 论文:https://arxiv.org/abs/1801.07892 论文代码:https://github.com/JiahuiYu/generative_inpainting 论文摘录 文章目录 效果一览摘要介绍论文贡献相关工作Image…

MySQL数据备份与恢复练习

目录 1.创建student和score表 2.为student表和score表增加记录 3.备份数据库school到/backup目录 4.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库 5.直接将MySQL数据库压缩备份 6.备份MySQL数据库某个(些)表。此例备…

『Python学习笔记』Python代码打包成pip包(可pip install)|查看安装torch、cuda和cudnn版本号

Python代码打包成pip包(可pip install)|查看安装torch、cuda和cudnn版本号 文章目录 一. pip包的好处二. 简单小例子2.1. 创建Python包2.2. 构建Python包2.3. 上传到PyPI2.4. pip安装测试 三. CLIP多模态模型相关例子3.1. Chinese-CLIP例子3.2. CLIP-ONNX例子3.3. 问题1和问题…

vue使用driver.js完成页面引导的功能

需求:用户首次进入的时候肯定不知道一些功能是干什么在哪里,之后给用户一个页面引导,教他怎么做。 点击插件driver.js官方文档 效果: 1.下载driverjs 我默认下载的是最新版 "driver.js": "^1.0.5",&#x…

MySQL 高级SQL语句(一)

目录 一、高级SQL语句(进阶查询) 1.1 select 1.2 distinct 1.3 where 1.4 and 和 or 1.5 in 1.6 between 1.7 通配符 1.8 like 1.9 order by 一、高级SQL语句(进阶查询) 先准备2个表 一个location表: use m…

私人记账本程序cashbook

什么是 cashbook ? cashbook 是一个私人或家庭记账程序,支持私有化部署,商用或其他使用不受约束。建议使用者每年创建一个账本,图表功能可以起到分析全年数据的效果。 官方提供了演示站点,但不建议记录真实数据 演示账…

ardupilot 遥控的输入控制模式

目录 本节主要记录自己整理ardupilot的遥控器的输入控制模式:正常模式、简单模式、超简单模式的理解。 1.正常模式(有头模式) 在不用简单和超简单的模式的情况下,无人机操作员操作的控制输入是对应着不断旋转着的飞行器进行操作的。如上方图所示举例,当无人机操作员进行…

flask中的werkzeug介绍

flask中的werkzeug Werkzeug是一个Python库,用于开发Web应用程序。它是一个WSGI(Web Server Gateway Interface)工具包,提供了一系列实用功能来帮助开发者处理HTTP请求、响应、URLs等等。Werkzeug的设计非常灵活,可以…

基础入门-SpringBoot-自动配置特性

一、自动配好Tomcat 引入Tomcat依赖。配置Tomcat <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.3.4.RELEASE</version><scope>compile</sco…

同城跑腿小程序怎么做

同城跑腿小程序是一款基于地理位置的服务平台&#xff0c;为用户提供了便捷的日常生活服务。以下是该小程序的主要功能介绍&#xff1a; 1. 快速下单&#xff1a;用户可以通过小程序平台快速填写订单信息&#xff0c;包括取送地址、物品类型和重量等信息&#xff0c;然后选择合…

LabVIEW开发环境试验箱控制器

LabVIEW开发环境试验箱控制器 环境或气候试验箱是一种外壳&#xff0c;用于模拟各种材料&#xff08;包括工业产品、生物物质、复合材料、电子设备和航空航天部件&#xff09;的特定环境条件&#xff0c;并评估调节对这些材料的影响。 环境试验箱&#xff08;ETC&#xff09;…

存储过程——游标

1.游标 什么是游标&#xff0c;以及游标使用的相关语法。 #声明游标&#xff0c;存储查询结果集 #准备&#xff1a;创建表结构 #开启游标 #获取游标中的记录 #插入数据到新表中 #关闭游标 create procedure p11(in uage int) begindeclare uname varchar(100);declare upro …

Istio 故障注入与重试的实验

故障注入 Istio流量治理有故障注入的功能&#xff0c;在接收到用户请求程序的流量时&#xff0c;注入故障现象&#xff0c;例如注入HTTP请求错误&#xff0c;当有流量进入Sidecar时&#xff0c;直接返回一个500的错误请求代码。 通过故障注入可以用来测试整个应用程序的故障恢…

DYLD--动态链接器

概念 dyld&#xff08;the dynamic link editor&#xff09;是苹果的动态链接器&#xff0c;是苹果操作系统一个重要组成部分&#xff0c;在系统内核 XNU 完成 Mach-O 文件的加载&#xff0c;做好程序准备工作之后&#xff0c;交由 dyld 负责余下的工作。在 macOS 系统中&…

vue2引入lottie动画

说明下&#xff1a;如果你是vue3的话请移步&#xff1a;https://blog.csdn.net/qq_67801847/article/details/128386661&#xff0c;这里只针对vue2. 同时动画官网链接&#xff1a;lottie官网 实现思路&#xff1a; 1. 安装lottie-web (版本无所谓) 2. 在使用的页面引入组件 #…

一起来看看音频转文字怎么弄吧

从前有一个名叫小明的学生&#xff0c;他在学校里总是很喜欢录制各种有趣的音频&#xff0c;包括老师的讲课、同学们的笑声&#xff0c;以及校园里的各种声音。有一天&#xff0c;他在课堂上录下了老师的授课内容&#xff0c;想着晚上回家后再将它们转换成文字&#xff0c;便于…