1920×1080二维数组分块求均值绘制seaborn热力图出错如何解决
问题原因与解决方案
核心问题点
- 未预先对像素级显著性数组做网格均值聚合,直接传入1080×1920的原始数组,heatmap默认会逐像素渲染,无法得到单网格单色的效果
- 坐标轴刻度设置逻辑错误:seaborn heatmap的刻度位置对应输入数组的索引值,直接传入像素尺寸级别的刻度值超出了数组索引范围,才会出现空图
- 代码存在语法错误:
xticks[80,160...]行缺少赋值等于号
修正实现逻辑
- 先对原始显著性数组做80×90网格的均值池化,得到24列(1920/80)×12行(1080/90)的聚合后数组,每个元素对应一个网格的平均显著性
- 热力图直接传入聚合后的数组,刻度位置默认对应聚合数组的索引,直接将刻度标签设置为对应的像素坐标即可匹配需求
可运行的修正代码
import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 模拟原始1080×1920显著性数组 normalized_saliency_map = np.random.random((1080, 1920)) # 步骤1:80×90网格均值聚合 grid_h, grid_w = 90, 80 # 聚合得到12行 × 24列的网格显著性数组 agg_saliency = normalized_saliency_map.reshape(1080//grid_h, grid_h, 1920//grid_w, grid_w).mean(axis=(1,3)) # 步骤2:绘制热力图 plt.figure(figsize=(16,9)) # 刻度标签对应原始像素坐标 xticklabels = range(0, 1920, 80) yticklabels = range(0, 1080, 90) ax = sns.heatmap(agg_saliency, cmap='jet', linewidth=0.5, xticklabels=xticklabels, yticklabels=yticklabels) plt.title('Image Saliency Heatmap') plt.show()
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

