matplotlib与opencv图像读取与显示的问题

news2024/9/24 1:20:58

个人博客:Sekyoro的博客小屋
个人网站:Proanimer的个人网站

最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说
首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具,这里不一一赘述.

Opencv

对于opencv,使用cv2.imshow,cv2.imread以及cv2.imwrite来读写以及显示.

imshow

显示图像的缩放取决于图像深度:
对 8 位无符号图像,按原样显示;
对 16 位无符号或 32 位整数图像,将像素值范围 [0,255*255] 映射到 [0,255] 显示;
对 32 位浮点图像,将像素值范围 [0,1] 映射到 [0,255] 显示;

当cv2.imshow()处理图像深度为CV_8U(默认范围为[0,255])时,按原数据显示;

当处理图像深度为CV_16U(默认范围为[0,65535])时,除以256,映射到[0,255];

当图像深度为CV_32F和CV_64F时(默认范围为[0,1]),乘以255映射到[0,255],超过255直接饱和;

当输入负数时,当作0来处理

import numpy as np
import cv2

img = np.zeros((500, 500, 1))
print(img.dtype)
img[150:170, 150:350] = 10
img[250:270, 150:350] = -1
img[350:370, 150:350] = -10
print(img[350:170, 150:350])
cv2.imshow('img', img)
cv2.waitKey()

由于numpy默认类型float64,浮点数会乘以255,所以只有最上面有一条白线.负值直接黑色

image-20231116201141606
import numpy as np
import cv2
# 新建numpy数组,注意np.zero()创建的数据类型为float64
img = np.zeros((500, 500, 1))
print(img.dtype)
img[150:170, 150:350] = 10
img[250:270, 150:350] = 255
img[350:370, 150:350] = 1
print(img[350:170, 150:350])
cv2.imshow('img', img)
cv2.waitKey()
image-20231116201615437

而如果是大于1的浮点数,也是直接饱和.

如果是uint8,如果超出255,则会被numpy截取,也就是取模

img = np.zeros((500, 500, 1),dtype=np.uint8)
print(img.dtype)
img[150:170, 150:350] = 10
img[250:270, 150:350] = 20
img[350:370, 150:350] = 30
cv2.imshow('img', img)
print(img[350:370, 150:350])
cv2.waitKey()
image-20231116201823217
img = np.zeros((500, 500, 1),dtype=np.uint8)
print(img.dtype)
img[150:170, 150:350] = 10
img[250:270, 150:350] =  512
img[350:370, 150:350] = 255
cv2.imshow('img', img)
print(img[250:270, 150:350])
cv2.waitKey()

打印img[250:270, 150:350]的值发现是0

image-20231116202123379
img = np.zeros((500, 500, 1))
print(img.dtype)
img[150:170, 150:350] = 10
img[250:270, 150:350] =  512
img[350:370, 150:350] = 255
cv2.imshow('img', img)
print(img[250:270, 150:350])
cv2.waitKey()
image-20231116202222468

所以这涉及两个问题,一个是本身numpy的截取另一个是opencv的截取机制.

img = np.zeros((500, 500, 1), dtype=np.uint16)
print(img.dtype)
img[150:170, 150:350] = 2
img[250:270, 150:350] = 255*255
img[350:370, 150:350] = 255*100
cv2.imshow('img', img)
cv2.waitKey(0)
print(img[250:270, 150:350])
cv2.imwrite("test.png", img)
image-20231116202916344

如果是16位无符号整数,会除以255.

最后注意,如果是int32可能会报错

imwrite

机制与imshow类似,不过会根据保存文件的后缀进行编码参数.

cv2.imwrite() 能保存 BGR 3通道图像,或 8 位单通道图像、或 PNG/JPEG/TIFF 16位无符号单通道图像

注意:如果保存float32的图像值超过了1,此时会与imshow机制不同,表现为值被归到0-255

a = np.ones([255,255,1],dtype=np.float32)
a[0:255,0:255] = 10
print(a)
cv2.imshow("img",a)
cv2.waitKey()
cv2.imwrite("test.png",a)

在这里插入图片描述

image-20231116222107874

上面有两张图,分别是imwrite的图片与imshow的图片,由于是浮点数,imshow展示时乘了255导致饱和白色.所以会说imwrite对浮点数不友好,不符合imshow的道理,

imread

注意如果有通道则通道在最后,可以设置

IMREAD_UNCHANGED = -1, //如果设置,则返回的数据带有alpha通道(R,G,B,A 四个通道),否则没有alpha通道
IMREAD_GRAYSCALE = 0, //如果设置,则将图像转换为单通道灰度图像
IMREAD_COLOR = 1, //如果设置,则将图像转换成3通道BGR彩色图像
IMREAD_ANYDEPTH = 2, //如果设置,则在输入具有相应深度时返回16位/32位图像,否则将其转换为8位
IMREAD_ANYCOLOR = 4, //如果设置,则图像可能以任何颜色格式读取
IMREAD_LOAD_GDAL = 8, //如果设置,使用gdal驱动程序加载图像
IMREAD_REDUCED_GRAYSCALE_2 = 16, //如果设置,总是将图像转换为单通道灰度图像且图像大小减少1/2
IMREAD_REDUCED_COLOR_2 = 17, //如果设置,总是将图像转换为3通道BGR彩色图像且图像大小减少1/2
IMREAD_REDUCED_GRAYSCALE_4 = 32, //如果设置,总是将图像转换为单通道灰度图像且图像大小减少1/4
IMREAD_REDUCED_COLOR_4 = 33, //如果设置,总是将图像转换为3通道BGR彩色图像且图像大小减少1/4
IMREAD_REDUCED_GRAYSCALE_8 = 64, //如果设置,总是将图像转换为单通道灰度图像且图像大小减少1/8
IMREAD_REDUCED_COLOR_8 = 65, //如果设置,总是将图像转换为3通道BGR彩色图像且图像大小减少1/8
IMREAD_IGNORE_ORIENTATION = 128 //如果设置,不会根据EXIF的方向标志旋转图像

Matplotlib

imshow

主要讲讲matplotlib的imshow

matplotlib在imshow时,如果接收到的是二维矩阵,会自动归一化,映射到彩色。如果输入的矩阵里面值都是一样的,归一化会把他们全部变为255,也就是呈现黑色。

用于在使用 cmap 映射到颜色之前将标量数据缩放到 [0, 1] 范围的归一化方法。默认情况下,使用线性缩放,将最低值映射到 0,将最高值映射到 1。

imshow的输入

图像数据。支持的数组形状有:(M,N):具有标量数据的图像。使用归一化和颜色图将值映射到颜色。请参阅参数norm、cmap、vmin、vmax。

(M, N, 3):具有 RGB 值(0-1 float 或 0-255 int)的图像。

(M, N, 4):具有 RGBA 值(0-1 float 或 0-255 int)的图像,即包括透明度。前两个维度(M、N)定义图像的行和列。超出范围的 RGB(A) 值将被剪裁。

所以如果使用单通道的数据,会默认norm,而这种norm是根据输入值的min-max进行norm,并不是norm到0-255

image-20231116210309620

img = torch.ones(152,152,1,dtype=torch.uint8)*220
img = img.numpy()
plt.imshow(img,cmap="gray")
plt.show()

解决办法是设置vmin=0,vmax=255,当然使用三通道也可以

image-20231116210559535

相关问题

  1. matplotlib 可视化图像明明255,结果出来全为黑色的问题_plt.imshow 不加vmin和vmax参数是全黑的_佳hong的博客-CSDN博客
  2. 有关函数cv2.imshow()处理不同图像深度时的数据转化问题_cv2.cv_8u图像深度-CSDN博客这篇文章有点问题,目前opencv将负值作为0处理
  3. opencv中imwrite对float的处理 - siren27 - 博客园 (cnblogs.com)
  4. 【精选】使用 tiff/png 文件类型对 uint16_t/float 数据类型存取的无聊实验_float存储方式和uint16-CSDN博客

如有疑问,欢迎各位交流!

服务器配置
宝塔:宝塔服务器面板,一键全能部署及管理
云服务器:阿里云服务器
Vultr服务器
GPU服务器:Vast.ai

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

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

相关文章

python——第十五天

面向对象和面向对象编程 面向对象编程: C语言是一门面向过程的编程语言!!! 面向对象的编程思想 就是分门别类的一种能力 面向对象的概念 类: 对一类事物的统称 对象: 一类事物中的具体案例 面向对象的…

【论文阅读】1 SkyChain:一个深度强化学习的动态区块链分片系统

SkyChain 一、文献简介二、引言及重要信息2.1 研究背景2.2 研究目的和意义2.3 文献的创新点 三、研究内容3.1模型3.2自适应分类账协议3.2.1状态块创建3.2.2合并过程3.2.3拆分过程 3.3评价框架3.3.1性能3.3.1.1共识延迟3.3.1.2重新分片延迟3.3.1.3处理事务数3.3.1.4 约束 3.3.2 …

PromptRank:使用Prompt进行无监督关键词提取

论文题目:PromptRank: Unsupervised Keyphrase Extraction Using Prompt   论文日期:2023/05/15(ACL 2023)   论文地址:https://arxiv.org/abs/2305.04490   GitHub地址:https://github.com/HLT-NLP/PromptRank 文章目录 Ab…

【laBVIEW学习】4.声音播放,自定义图标,滚动条设置

一。声音播放(报错,未实现) 1.报错4810 2.解决方法: 暂时未解决。 二。图片修改 1.目标:灯泡---》自定义灯泡 2.步骤: 1.右键点击--》自定义运行 表示可以制作自定义类型 2.右键--》打开自定义类型 这样就…

文件管理技巧大公开,轻松批量归类相同名称文件到指定文件夹!

在日常生活和工作中,我们经常需要处理大量的文件,包括文档、图片、音频、视频等。然而,随着时间的推移,文件数量不断增加,管理起来也变得越来越困难。为了更高效地整理和分类这些文件,今天我们将向大家介绍…

MySQL处理并发访问和高负载的关键技术和策略

我深知在数据库管理中处理并发访问和高负载的重要性。在这篇文章中,我将探讨MySQL处理并发访问和高负载的关键技术和策略,以帮助读者更好地优化数据库性能。 图片来源:MySQL处理并发访问和高负载的关键技术和策略 MySQL数据库在处理并发访问…

电子学会C/C++编程等级考试2023年03月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:和数(2023.3) 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536输入 共两行,第一行是数列中…

基于java的职工便利系统【大学期末结课作业】

需求分析 背景和目标 基于现在的各类企业的职工在企业日常工作及生活中所需要的各类需求,通过使用Java语言开发一个职工便利系统,以方便职工完成公司内的日常事务,提高工作效率。 设计目的: 设计职工便利系统的主要目的是为了提升职工的工作…

C#测试开源运行耗时库MethodTimer.Fody

微信公众号“dotNET跨平台”的文章《一个监控C#方法运行耗时开源库》介绍了支持测量方法耗时的包MethodTimer.Fody,使用方便,还可以自定义输出信息格式。本文学习并测试MethodTimer.Fody包的使用方式。   新建控制台程序,通过Nuget包管理器…

文心一言 VS 讯飞星火 VS chatgpt (146)-- 算法导论12.2 1题

一、用go语言,假设一棵二叉搜索树中的结点在1到 1000 之间,现在想要查找数值为 363 的结点。下面序列中哪个不是查找过的序列? a.2,252,401,398,330,344,397,363。 b.9…

unity3d模型中缺失animation

在 模型的Rig-Animationtype 设置成Legacy https://tieba.baidu.com/p/2293580178

【开源】基于Vue.js的医院门诊预约挂号系统的设计和实现

项目编号: S 033 ,文末获取源码。 \color{red}{项目编号:S033,文末获取源码。} 项目编号:S033,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

SNAT / DNAT 自定义链

目录 linux 系统本身是没有转发功能,只有路由发送数据 NAT NAT的实现分为两类 SNAT SNAT 应用环境 SNAT 原理 SNAT 转换前提条件 例图参考 开启 SNAT 命令 临时开启 永久开启 修改 iptables 网卡 DNAT DNAT 应用环境 DNAT 原理 DNAT 转换前提条件 …

阿里云Arthas使用——通过watch命令查看类的返回值 捞数据出来

前言 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建 持续更新中… java+vue+微信小程序项目】从零开始搭建——健身房管理平台 项目简介Java项目搭建(IDEA)1.新建项目2.项目类型3.项目设置4…

MySQL之binlog日志

聊聊BINLOG binlog记录什么? MySQL server中所有的搜索引擎发生了更新(DDL和DML)都会产生binlog日志,记录的是语句的原始逻辑 为什么需要binlog? binlog主要有两个应用场景,一是数据复制,在…

CHEM 14 not know

Goals of this lab: • Create and use a calibration curve for the absorbance/concentration relationship for crystal violet • Evaluate absorbance versus time measurements to determine the order of a reaction • Analyze graphs of data to determine best linea…

MySQL进阶知识:InnoDB引擎

目录 逻辑存储结构 架构 内存结构 Buffer Pool Change Buffer Adaptive Hash Index Log Buffer 磁盘结构 后台线程 事务原理 redo log undo log MVCC 隐式字段 undo log版本链 readView 逻辑存储结构 这张图在我之前的笔记中出现过,接下来我们详细介…

CMake 教程:常用命令及其使用方法

CMake是一个跨平台、开源的构建工具,它可以自动生成Makefile或者Visual Studio等IDE的工程文件。它能够帮助开发者更方便地管理项目的构建过程,提高项目构建的效率。在本文中,我们将介绍CMake常用的命令以及对应的用法 add_executable add_e…

五、shell - 算术运算符

目录 1、简介 2、例子 ​​​​​​​1、简介 Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符。原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如expr。expr 是一款表达式计算工具&#xff…