You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python索引越界(IndexError)问题求助:代码修改方案咨询

解决Python模板匹配代码的索引越界问题

报错信息

输入彩色图像名称:crosswalk.jpg
输入彩色模板文件名称:crosswalk_template.jpg

  1. 平方差和
  2. 相关系数
  3. 归一化互相关
    输入跨图像匹配类型: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

问题分析

  1. 图像尺寸赋值错误:原代码中h和w都取了len(grey_picture_data[0]),导致高度和宽度被错误设为同一个值,不符合图像实际维度(h应为图像行数,w应为列数)。
  2. 循环范围超限:四重循环中,i+k和j+l的组合会超出原图像grey_picture_data的索引范围。当i和k同时取到循环最大值时,两者之和会超过原图像的行数/列数,触发索引越界。
  3. 结果数组尺寸错误:模板匹配的结果数组尺寸应为原图像尺寸 - 模板尺寸 + 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:15:36