Matplotlib绘制三通道二进制RGB图像仅显示黑色问题求助
解决Matplotlib绘制RGB二进制图像全黑的问题
问题根源
Matplotlib的imshow函数对整数类型的RGB数组默认采用0-255的颜色映射范围。你的数据是int类型的0和1,在0-255的尺度下几乎等同于黑色,因此整体显示全黑——即便鼠标悬停能看到实际像素值。
可行解决方案
方案1:转换为float类型(0.0-1.0范围)
将通道数组转为float类型,Matplotlib会自动识别0-1的归一化范围:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.axes_rgb import RGBAxes # 转换为float类型的0/1值 b = simg["B"].astype(bool).astype(float) g = simg["G"].astype(bool).astype(float) r = simg["R"].astype(bool).astype(float) # 方式一:dstack合并后绘制 rgb = np.dstack((r, g, b)) plt.imshow(rgb, interpolation="none") plt.show() # 方式二:使用RGBAxes绘制 fig = plt.figure() ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8], pad=0.0) ax.imshow_rgb(r, g, b, interpolation="none") plt.show()
方案2:转换为uint8类型(0-255范围)
把二进制的1放大为255,适配Matplotlib对整数RGB数组的预期范围:
import numpy as np import matplotlib.pyplot as plt # 转换为uint8类型的0/255值 b = simg["B"].astype(bool).astype(np.uint8) * 255 g = simg["G"].astype(bool).astype(np.uint8) * 255 r = simg["R"].astype(bool).astype(np.uint8) * 255 rgb = np.dstack((r, g, b)) plt.imshow(rgb, interpolation="none") plt.show()
逻辑验证
单通道绘制正常是因为你指定了cmap="binary_r",Matplotlib会自动将单通道的0-1映射到色阶的黑白区间;但三通道模式下没有这个自动映射,必须严格符合RGB数组的数值范围规范。
补充说明
上述两种转换方式都能直接适配RGBAxes.imshow_rgb方法,不需要手动实现ScalarMappable的合并逻辑,可保留RGBAxes的原有功能。
内容的提问来源于stack exchange,提问作者realityChemist
相关产品推荐
相关产品推荐

