Python向列表指定索引存值触发IndexError索引越界错误
报错原因定位
触发索引越界的直接原因和代码中存在的其他逻辑问题如下:
- 空列表直接按索引赋值:你初始化的
arr = []是长度为0的空列表,Python列表不支持对不存在的索引位置直接赋值,必须通过append()追加元素,或提前初始化对应长度的列表,arr[i] = ...这行代码直接触发越界报错。 - 数组切片维度顺序错误:OpenCV读取的图片NumPy数组维度顺序为
(高度, 宽度, 通道数),你写的切片逻辑把宽高轴顺序写反,切出来的分片尺寸、位置完全错误。 - 循环和坐标更新逻辑混乱:三层遍历像素的for循环完全没有必要,且坐标更新存在多处错误:
initialw = initialw + initialw运算结果永远为0,initialh = initialh + initial中的initial变量从未定义,会触发名称错误;步长累加逻辑放在最内层循环,会导致分片坐标计算完全错乱。 - 重复IO操作:同时用PIL和OpenCV读取两次同一张图片,属于冗余操作。
正确实现代码
以下代码实现将图片均匀切分为2行2列共4个分片,所有分片存入列表后可直接通过索引调取:
import cv2 import numpy as np # 读取原始图片 oriImg = cv2.imread('topsecret1.jpg') # 直接从NumPy数组获取原图宽高,无需额外用PIL读取 img_height, img_width = oriImg.shape[:2] # 计算单个分片的尺寸,4分片为2行2列排布 tile_height = img_height // 2 tile_width = img_width // 2 tiles = [] # 按行、列顺序切分 for row in range(2): for col in range(2): # 计算当前分片的坐标范围,兼容原图尺寸不能被2整除的边缘场景 y1 = row * tile_height y2 = (row + 1) * tile_height if row != 1 else img_height x1 = col * tile_width x2 = (col + 1) * tile_width if col != 1 else img_width # 切片获取分片,注意第一个维度对应高度方向(y轴),第二个对应宽度方向(x轴) current_tile = oriImg[y1:y2, x1:x2] tiles.append(current_tile) # 调用示例:通过索引取出第0个分片(左上块)显示 cv2.imshow("tile 0", tiles[0]) cv2.waitKey(0) cv2.destroyAllWindows()
代码说明:最终tiles列表长度为4,索引0-3分别对应左上、右上、左下、右下四个分片,可直接通过tiles[索引]的方式获取对应分片开展后续处理。如果需要调整切分方式(比如横向切为4个长条),只需要修改行列循环数和分片尺寸计算逻辑即可。
内容的提问来源于stack exchange,提问作者user18386987
相关产品推荐
相关产品推荐

