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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:05:38