Python中np.hsplit正常运行但np.vsplit报数组均等分割失败错误
np.vsplit拆分图像等分错误问题解决
错误翻译
你收到的英文错误array split does not result in an equal division中文含义为:数组拆分无法得到大小相等的子数组
触发原因
numpy拆分函数要求拆分维度的总长度必须可以被拆分份数整除,否则就会抛出该错误,两个拆分函数对应的维度如下:
np.hsplit(arr, n):沿**水平维度(数组第1位arr.shape[1],对应图像宽度)**拆分,要求arr.shape[1] % n == 0np.vsplit(arr, n):沿**垂直维度(数组第0位arr.shape[0],对应图像高度)**拆分,要求arr.shape[0] % n == 0
场景问题排查
你表述原图尺寸为6×10(日常图像尺寸表述为宽×高),对应numpy数组格式应为(高, 宽)即(10,6)(灰度图)或(10,6,3)(彩色图):
- 第一步
np.hsplit(img,6)运行正常符合预期:img.shape[1] = 6,6可以被6整除,拆分后每列的shape为(10,1)或(10,1,3) - 第二步报错说明你实际加载的每列数据的垂直维度长度不是10的倍数,大概率是你对原图尺寸的表述和实际加载后的numpy数组维度不符,或是原图加载时存在额外填充、通道维度偏差。
解决方案
方案1:动态适配拆分份数(推荐)
先打印维度确认,再用实际维度长度作为拆分份数,保证可整除:
def splitBoxes(img): # 调试用:打印原图维度确认 print("原图shape:", img.shape) cols= np.hsplit(img,6) for c in cols: # 调试用:打印当前列的维度,确认垂直维度长度 print("当前列shape:", c.shape) # 直接用当前列的垂直维度长度作为拆分份数 rows = np.vsplit(c, c.shape[0]) cv2.imshow('COL', c) cv2.waitKey(0)
方案2:固定尺寸预处理
如果必须拆分得到10行,可先对原图做resize,保证垂直维度长度符合要求:
def splitBoxes(img): # 把原图统一调整为宽6、高10的尺寸,确保拆分符合预期 img = cv2.resize(img, (6,10)) cols= np.hsplit(img,6) for c in cols: rows = np.vsplit(c,10) cv2.imshow('COL', c) cv2.waitKey(0)
内容的提问来源于stack exchange,提问作者AHM Rayhanuzzaman Roky
相关产品推荐
相关产品推荐

