使用NumPy分割图像NDArray未达预期:分割后数组无法显示为图像的技术求助
解决图像分割后无法显示的问题
看起来你已经完成了像素打乱的步骤,但在分割和显示环节有几个小问题导致无法正常呈现分割后的图像。我来帮你梳理并修正代码:
你的代码里的核心问题:
- 未定义
rdmImg:你把oriImg重塑后打乱成shuImg,但没有将其还原为图像的三维形状(高度×宽度×通道数),rdmImg变量未赋值就直接使用会报错。 b数组未初始化:你直接用b[i]赋值,但b一开始没有被定义为列表或数组,会抛出索引错误。np.split使用与显示逻辑错误:np.split(arr1,4)默认沿第0轴(高度方向)分割,不需要循环重复分割;另外cv2.imshow只能接收单张图像数组,无法直接传入分割后的数组列表。
修正后的完整代码:
import numpy as np import cv2 # 假设oriImg是已读取的图像数组(例如通过cv2.imread获取) oriImg = cv2.imread("your_image_path.jpg") height, width, channels = oriImg.shape # 像素打乱步骤 shuImg = oriImg.reshape(height * width, channels) np.random.shuffle(shuImg) # 将打乱后的数组还原为图像形状才能显示 rdmImg = shuImg.reshape(height, width, channels) cv2.imshow("Image with shuffled pixels", rdmImg) cv2.waitKey(0) # 将图像分割为4部分(此处按高度方向分割,可修改axis参数切换为宽度方向) n = 4 # 沿高度轴(第0轴)分割为4个均等部分 split_parts = np.split(rdmImg, n, axis=0) # 打印每个分割数组的形状 for idx, part in enumerate(split_parts): print(f"Split part {idx+1} shape: {part.shape}") # 逐个显示分割后的图像 for idx, part in enumerate(split_parts): cv2.imshow(f"Splitted Image Part {idx+1}", part) cv2.waitKey(0) cv2.destroyAllWindows()
关键说明:
- 还原图像形状:打乱后的
shuImg是一维像素数组,必须通过reshape(height, width, channels)变回三维图像形状,才能被cv2.imshow识别显示。 - 正确获取分割结果:
np.split一次就能生成包含所有分割部分的数组列表,无需循环重复分割。 - 逐个显示分割图像:
split_parts是包含4个图像数组的列表,需要循环遍历每个元素,单独传入cv2.imshow才能正常显示。
如果想要按宽度方向分割,只需修改np.split的axis参数为1:
split_parts = np.split(rdmImg, n, axis=1)
这样所有分割后的部分都会以NumPy数组形式存储在内存中,既可以正常显示,也方便后续的处理操作。
内容的提问来源于stack exchange,提问作者user18386987
相关产品推荐
相关产品推荐

