【深度学习|地学应用】用python绘制多波段影像进行滑坡检测时各个因子之间相关性(Pearson 相关系数矩阵)的热力图?
【深度学习|地学应用】用python绘制多波段影像进行滑坡检测时各个因子之间相关性(Pearson 相关系数矩阵)的热力图?
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/147526690
前言
下面的示例代码演示了如何:
- 使用
rasterio
读取一个多波段影像(假设路径为multiband.tif
)和一个二值标签影像(label.tif
)。 - 将标签影像中值为 1 的像素位置用作掩膜,只对这些位置提取多波段影像的像素值。
- 计算各个波段之间在滑坡发生区域(标签值为 1)内的 Pearson 相关系数矩阵。
- 使用
seaborn
绘制相关系数的热力图。
代码示例
import os
import numpy as np
import rasterio
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 文件路径
multiband_path = 'multiband.tif'
label_path = 'label.tif'
out_png = 'band_correlation_heatmap.png'
# 1. 读取多波段影像
with rasterio.open(multiband_path) as src:
# 读取所有波段 (bands, height, width)
data = src.read().astype(np.float32)
band_count = src.count
band_names = [f'B{i}' for i in range(1, band_count+1)]
# 2. 读取标签(二值图)
with rasterio.open(label_path) as lbl:
label = lbl.read(1)
# 3. 构建掩膜:只保留 label == 1 的像素
mask = (label == 1)
# 4. 提取每个波段在掩膜区域的像素值,组织成 DataFrame
# 每一列对应一个波段
pixels = {}
for i, name in enumerate(band_names):
band = data[i, :, :]
pixels[name] = band[mask]
df = pd.DataFrame(pixels)
# 5. 计算 Pearson 相关系数矩阵
corr = df.corr(method='pearson')
# 6. 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(
corr,
annot=True,
fmt='.2f',
cmap='coolwarm',
vmin=-1, vmax=1,
cbar_kws={'label': 'Pearson $r$'}
)
plt.title('Multi-band Correlation Heatmap (on label==1)')
plt.tight_layout()
plt.savefig(out_png, dpi=300)
plt.show()
print(f'已保存热力图: {out_png}')
代码说明
- 读取多波段:
src.read()
返回一个形状为 (波段数, 高度, 宽度) 的 NumPy 数组。 - 掩膜选择:只对标签值为 1 的位置进行相关性分析,以聚焦滑坡区域。
- 数据组织:将每个波段的掩膜内像素拉平成一维数组,放入
pandas.DataFrame
中。 - 相关系数:
df.corr()
默认计算 Pearson 相关系数,可选method='spearman'
或method='kendall'
。 - 可视化:
seaborn.heatmap()
配合annot=True
在图上显示数值,并用coolwarm
色标直观呈现正负相关。
这样就能直观地看到各光谱波段在滑坡发生区域内的相互相关性,为后续特征选择和建模提供依据。