基于互相关的时序图像序列运动检测热力图异常排查
用互相关检测时序图像运动的问题
问题背景
我正在使用Python的互相关方法检测时序图像序列中的运动,通过地面固定相机的稳定视角识别突发运动(尤其是雪崩),最终将结果以热力图形式叠加在序列最后一帧图像上。
我已实现逐像素计算时间维度的互相关值,将结果存储为与原图像尺寸相同的矩阵,归一化后叠加生成热力图。但目前遇到异常:即使使用包含运动的序列,热力图仍显示单一颜色,结果不符合预期。
初始互相关计算代码
def compute_cross_correlation(image_sequence): frames, height, width = image_sequence.shape cross_corr_map = np.zeros((height, width)) for i in range(height): for j in range(width): pixel_values = image_sequence[:, i, j] std = np.std(pixel_values) if std != 0: normalized_values = (pixel_values - np.mean(pixel_values)) / std cross_corr = np.correlate(normalized_values, normalized_values, mode='full') cross_corr_map[i, j] = np.max(np.abs(cross_corr)) else: cross_corr_map[i, j] = np.nan return cross_corr_map
结果归一化代码
def normalize_cross_corr(cross_corr_map): min_val = np.min(cross_corr_map) max_val = np.max(cross_corr_map) normalized_map = (cross_corr_map - min_val) / (max_val - min_val) return normalized_map
更新后的互相关计算代码
基于建议修改了compute_cross_correlation函数,修改点:
- 获取互相关最大值时排除零延迟值
- 标准差为0时赋值为0
def compute_cross_correlation(image_sequence): frames, height, width = image_sequence.shape cross_corr_map = np.zeros((height, width)) for i in range(height): for j in range(width): pixel_values = image_sequence[:, i, j] mean = np.mean(pixel_values) std = np.std(pixel_values) if std != 0: normalized_values = (pixel_values - mean) / std cross_corr = np.correlate(normalized_values, normalized_values, mode='full') max_cross_corr = np.max(cross_corr[len(cross_corr) // 2 + 1:]) cross_corr_map[i, j] = max_cross_corr else: cross_corr_map[i, j] = 0 return cross_corr_map
内容的提问来源于stack exchange,提问作者joekim
相关产品推荐
相关产品推荐

