scikit-image resize是否受图像位深度影响?如何解决数组形状报错?
问题解答
1. 错误原因确认
是的,这正是尺寸差异导致的错误。numpy数组要求所有元素的长度/形状完全一致,你的flat_data_arr中存在长度为202500的元素(与其他67500的元素不匹配),因此无法转换为均匀形状的numpy数组,触发了ValueError。
从位深度差异来看,24位对应RGB三通道(每个通道8位),展平后长度为150*150*3=67500;而8位的异常图像大概率是单通道灰度图,读入后为2D数组(形状为(H,W)),你的resize操作指定了(150,150,3),因通道处理逻辑问题导致最终展平长度异常,破坏了数组的均匀性。
2. 避免错误的替代方法
除手动删除异常图像外,可通过以下代码自动处理或过滤异常图像:
方法一:统一图像通道数
将单通道灰度图扩展为三通道RGB,多通道图像(如RGBA)裁剪为三通道,确保所有图像处理后都是3通道:
import os from skimage.transform import resize from skimage.io import imread import numpy as np flat_data_arr = [] path = "你的图像目录路径" for img in os.listdir(path): img_array = imread(os.path.join(path, img)) # 处理单通道灰度图,扩展为三通道 if len(img_array.shape) == 2: img_array = np.stack([img_array]*3, axis=-1) # 处理多通道图像(如RGBA),保留前3通道 elif img_array.shape[-1] > 3: img_array = img_array[..., :3] # 统一resize尺寸 img_resized = resize(img_array, (150, 150, 3)) flat_data_arr.append(img_resized.flatten()) flat_data = np.array(flat_data_arr)
方法二:过滤不符合要求的图像
直接跳过通道数不为3的图像,同时记录异常文件名方便后续排查:
import os from skimage.transform import resize from skimage.io import imread import numpy as np flat_data_arr = [] path = "你的图像目录路径" for img in os.listdir(path): img_array = imread(os.path.join(path, img)) # 仅保留三通道图像 if len(img_array.shape) != 3 or img_array.shape[-1] != 3: print(f"跳过异常图像: {img}") continue img_resized = resize(img_array, (150, 150, 3)) flat_data_arr.append(img_resized.flatten()) flat_data = np.array(flat_data_arr)
方法三:校验resize后的形状
在resize后检查图像形状,确保符合预期再加入数组:
import os from skimage.transform import resize from skimage.io import imread import numpy as np flat_data_arr = [] path = "你的图像目录路径" for img in os.listdir(path): img_array = imread(os.path.join(path, img)) img_resized = resize(img_array, (150, 150, 3)) # 校验形状是否符合要求 if img_resized.shape != (150, 150, 3): print(f"跳过形状异常的图像: {img}") continue flat_data_arr.append(img_resized.flatten()) flat_data = np.array(flat_data_arr)
内容的提问来源于stack exchange,提问作者Jason Li
相关产品推荐
相关产品推荐

