基于numpy数组生成目标轨迹热图结果不准确问题求助
问题成因
- 核心错误是
sklearn.preprocessing.MinMaxScaler的使用逻辑不符合需求:MinMaxScaler默认对每一列特征独立做归一化,并非对整个热图二维数组做全局数值缩放。你当前使用的heatmap是1080行×1920列的二维数组,调用fit_transform时会将每一列单独缩放到0-1区间,直接破坏了全局热度计数的分布逻辑,最终只有每一列局部最高值的小区域会显示为最高热度,和全局计数的实际分布完全不符。 - 次要影响因素是操作顺序错误:你先完成色图映射再做高斯模糊,模糊操作会直接修改像素的颜色值,会让原本的高热度区域被柔化缩小,进一步加剧了高亮区域过小的问题。
修复方案
- 替换全局归一化逻辑,放弃使用MinMaxScaler,手动对整个热图数组做全局缩放,避免列维度独立归一化的问题:
# 替换原有result = min_max_scaler.fit_transform(heatmap)代码 heatmap_min = heatmap.min() heatmap_max = heatmap.max() # 增加除0判断,避免无有效检测框时出现计算错误 if heatmap_max > heatmap_min: result = (heatmap - heatmap_min) / (heatmap_max - heatmap_min) else: result = np.zeros_like(heatmap)
- 调整高斯模糊的执行顺序,先对热图计数值做模糊,再做色图映射,避免颜色值被模糊破坏:
# 检测框计数累加完成后先做模糊 heatmap = cv2.GaussianBlur(heatmap,(11,11),cv2.BORDER_DEFAULT) # 再执行全局归一化 heatmap_min = heatmap.min() heatmap_max = heatmap.max() if heatmap_max > heatmap_min: result = (heatmap - heatmap_min) / (heatmap_max - heatmap_min) else: result = np.zeros_like(heatmap) # 最后执行色图映射 newim = Image.fromarray(np.uint8(cm.Wistia(result)*255)) opencvImage = cv2.cvtColor(np.array(newim), cv2.COLOR_RGB2BGR)
内容的提问来源于stack exchange,提问作者Wazaki
相关产品推荐
相关产品推荐

