首页 > 解决方案 > matplotlib 中的 imhsow 与 opencv 显示的不同

问题描述

似乎 matplotlib.pyplot.imhsow(plt.imshow) 没有显示原始图片,它是否缩放了图像的值?我在使用 cv2.imhsow 和 plt.imhsow 时发现了不同之处。

我有两张图像,它们的亮度不同。但是,当使用 时plt.imshow,它们显示相同。但是使用时显示正确cv2.imhow。这是代码和图像。

import cv2
import matplotlib.pyplot as plt
img_o = plt.imread('1.jpg')
img = plt.imread('2.jpg')
cv2.imshow('img', img)
cv2.imshow('img_o', img_o)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.gray()
plt.imshow(img)
plt.show()
plt.imshow(img_o)
plt.show()

用于 的图像imshow,它们的亮度不同。

1.jpg
2.jpg

使用时cv2.imshow,可以显示为原来的。

显示的图像plt.imshow在下面上传。它们看起来完全一样,似乎plt.imshow忽略了图像的亮度。

图像 图像

标签: python-3.xopencvmatplotlib

解决方案


图像的类型为 uint8,形状为 48 x 48 像素。因此 matplotlibimshow将使用活动颜色图 ( plt.gray()) 对它们进行颜色映射。颜色图归一化是根据数据的最小值和最大值来选择的。使用颜色条进行绘图时,这一点变得清晰。

import matplotlib.pyplot as plt
img_o = plt.imread('1.jpg')
img = plt.imread('2.jpg')

fig, (ax, ax2) = plt.subplots(ncols=2)
plt.gray()
im1 = ax.imshow(img)
fig.colorbar(im1, ax=ax)

im2 = ax2.imshow(img_o)
fig.colorbar(im2, ax=ax2)
plt.show()

在此处输入图像描述

从中我们看到,对于第一个图像,白色表示值 70,而第二个白色是 218。要在两种情况下使用相同的归一化,并与 8 位图像保持一致,可以使用norm = plt.Normalize(0,255)

import matplotlib.pyplot as plt
img_o = plt.imread('1.jpg')
img = plt.imread('2.jpg')

norm = plt.Normalize(0,255)

fig, (ax, ax2) = plt.subplots(ncols=2)
plt.gray()
im1 = ax.imshow(img, norm=norm)
fig.colorbar(im1, ax=ax)

im2 = ax2.imshow(img_o, norm=norm)
fig.colorbar(im2, ax=ax2)
plt.show() 

在此处输入图像描述

或者,您可以将灰度值复制到所有三个 RGB 通道,以便绘制 48x48x3 像素阵列。这将被解释为图像(与彩色映射数据相反)并正确显示。

import numpy as np
import matplotlib.pyplot as plt
img_o = plt.imread('1.jpg')
img = plt.imread('2.jpg')

img_o = np.dstack((img_o,img_o,img_o))
img = np.dstack((img,img,img))


fig, (ax, ax2) = plt.subplots(ncols=2)
im1 = ax.imshow(img)
im2 = ax2.imshow(img_o)

plt.show() 

在此处输入图像描述


推荐阅读