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]的规则将图像显示出来
示例
原图像
image = cv2.imread(r'D:\pythonProject_PlantSeedlingsClassification\0ace21089.png')
print(image.shape)
plt.imshow(image)
plt.show()
输出:
(1899, 1900, 3)
可以看到这时我们用 cv2.imread 读取了图像,但是用 plt.imshow 输出时颜色却不对了。 这个原因便是上面讲过的 cv2 和 plt 读取图像时每个像素的格式是不一样的,前者是[B,G,R],后者是[R,G,B]
解决方案
第一种方法(最简单直接)
使用对应的读取与显示图像方式:
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
image = cv2.imread(r'D:\pythonProject_PlantSeedlingsClassification\0ace21089.png')
cv2.imshow('img',image)
cv2.waitKey(0)
输出:
第二种方法
如果坚持用 cv2.imread 读取图像,plt.imshow 显示图像:
利用原理来解决!
cv2 读取的是 [B,G,R] ,那么把它转化成顺序为 [R,G,B] 的格式不就可以用plt.imshow显示成正确的颜色嘛
import matplotlib.pyplot as plt
import cv2
import numpy as np
image = cv2.imread(r'D:\pythonProject_PlantSeedlingsClassification\0ace21089.png')
img_rgb = np.zeros(shape=image.shape, dtype=np.int32)
img_rgb[:,:,0], img_rgb[:,:,1], img_rgb[:,:,2] = np.copy(image[:,:,2]), np.copy(image[:,:,1]), np.copy(image[:,:,0])
print(img.shape)
print(image_gray.shape)
plt.figure()
fig, axes = plt.subplots(1, 2, figsize=(20, 20))
axes[0].imshow(image)
axes[1].imshow(img_rgb)
plt.show()
输出:
(1899, 1900, 3) (1899, 1900)
第三种方法
如果坚持用 cv2.imread 读取图像,plt.imshow 显示图像,且显示的图像是灰度图(彩色图是无法解决的),可以用下面两种方式:
import matplotlib.pyplot as plt
import cv2
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)
axes[1].imshow(image_gray, cmap='gray')
plt.show()
输出:
(1899, 1900, 3) (1899, 1900)
|