似乎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
的图像,它们的亮度不同。
使用cv2.imshow
时,它们可以显示为原始版本。
由plt.imshow
显示的图像在下面上传。它们看起来完全一样,似乎plt.imshow
忽略了图像的亮度。
答案 0 :(得分:1)
图像的类型为uint8,形状为48 x 48像素。因此,matplotlib的imshow
将使用活动颜色图(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)
或者,您可以将灰度值复制到所有三个RGB通道,以便绘制48x48x3像素阵列。这将被解释为图像(与色彩映射数据相对)并正确显示。
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()