06 - matplotlib中应知应会numpy存储、交换图像

2023-12-23 23:48

本文主要是介绍06 - matplotlib中应知应会numpy存储、交换图像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

numpy的ndarray是mpl官方推荐的输入数据结构

mpl官方推荐绘图时,应以numpy的ndarray数据结构输入数据。虽然有时用pandas中的两个数据结构、python的list等数据结构也可以,但不能保证都能成功。

这是因为numpy的ndarray的结构设计天生具有保存、交换、变换图像数据的优势。

本篇:

  • 将一幅image转换为ndarray保存起来;
  • 再在mpl的fig中读取保存的ndarray,并显示出该image;
  • 并分析ndarray保存image的基本思想。

在mpl中,很多对象的一些参数设置都要借助ndarray的变换来实现一些绘图效果。因此理解ndarray保存图像,对后面学习相关内容非常有帮助。

阅读前两篇关于像素和分辨率的文章,会让你阅读本篇更轻松。

将一幅image存入ndarray

在这里插入图片描述
输入如下代码:

import numpy as np
from PIL import Imageim_source = Image.open('./assets/img2array.jpg') 
#应该修改成你的image保存的路径im_ar = np.array(im_source)
np.save('./assets/imgdata.npy',im_ar)
#同样要修改为你保存数据文件的目录im_ar.shape

在这里插入图片描述
**注意:**上面的代码需要Python的 PIL库的支持

上面的代码完成了这么几件事:

  1. 读取了磁盘上的"img2array.jpg"图像;
  2. 将图像数据转换为数组;
  3. 将数组保存为磁盘文件“imgdata.npy"
  4. 查看了这个数组的形状是:(344, 250, 3)

ndarray保存图像的方式解析

上面的第4个任务显示,图像数据被保存在一个(344, 250, 3)的3维数组中。

你如果读了上一篇,应该记得,这个(344, 250)正是该image的像素大小:
在这里插入图片描述
没错,numpy就是用这样一个3维数组保存image数据的:

  • image高度上的像素个数是ndarray的行数,这里是344行;
  • image宽度上的像素个数是ndarray的列数,这里是255列;
  • 行列交叉位置,就是图像的坐标位置了,即每个像素单元格上,再用一个有3个元素一维数组表示该像素的颜色 [R, G, B] 值。

如下图所示,每个格子是一个像素,每个格子上的3元素的列表就是该像素上的 [R, G, B] 值。

在这里插入图片描述
在这里插入图片描述
使用:im_ar[12][27]检索,返回一个array([247, 176, 148].

我们就知道第13行,第28列上的像素的颜色是 [247, 176, 148],在配色软件上检索这个值:
在这里插入图片描述
numpy就是这样用ndarray保存image的。是不是豁然开朗了!

读取ndarray,显示出图像

我将生存的ndarray数据文件放到了"Python草堂"群文件的DataSets文件中,供大家下载。

输入如下代码:

注意:这是纯面向对象绘图的代码,所以看起来代码比较多,但每一步在做什么,我都很清楚。

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure,SubplotParams
import numpy as npfig =Figure(figsize=(1.1,1.4),dpi=300,facecolor=(239/256,239/256,239/256),edgecolor=(82/256,101/256,155/256),linewidth=2.0,frameon=True,)canvas = FigureCanvasAgg(fig)imgdata = np.load('./assets/imgdata.npy',)
fig.figimage(imgdata,xo=40,yo=30,origin='upper')
s, (width, height) = canvas.print_to_buffer() from PIL import Image
im = Image.frombytes("RGBA", (width, height), s)im.show()

运行它,就会看到在mpl的figure中插入了上面那幅图像:
在这里插入图片描述

图像ndarray数据的广泛用途

ndarray(多维数组)具有强大的运算、变换能力,显然我们将图像存储为ndarray数据后,就可以做很多事:

  1. 传输图像;
  2. 加密图像;
  3. 变换图像,如旋转、缩放、裁剪、滤镜等,mpl中许多地方就是这样用的;

随着写作的进展,越来越多需要自己动手实践,输入、运行代码,体会产生的结果。

由于Python的开源性,第三方库的复杂性,经常会遇到各种问题(代码运行出错、结果不一样等),为了避免在这方面浪费大家的时间,下一篇将专门交流一下Python, matplotlib运行平台的安装配置问题。

(This end.)

这篇关于06 - matplotlib中应知应会numpy存储、交换图像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1