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

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)
在这里插入图片描述

  • 30
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friedrichor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值