Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >matplotlibt图像转OpenCV图像

matplotlibt图像转OpenCV图像

作者头像
王云峰
发布于 2023-10-23 02:27:20
发布于 2023-10-23 02:27:20
81600
代码可运行
举报
运行总次数:0
代码可运行

1. 概述

有时候,我们需要使用Matplotlib库强大的绘图函数来在numpy.ndarray格式的图像上进行一些可视化,比如关键点绘制,投影点绘制。绘制完后,还需要把matplotlib的figure对象转换为numpy.ndarray 格式的对象,方便和原图进行比较。有时候为了可视化的美观,需要验证保证转换后的图像与原始图像大小一致。这里记录一下操作的流程,以及一些常遇到的问题。

2. 原理

核心原理是利用matplotlib.pyplot的imshow函数来显示np.ndarray格式的图像,然后进行可视化绘制,再通过matplotlib.pyplot.figure.canvas的tostring_rgb函数来将图像转换为string,在用numpy的fromstring函数将string转换为np.ndarray,即为我们所求。

示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import matplotlib.pyplot as plt
import numpy as np

# 读取 numpy.ndarray格式的图像
img = cv2.imread('/path/to/my.jpg')
h, w = img.shape[:2]

# 创建figure对象
fig = plt.figure()
# 显示图像
plt.imshow(img)

# 添加函数绘制代码
...

# 绘制画布
fig.canvas.draw()

# 转换plt canvas为string,再导入numpy
vis_img = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8)
# 设置numpy数组大小为图像大小
vis_img.shape = (h, w, 3)

plt.close()

cv2.imwrite('/path/to/vis_img.jpg', vis_img)

3. 几个关键点

上述代码是简单的原理,但要达到保存的vis_img对象与img对象完全等大小,还需要设置figure对象的size,具体实现是通过set_size_inches函数,传入原始图像的宽和高除以dpi的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fig = plt.figure()
fig.set_size_inches(w/fig.dpi, h/fig.dpi)

注意是宽在前面,高在后面。

还有一个很关键的点是需要去除matplotlib设置的padding白边,否则在相同尺寸的情况下,包含白边显得里面的内容变小了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.gca().set_position((0, 0, 1, 1))

为了不显示横纵坐标轴,需要添加plt.axis('off')语句。

为了能在无GUI的环境(比如SSH连到的Linux 服务器)这个脚本也能正常工作,需要采用Agg 这个backend:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib
matplotlib.use('Agg')

插句题外话,Agg这个backend原来是来自于Anti-Grain Geometry 2D渲染库,2002年开始开发,距今已有20年历史了,Respect。

此外由于matploltlib的imshow需要RGB格式的图像,而OpenCV图像格式为BGR,需要做转换。

4. 完整代码

结合上一部分的几个关键点,最终的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np


img = cv2.imread('/path/to/my.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

h, w = img.shape[:2]

fig = plt.figure()
fig.set_size_inches(w/fig.dpi, h/fig.dpi)

plt.imshow(img)

# 开始 matplotlib的绘制
# ...

# 关掉坐标轴的显示
plt.axis('off')

# 加这一句,避免matplotlib的自动padding导致的空白
plt.gca().set_position((0, 0, 1, 1))

fig.canvas.draw()

# 转换plt canvas为string,再导入numpy
vis_img = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8)
# 设置numpy数组大小为图像大小
vis_img.shape = (h, w, 3)
# 将RGB格式转换为BGR格式
vis_img = cv2.cvtColor(vis_img, cv2.COLOR_RGB2BGR)

plt.close()

cv2.imwrite('/path/to/vis_img.jpg', vis_img)

需要注意的是,直接执行这段代码虽然可以得到你想要的结果,但本身是没有意义的,最核心的matplotlib调用需要你自己填写。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[图像处理] Python+OpenCV实现车牌区域识别
这里原理推荐我以前C++图像处理的文章,如下:https://blog.csdn.net/column/details/eastmount-mfc.html
统计学家
2019/04/23
4.7K0
[图像处理] Python+OpenCV实现车牌区域识别
熟练掌握CV中最基础的概念:图像特征,看这篇万字的长文就够了
目录 1,图像特征 2,角点特征 3,使用OpenCV和PIL进行特征提取和可视化 4,特征匹配 5,图像拼接
deephub
2020/05/09
4K0
熟练掌握CV中最基础的概念:图像特征,看这篇万字的长文就够了
OpenCV 4基础篇| OpenCV图像的拼接
游戏开发小Y
2024/05/24
5380
OpenCV 4基础篇| OpenCV图像的拼接
【Python基础】Python中读取图片的6种方式
Python进行图片处理,第一步就是读取图片,这里给大家整理了6种图片的读取方式,并将读取的图片装换成numpy.ndarray()格式。首先需要准备一张照片,假如你有女朋友的话,可以用女朋友的,没有的话,那还学啥Python,赶紧找对象去吧!
黄博的机器学习圈子
2020/11/09
7.7K0
【Python基础】Python中读取图片的6种方式
Python数字图像处理-3种图像读取方式总结
学习数字图像处理,第一步就是读取图像。这里我总结下如何使用 opencv3,scikit-image, PIL 图像处理库读取图片并显示。
嵌入式视觉
2022/09/05
1.5K0
Python数字图像处理-3种图像读取方式总结
基于OpenCV的图像强度操作
代码链接:https://github.com/Tessellate-Imaging/monk_v1/blob/master/study_roadmaps/3_image_processing_deep_learning_roadmap/1_image_processing_basics/3) Image Intensity manipulation.ipynb
小白学视觉
2021/01/06
6170
基于OpenCV的图像强度操作
Python图像处理基本操作[通俗易懂]
欢迎关注白马负金羁的博客 http://blog.csdn.net/baimafujinji,为保证公式、图表得以正确显示,强烈建议你从该地址上查看原版博文。本博客主要关注方向包括:数字图像处理、算法设计与分析、数据结构、机器学习、数据挖掘、统计分析方法、自然语言处理。
全栈程序员站长
2022/11/04
7490
基于 opencv 的图像处理入门教程
虽然计算机视觉领域目前基本是以深度学习算法为主,但实际上很多时候对图片的很多处理方法,并不需要采用深度学习的网络模型,采用目前成熟的图像处理库即可实现,比如 OpenCV 和 PIL ,对图片进行简单的调整大小、裁剪、旋转,或者是对图片的模糊操作。
kbsc13
2020/07/16
2.4K0
基于 opencv 的图像处理入门教程
【OpenCV】Chapter3.图像的仿射变换
仿射变换其实包含了一系列的操作:平移,缩放,旋转等,不过所有的操作都可以通过这个仿射变换矩阵来实现。
zstar
2022/09/22
1.3K0
【OpenCV】Chapter3.图像的仿射变换
【OpenCV】Chapter9.边缘检测与图像分割
边缘检测的原理和matlab实现在我之前这两篇博文中提到过,这里不再赘述。 【计算机视觉】基础图像知识点整理【计算机视觉】数字图像处理基础知识题 此次来看OpenCV的实现方式。
zstar
2022/09/28
1.5K0
【OpenCV】Chapter9.边缘检测与图像分割
使用颜色空间进行图像分割
原文地址:https://realpython.com/python-opencv-color-spaces/
努力努力再努力F
2018/10/08
6.2K0
使用颜色空间进行图像分割
Pytorch中Tensor与各种图像格式的相互转化
在pytorch中经常会遇到图像格式的转化,例如将PIL库读取出来的图片转化为Tensor,亦或者将Tensor转化为numpy格式的图片。而且使用不同图像处理库读取出来的图片格式也不相同,因此,如何在pytorch中正确转化各种图片格式(PIL、numpy、Tensor)是一个在调试中比较重要的问题。
老潘
2018/06/07
15.4K1
Pytorch中Tensor与各种图像格式的相互转化
python深度学习库pytorch::transforms练习:opencv,scikit-image,PIL图像处理库比较
项目地址:https://github.com/Oldpan/Pytorch-Learn/tree/master/Image-Processing
老潘
2018/06/21
1.4K0
python深度学习库pytorch::transforms练习:opencv,scikit-image,PIL图像处理库比较
【OpenCV】Chapter8.形态学图像处理
形态学的基本思想是利用结构元素测量或提取输入图像中的形状或特征,以便进行图像分析和目标识别。
zstar
2022/09/27
1.2K0
【OpenCV】Chapter8.形态学图像处理
Python - 将matplotlib图像转换为numpy.array 或 PIL.Image
matplotlib是python图像处理中让人又爱又恨的库。最近遇到了需要获取plt图像数据的需求,本文记录了将matplotlib图像转换为numpy.array 或 PIL.Image的方法。 众所周知,这个库处理图像会出现内存泄漏的问题,原想着将plt的图转出来用opencv存就好了,然而并没有,牢骚完毕。 转换思路 总体分为两步完成目标: 将plt或fig对象转为argb string的对象 将argb string对象图像转为array 或 Image 步骤一 区分对象为pl
为为为什么
2022/08/04
2K0
Python 图像边缘检测 | 利用 opencv 和 skimage 的 Canny 算法
CSDN 叶庭云:https://yetingyun.blog.csdn.net/
叶庭云
2022/12/28
2.5K0
Python 图像边缘检测 | 利用 opencv 和 skimage 的 Canny 算法
python中imread什么意思_imwrite函数
最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误。如果你正好也对此感到困惑可以看下这篇总结。当然,要了解具体的细节,还是应该 read the fuck code和API document,但貌似python的很多模块文档都不是很全,所以只能多看代码和注释了。
全栈程序员站长
2022/11/04
1.1K0
pytorch DataLoader(1): opencv,skimage,PIL,Tensor转换以及transforms
本文进入热榜收到了不少关注,所以将本文的代码放在了GitHub上,jupyter的,有需要的自取。
烤粽子
2021/07/07
2K0
pytorch DataLoader(1): opencv,skimage,PIL,Tensor转换以及transforms
OpenCV 4基础篇| OpenCV图像基本操作
游戏开发小Y
2024/02/25
5210
OpenCV 4基础篇| OpenCV图像基本操作
用于图像处理的Python顶级库 !!
正如IDC所指出的,数字信息将飙升至175ZB,而这些信息中的巨大一部分是图片。数据科学家需要(预先)测量这些图像,然后再将它们放入人工智能和深度学习模型中。在愉快的部分开始之前,他们需要做重要的工作。
JOYCE_Leo16
2024/03/19
2700
用于图像处理的Python顶级库 !!
推荐阅读
相关推荐
[图像处理] Python+OpenCV实现车牌区域识别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档