如何用Matplotlib将黑底透明的RGB图像叠加在单波段图像上?
用Matplotlib实现图像叠加(黑色透明、红色保留)
实现步骤
- 导入依赖库:使用
matplotlib.pyplot负责绘图,numpy处理图像数组操作。 - 生成透明通道(Alpha Channel):针对第二张RGB图,把黑色区域(RGB值均为0)标记为完全透明(alpha=0),其余区域(包括红色)保持不透明(alpha=1)。
- 转换为RGBA格式:将原RGB图与生成的alpha通道合并为RGBA图像,注意把alpha通道值转为0-255范围内的uint8格式,符合图像显示要求。
- 叠加显示:先绘制第一张单波段图,再叠加带透明效果的第二张图。
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 假设已加载目标图像:im1为单波段float32(尺寸H×W),im2为RGB uint8(尺寸H×W×3) # 以下为测试图像生成代码,实际使用时替换为你的图像加载逻辑 im1 = np.random.rand(256, 256).astype(np.float32) # 随机生成单波段float32图 im2 = np.zeros((256, 256, 3), dtype=np.uint8) im2[50:150, 50:150] = [255, 0, 0] # 绘制红色方块,其余区域为黑色 # 生成alpha通道:黑色区域设为0,其余区域设为1 alpha = np.where((im2[:, :, 0] == 0) & (im2[:, :, 1] == 0) & (im2[:, :, 2] == 0), 0, 1) # 合并为RGBA格式,alpha通道转为0-255的uint8类型 im2_rgba = np.dstack((im2, (alpha * 255).astype(np.uint8))) # 执行叠加显示 plt.figure(figsize=(8, 8)) # 显示第一张单波段图,可自定义colormap(如viridis、gray等) plt.imshow(im1, cmap='viridis') # 叠加带透明效果的第二张图 plt.imshow(im2_rgba) plt.axis('off') # 隐藏坐标轴 plt.show()
细节调整
- 处理接近黑色的区域:如果需要将接近黑色的区域也设为透明,可调整alpha通道的判断阈值,比如RGB值均小于10:
alpha = np.where((im2[:, :, 0] < 10) & (im2[:, :, 1] < 10) & (im2[:, :, 2] < 10), 0, 1) - 单波段图显示范围:如果单波段图的数值范围不是0-1,可通过
vmin和vmax参数指定显示范围,避免自动归一化导致的颜色偏差:plt.imshow(im1, cmap='viridis', vmin=0, vmax=255)
内容的提问来源于stack exchange,提问作者senek
相关产品推荐
相关产品推荐

