MNIST数据集Matplotlib绘图疑问:未设cmap='gray'为何显示彩色
为什么Matplotlib显示MNIST图像时未设置cmap会变成彩色?
我正在研究MNIST数据集,这是一个灰度手写数字图像集合。我用Matplotlib绘制了数据集中的随机图像:
plt.subplot(221) plt.imshow(X_train[1],cmap='gray') plt.subplot(222) plt.imshow(X_train[100]) plt.subplot(223) plt.imshow(X_train[4559]) plt.subplot(224) plt.imshow(X_train[50000]) plt.show()
我的问题是:当我没有显式设置cmap='gray'时,图像为何会显示为彩色?默认情况下它们不都应该以灰度显示吗?
这是个很常见的Matplotlib使用误区,我来帮你理清楚:
Matplotlib的
imshow()函数默认的颜色映射(colormap)并不是灰度,而是名为viridis的彩色映射(一种蓝黄渐变的配色)。所以当你没有指定cmap参数时,它会自动把单通道的灰度数值(0-255,0为黑,255为白)映射到这个彩色配色上,导致图像看起来是彩色的。MNIST图像确实是单通道的灰度数据,但Matplotlib不会自动识别这是灰度图并切换到灰度映射——它只会根据你指定的colormap来渲染数值。
解决办法有两种:
- 每次调用
imshow()时显式指定cmap='gray',就像你第一个子图做的那样; - 如果不想每次都写,可以全局设置默认的colormap,在代码开头加上:
这样后续所有plt.set_cmap('gray')imshow()都会默认用灰度映射了。
另外补充个小细节:MNIST的图像通常是黑底白字,而cmap='gray'默认是0显示黑色、255显示白色,刚好匹配;如果遇到白底黑字的情况,你可以用cmap='gray_r'来反转颜色映射。
内容的提问来源于stack exchange,提问作者outlier229
相关产品推荐
相关产品推荐

