matplotlib的gray、binary色图绘制二进制数组时0与1映射颠倒问题
问题原因说明
这一现象本质是Matplotlib的imshow函数默认的数值归一化逻辑导致的,和色图本身的定义无关:
- 默认情况下
imshow会自动取输入数组的最小值对应色条的最左端点,数组的最大值对应色条的最右端点,中间数值按线性规则做插值映射。
两类场景的具体解释
全1数组映射异常
当你输入全为1的np.uint8数组时,数组的最小值和最大值都是1,归一化后所有值都会映射到色图的最左端点:
gray色图的最左端为黑色,所以全1数组异常显示为全黑,不符合你预期的1对应白色binary色图的最左端为白色,所以全1数组异常显示为全白,不符合你预期的1对应黑色
同时存在0和1的数组映射正常
当数组中同时存在0和1时,数组的最小值为0、最大值为1,归一化后刚好和你预期的映射规则匹配:
- 0映射到色图最左端,1映射到色图最右端,所以两类色图的显示都符合预期。
修复方案
如果需要固定二进制数组的映射规则,不受数组内容的影响,调用imshow时手动指定vmin和vmax参数即可,示例如下:
# 固定gray色图0对应黑、1对应白 plt.imshow(uint8_arr, cmap='gray', vmin=0, vmax=1) # 固定binary色图0对应白、1对应黑 plt.imshow(uint8_arr, cmap='binary', vmin=0, vmax=1)
如果你使用的是取值范围0-255的常规uint8灰度图,对应修改
vmax=255即可固定映射规则。
内容的提问来源于stack exchange,提问作者Anugraha Sinha
相关产品推荐
相关产品推荐

