同样一张灰度图,plt.imshow
显示的图片和cv2.imshow
显示的图片不一致,这是因为cv2.imshow
和plt.imshow
在处理图像显示时的默认行为有所不同。
python
# matplotlib绘制
plt.imshow(image, "gray")
plt.show()
# cv2绘制
cv2.imshow("img", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
从下面图看matplotlib
绘制的要比cv2
绘制的对比度更强、更亮
matplotlib绘制 | cv2绘制 |
cv2.imshow和plt.imshow的区别
1. 颜色空间:
cv2.imshow
使用的是 BGR 颜色空间,而plt.imshow
使用的是 RGB 颜色空间。如果在使用plt.imshow
时没有指定颜色空间,它会假设输入图像是 RGB 的。- 对于灰度图像,这个差异不明显,但在彩色图像中会导致颜色显示不正确。
2. 图像归一化:
-
plt.imshow
在显示灰度图像时,会自动对图像进行归一化处理,即将图像的像素值缩放到 [0, 1] 范围内。 -
cv2.imshow
则不会进行这种归一化处理,它直接显示图像的原始像素值。
3. 显示范围:
-
plt.imshow
默认会将灰度图像的像素值映射到 [0, 1] 范围内,这样可以增强对比度,使得图像看起来更亮。 -
cv2.imshow
则直接使用图像的原始像素值进行显示,如果图像的像素值范围较小,显示出来的图像可能会显得较暗。
为了让两者显示效果一致,可以在使用plt.imshow
时关闭自动归一化功能,或者手动对图像进行归一化处理后拉伸到0-255再使用cv2.imshow
进行图像显示。例如:
python
import cv2
import matplotlib.pyplot as plt
# 假设 image是灰度图像
# 拉升像素值到0-255
min_val = np.min(image)
max_val = np.max(image)
stretched_image = 255 * ((tempImg - min_val) / (max_val - min_val))
stretched_image = stretched_image.astype(np.uint8)
# 使用 cv2.imshow 显示
cv2.imshow("img", stretched_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 使用 plt.imshow 显示
plt.imshow(image, cmap='gray', vmin=0, vmax=255)
plt.show()