使用Python对卫星影像双矩阵着色可视化 识别早晚观测值差异
实现方案
核心逻辑
- 不直接做矩阵差丢失原始信息,通过构造RGBA四通道彩色图像实现自定义配色,每个通道对应指定规则的数值映射
- 提前设定差异阈值(可根据观测误差调整,严格相等设为0即可),区分「未变化」和「变化」两类像素分别赋值
代码实现
import numpy as np import matplotlib.pyplot as plt # 1. 自定义参数设置 diff_threshold = 0 # 差异大于该值判定为变化,可根据数据精度调整 orange_rgb = [1, 0.6, 0, 1] # 自定义橙色调,RGBA格式最后一位为不透明度 # 2. 归一化原始矩阵到[0,1]范围(原始取值0-100,直接除以100即可) viz_norm = viz / 100 viz1_norm = viz1 / 100 # 3. 生成变化掩码 diff_mask = np.abs(viz - viz1) > diff_threshold # 4. 构造RGBA图像数组 h, w = viz.shape rgba_img = np.zeros((h, w, 4)) rgba_img[..., 3] = 1 # 默认全不透明 # 未变化区域:红通道映射晚时段数值(对应原Reds色卡效果),蓝通道映射早时段数值(对应原Blues色卡效果) rgba_img[~diff_mask, 0] = viz1_norm[~diff_mask] rgba_img[~diff_mask, 2] = viz_norm[~diff_mask] # 变化区域统一赋值为橙色 rgba_img[diff_mask] = orange_rgb # 5. 可视化 plt.imshow(rgba_img, aspect='auto') plt.axis('off') # 可选:关闭坐标轴 plt.show()
可调整优化项
- 如果需要橙色深浅匹配差异大小,可替换变化区域赋值逻辑:
# 差异值归一化到[0,1] diff_norm = np.abs(viz - viz1) / 100 rgba_img[diff_mask, 0] = 1 rgba_img[diff_mask, 1] = 1 - diff_norm[diff_mask] * 0.4 # 差异越大橙色越深 rgba_img[diff_mask, 2] = 0
- 未变化区域如果不需要同时展示两个时段的数值深浅,可直接固定为纯蓝/纯红,调整对应通道赋值即可
原代码问题说明
你之前连续调用两次imshow的写法,第二次渲染的红色图层会完全覆盖下层的蓝色图层,只有给上层添加透明度参数alpha才能透出下层,但混色效果不可控,也无法单独突出变化区域为橙色。
内容的提问来源于stack exchange,提问作者et11enne
相关产品推荐
相关产品推荐

