plt.imshow显示cv2读取的图像颜色不对的解决方案

2023-10-28

plt.imshow显示cv2读取的图像颜色不对的解决方案

(plt.imshow与cv2.imshow显示同一图像颜色不一致)


原理

Opencv:

cv2.imread( ) 所读取的图像格式:每个像素为[B,G,R]的形式
cv2.imshow( ) 显示图像:按图像中每个像素为[B,G,R]的规则将图像显示出来

matplotlib:

mpimg.imread( ) 所读取的图像格式:每个像素为[R,G,B]的形式
plt.imshow( ) 显示图像:按图像中每个像素为[R,G,B]的规则将图像显示出来

示例

原图像

import matplotlib.pyplot as plt
import cv2

image = cv2.imread(r'D:\pythonProject_PlantSeedlingsClassification\0ace21089.png')

print(image.shape)
plt.imshow(image) 
plt.show()

输出:

在这里插入图片描述

可以看到这时我们用 cv2.imread 读取了图像,但是用 plt.imshow 输出时颜色却不对了。
这个原因便是上面讲过的 cv2 和 plt 读取图像时每个像素的格式是不一样的,前者是[B,G,R],后者是[R,G,B]

解决方案

第一种方法(用原理解决,推荐)

如果坚持用 cv2.imread 读取图像,plt.imshow 显示图像:

利用原理来解决!

cv2 读取的是 [B,G,R] ,那么把它转化成顺序为 [R,G,B] 的格式不就可以用plt.imshow显示成正确的颜色嘛

# 读取图像,单个像素为[B,G,R](cv2的图像是bgr,注意),三维向量(高,宽,3)
image = cv2.imread(r'D:\pythonProject_PlantSeedlingsClassification\0ace21089.png')

b,g,r = cv2.split(image)
image_rgb = cv2.merge((r,g,b))

plt.figure()
fig, axes = plt.subplots(1, 2, figsize=(15, 15))
axes[0].imshow(image)
axes[1].imshow(image_rgb)
plt.show()

输出:
在这里插入图片描述


更新:
现在上面这部分代码可以直接用下面这句话来替代了。

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

第二种方法(最简单直接)

使用对应的读取与显示图像方式:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

image = mpimg.imread(r'D:\pythonProject_PlantSeedlingsClassification\0ace21089.png')

print(image.shape)
plt.imshow(image) 
plt.show()

输出:

(1899, 1900, 3)
在这里插入图片描述

或者

import matplotlib.pyplot as plt
import cv2

# 读取图像,单个像素为[B,G,R](cv2的图像是bgr,注意),三维向量(高,宽,3)
image = cv2.imread(r'D:\pythonProject_PlantSeedlingsClassification\0ace21089.png')

cv2.imshow('img',image)
cv2.waitKey(0)

输出:
在这里插入图片描述

第三种方法

如果坚持用 cv2.imread 读取图像,plt.imshow 显示图像,且显示的图像是灰度图(彩色图是无法解决的),可以用下面的方式:

import matplotlib.pyplot as plt
import cv2

# 读取图像,单个像素为[B,G,R](cv2的图像是bgr,注意),三维向量(高,宽,3)
image = cv2.imread(r'D:\pythonProject_PlantSeedlingsClassification\0ace21089.png')
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

print(image.shape)
print(image_gray.shape)
plt.figure()
fig, axes = plt.subplots(1, 2, figsize=(20, 20))
axes[0].imshow(image_gray)  # 直接显示 image_gray
axes[1].imshow(image_gray, cmap='gray')  # 显示正确颜色的方法
plt.show()

输出:

(1899, 1900, 3)
(1899, 1900)
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

plt.imshow显示cv2读取的图像颜色不对的解决方案 的相关文章

随机推荐

  • JSON数组,JSON对象,数组的区别与基本操作整理

    JSON 语法规则 JSON 语法是 javascript 对象表示语法的子集 数据在名称 值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称 值对 JSON 数据的书写格式是 名称 值对 名称 值对组合中的名称写在前面
  • 三大WEB服务器对比分析(apache ,lighttpd,nginx)

    一 软件介绍 apache lighttpd nginx 1 lighttpd Lighttpd是一个具有非常低的内存开销 cpu占用率低 效能好 以及丰富的模块等特点 lighttpd是众多OpenSource轻量级的web server
  • 微信小程序开发(七) swiper 组件

    微信小程序swiper组件 banner 图 广告页 splash 实现效果 代码 js Page data iamgeUrls https img zcool cn community 0106445dc28607a801209e1f62
  • C++11右值 &&引用

    C 11右值 引用 2017年06月06日 11 56 25 Ink cherry 阅读数 2394 标签 C 右值引用 完美转发 个人分类 C C 感觉这篇讲的比较深入细致了 存一下 via http www cnblogs com Ti
  • [技术经理]02 什么是技术经理?

    目录 01什么是技术经理 02总结 01什么是技术经理 什么是技术经理 我用一句话概括为 专业技术团队的管理者 技术经理 是一种管理职位 通常是在软件开发 互联网等科技公司或技术团队中担任 技术经理的职责 是管理和协调技术团队 确保团队能够
  • java写一个圆类求面积_java编程:定义一个圆类,属性为半径,方法为对输入的半径计算其周长和面积?...

    展开全部 java编程e68a8462616964757a686964616f31333365633864定义一个类圆属性半径方法 计算周长面积设置半径读取半径急java编程定义一个类 java编程定义一个类圆属性半径 方法计算周长面积设置
  • “3D 元宇宙技术”在汽车新零售领域的应用与实践

    一 引言 随着不久前汽车之家新零售项目震撼发布 我们直击用户看车选车痛点首次提出ABC新体验模式 以元宇宙科技打造沉浸式交互服务 开放元宇宙能源空间站体验店 为用户打造更 有用 的体验 其中 A 是指一站式选车试车服务 All in one
  • python爬虫基础知识的总结

    什么是爬虫 一 爬虫概述 简单来说 爬虫就是获取网页并提取和保存信息的自动化程序 1 获取页面 如urllib requests等 2 提取信息 Beautiful Soup pyquery lxml等 3 保存数据 MySQL Mongo
  • [Pandas]Dataframe中切片常用技巧

    1 根据值在是否在列表中进行切片 方法一 使用isin方法可以根据DataFrame中的某列的值是否在某个列表中来进行切片 注意 这里不要直接使用in 否则会报错 代码如下 pf pd DataFrame 74 27 EA 4D 93 BD
  • 2. Redis持久化、主从哨兵架构详解

    分布式缓存技术Redis 1 Redis持久化 1 1 RDB快照 snapshot 1 1 1 bgsave的写时复制 COW 机制 1 2 AOF append only file 1 2 1 AOF重写 1 3 Redis 4 0 混
  • 努力一周,开源一个超好用的接口Mock工具——Msw-Tools

    作为一名前端开发 是不是总有这样的体验 基础功能逻辑和页面UI开发很快速 本来可以提前完成 但是接口数据联调很费劲 耗时又耗力 有时为了保证进度还不得不加加班 为了摆脱这种痛苦 经过一周的努力 从零开发了一个灵活无依赖 且集成简单的数据接口
  • IP地址介绍,子网划分(VLSM),构造超网(CIDR) 详解

    概述 IPv4地址从被设计开始一直到现今 一共经历了三次重大变化 分类的IPv4地址 子网划分 构造超网 1 分类的IPv4地址 IP地址是路由器用来跨网段转发IP数据报 寻找路线的32位 二进制代码 由网络地址 网络号 和主机地址 主机号
  • jps命令

    列出目标系统上检测的 Java 虚拟机 JVM 此命令是实验性的 不受支持 概要 jps options hostid options 命令行选项 请参阅Options hostid 应为其生成进程报告的主机的标识符 它hostid可以包括
  • Android 6.0 CoordinatorLayout

    http www cnblogs com yuanchongjie p 4997134 html https www aswifter com 2015 11 12 mastering coordinator http blog csdn
  • 结巴分词参考地址

    Git参考 https github com fxsjy jieba jieba 是一个python实现的中文分词组件 在中文分词界非常出名 支持简 繁体中文 高级用户还可以加入自定义词典以提高分词的准确率 它支持三种分词模式 精确模式 试
  • 自定义input[type="radio"]的样式

    对于表单 input type radio 的样式总是不那么友好 在不同的浏览器中表现不一 对单选按钮自定义样式 我们以前一直用的脚本来实现 不过现在可以使用新的伪类 checkbox 来实现 如果直接对单选按钮设置样式 那么这个伪类并不实
  • [错误解决]paramiko.ssh_exception.SSHException: Error reading SSH protocol banner 设置

    报错信息 上午的时候数据组的同事跟我说有几个程序报错 经过查看log发现找到报错信息 paramiko ssh exception SSHException Error reading SSH protocol banner 经过搜索 得知
  • Callable异步原理简析

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net u012664375 article details 66967687 Callable异步执行 应该不会陌生 那么在java中是怎么用的呢 又是如
  • angular抛出 ExpressionChangedAfterItHasBeenCheckedError错误分析

    当变更检测完成后又更改了表达式值时 Angular 就会抛出 ExpressionChangedAfterItHasBeenCheckedError 错误 Angular 只会在开发模式下抛出此错误 在开发模式下 Angular 在每次变更
  • plt.imshow显示cv2读取的图像颜色不对的解决方案

    plt imshow显示cv2读取的图像颜色不对的解决方案 plt imshow与cv2 imshow显示同一图像颜色不一致 原理 Opencv cv2 imread 所读取的图像格式 每个像素为 B G R 的形式 cv2 imshow