使用Matplotlib叠加多幅图像并为各图像数据设置不同颜色
解决方案
核心思路
先分离每幅图像的曲线区域(非背景)与背景区域,仅对曲线部分应用不同颜色,再将所有带色曲线叠加到统一背景上,彻底避免更改背景色的问题。
具体实现步骤
确定背景阈值
先从单幅图像中识别背景像素值:如果背景是单一纯色(比如黑色0、白色255),可以直接对比;如果背景有轻微噪点,用自动阈值分割更准确:import numpy as np import matplotlib.pyplot as plt # 取第一幅图像作为参考 base_img = image_list[0] # 手动阈值(适合背景明确的情况) background_value = 0 # 假设背景是黑色 # 或用百分位自动找阈值(应对噪点) # background_threshold = np.percentile(base_img, 5) # curve_mask = base_img > background_threshold初始化RGB输出图像
创建和原图像尺寸一致的RGB图像,先填充背景色:h, w = base_img.shape # 背景色转为RGB格式,比如原背景是0(黑),则RGB是(0,0,0) bg_rgb = np.array([background_value, background_value, background_value]) output = np.full((h, w, 3), bg_rgb, dtype=np.uint8)准备曲线配色
给每个曲线分配不同颜色,可自定义或用预设配色:# 自定义RGB颜色组(按需增减) curve_colors = [ (255, 0, 0), # 红色 (0, 255, 0), # 绿色 (0, 0, 255), # 蓝色 (255, 255, 0), # 黄色 (255, 0, 255) # 品红色 ] # 若图像数量超过颜色数,循环复用颜色 curve_colors = [curve_colors[i % len(curve_colors)] for i in range(len(image_list))]叠加彩色曲线
遍历每幅图像,提取曲线区域并替换为对应颜色:for idx, img in enumerate(image_list): # 标记曲线区域:非背景的像素 is_curve = img != background_value # 将对应颜色赋值到输出图像的曲线区域 output[is_curve] = curve_colors[idx]查看最终效果
plt.imshow(output) plt.axis('off') plt.show()
适配场景补充
- 如果你的图像是浮点数格式(像素值范围0-1):需把颜色值也转为0-1区间(比如
(1,0,0)代替(255,0,0)),输出图像 dtype 设为np.float32。 - 需要半透明叠加:用加权混合实现,比如
output[is_curve] = output[is_curve] * 0.6 + np.array(curve_colors[idx]) * 0.4(注意转换为浮点类型计算)。
内容的提问来源于stack exchange,提问作者Harsh Ambardekar
相关产品推荐
相关产品推荐

