Python中如何将数组存入二维数组?OpenCV图像切片存储报错求助
问题解决:OpenCV切割图像存入5x5数组的索引错误
错误提示翻译
索引错误:数组的索引过多:数组是一维的,但使用了两个索引
错误原因
你初始化slices的方式完全错误:np.array([5,5])生成的是形状为(2,)的一维数组,只能用单个索引访问,根本无法存储25个图像切片(每个切片是二维/三维数组)。
解决方案
方法1:用嵌套列表填充(灵活易实现)
先创建5x5的空列表容器,填充切片后再转为numpy数组:
import cv2 as cv import numpy as np board = cv.imread("King Domino dataset/Cropped and perspective corrected boards/1.jpg", 1) # 修正尺寸变量:shape[0]是图像高度,shape[1]是宽度 tileDimH = int(board.shape[0] / 5) tileDimW = int(board.shape[1] / 5) # 初始化5x5的空列表 slices = [[None for _ in range(5)] for _ in range(5)] for h in range(5): for w in range(5): # 裁剪区域:高度范围在前,宽度范围在后 current_slice = board[h*tileDimH : (h+1)*tileDimH, w*tileDimW : (w+1)*tileDimW] slices[h][w] = current_slice # 转为numpy数组,最终形状为(5,5,tileDimH,tileDimW,3)(彩色图) slices = np.array(slices)
方法2:预分配numpy数组(性能更优)
提前根据切片形状创建numpy数组,直接填充:
import cv2 as cv import numpy as np board = cv.imread("King Domino dataset/Cropped and perspective corrected boards/1.jpg", 1) tileDimH = int(board.shape[0] / 5) tileDimW = int(board.shape[1] / 5) # 获取图像通道数,彩色图为3,灰度图为1 channels = board.shape[2] if len(board.shape) == 3 else 1 # 预分配对应形状的数组,dtype和原图像保持一致 slices = np.zeros((5, 5, tileDimH, tileDimW, channels), dtype=board.dtype) for h in range(5): for w in range(5): slices[h, w] = board[h*tileDimH : (h+1)*tileDimH, w*tileDimW : (w+1)*tileDimW]
额外注意事项
- 不要用
slice作为变量名,它是Python内置函数,会覆盖原有功能,改用current_slice这类命名。 - 图像裁剪时,索引顺序是高度范围在前,宽度范围在后,和你原代码里的变量对应关系要匹配,避免裁剪出错误区域。
内容的提问来源于stack exchange,提问作者Djauvel
相关产品推荐
相关产品推荐

