Python索引越界(IndexError)问题求助:代码修改方案咨询
解决Python模板匹配代码的索引越界问题
报错信息
输入彩色图像名称:crosswalk.jpg
输入彩色模板文件名称:crosswalk_template.jpg
- 平方差和
- 相关系数
- 归一化互相关
输入跨图像匹配类型:1
回溯(最近的调用最后):文件 "C:\Program Files\Spyder\pkgs\spyder_kernels\py3compat.py", 第356行, 在 compat_exec中
exec(code, globals, locals)文件 "d:\purdue\engr 133\proj.py", 第206行, 在
中
r[i][j] += (((grey_picture_data[i+k][j+l]) - (grey_picture_data_2[k][l]))**2)IndexError: 索引683超出了轴0的范围,轴0长度为683
问题分析
- 图像尺寸赋值错误:原代码中
h和w都取了len(grey_picture_data[0]),导致高度和宽度被错误设为同一个值,不符合图像实际维度(h应为图像行数,w应为列数)。 - 循环范围超限:四重循环中,
i+k和j+l的组合会超出原图像grey_picture_data的索引范围。当i和k同时取到循环最大值时,两者之和会超过原图像的行数/列数,触发索引越界。 - 结果数组尺寸错误:模板匹配的结果数组尺寸应为
原图像尺寸 - 模板尺寸 + 1,而非和原图像尺寸一致。
修改后的代码
基础修正版本
print("1. 平方差和") print("2. 相关系数") print("3. 归一化互相关") cross_image_type = input("输入跨图像匹配类型:") if cross_image_type == "1": # 修正原图像尺寸获取:h为行数(高度),w为列数(宽度) h = len(grey_picture_data) w = len(grey_picture_data[0]) # 获取模板图像的尺寸 h_t = len(grey_picture_data_2) w_t = len(grey_picture_data_2[0]) # 结果数组的正确尺寸:原图像可滑动的位置数量 r = np.zeros((h - h_t + 1, w - w_t + 1)) # 遍历模板的每个像素 for k in range(h_t): for l in range(w_t): # 遍历原图像中能放下模板的所有位置 for i in range(h - h_t + 1): for j in range(w - w_t + 1): r[i][j] += ((grey_picture_data[i + k][j + l] - grey_picture_data_2[k][l]) ** 2)
高效向量化版本(推荐)
如果使用numpy/scipy,可用向量化操作替代四重循环,大幅提升效率:
import numpy as np from scipy.signal import correlate2d print("1. 平方差和") print("2. 相关系数") print("3. 归一化互相关") cross_image_type = input("输入跨图像匹配类型:") if cross_image_type == "1": # 转换为numpy数组(如果还不是的话) grey_picture_data = np.array(grey_picture_data) grey_picture_data_2 = np.array(grey_picture_data_2) # 用correlate2d实现平方差和的高效计算 term1 = correlate2d(grey_picture_data ** 2, np.ones(grey_picture_data_2.shape), mode='valid') term2 = correlate2d(np.ones(grey_picture_data.shape), grey_picture_data_2 ** 2, mode='valid') term3 = 2 * correlate2d(grey_picture_data, grey_picture_data_2, mode='valid') r = term1 + term2 - term3
内容的提问来源于stack exchange,提问作者Shashank Umesh
相关产品推荐
相关产品推荐

