plt.imshow()中numpy数组问题:全255灰度图为何显示黑色?
为什么全为255的灰度图显示成黑色?
这问题我之前也碰到过,其实核心原因和matplotlib处理数据的方式有关,咱们一步步说:
首先看你的代码:
a = np.ones(shape=(2, 2)) * 255 plt.imshow(a, cmap='gray')
你生成的数组a是float64类型的(因为np.ones默认产出浮点数数组),而matplotlib的imshow在处理浮点数数组时,默认逻辑是这样的:
- 它会自动取数组的最小值和最大值作为颜色映射的范围(
vmin和vmax) - 然后把所有数据归一到
[0,1]区间,对应灰度图的黑到白
但你的数组里所有值都是255,这就导致vmin = vmax = 255,归一化时会出现除以0的情况(公式是(x - vmin)/(vmax - vmin)),这时候matplotlib会把所有值都映射到颜色映射的最低端——也就是黑色。
那怎么解决呢?给你三个简单的方案:
方案1:转换成uint8整数类型
如果你想直接用0-255的灰度值标准,把数组改成uint8类型就行,matplotlib会自动识别这个范围:a = np.ones(shape=(2, 2), dtype=np.uint8) * 255 plt.imshow(a, cmap='gray')方案2:手动指定vmin和vmax
强制告诉matplotlib灰度值的范围是0到255,这样不管你的数据是什么类型,255都会被映射成白色:a = np.ones(shape=(2, 2)) * 255 plt.imshow(a, cmap='gray', vmin=0, vmax=255)方案3:归一化数据到0-1范围
把255转换成1.0,符合matplotlib对浮点数数组的默认预期:a = np.ones(shape=(2, 2)) * 255 plt.imshow(a / 255, cmap='gray')
随便选一种都能让你的2×2数组显示成白色啦~
内容的提问来源于stack exchange,提问作者Pandas
相关产品推荐
相关产品推荐

