调用local_binary_pattern报错:参数需为2D数组的问题求助
问题解决:ValueError: The parameter
image must be a 2-dimensional array 核心问题分析
你遇到的错误本质是图片读取失败,导致传入skimage.feature.local_binary_pattern的是无效的空数组(形状为()),而非符合要求的2D灰度图像。
错误的直接原因是cv2.imread的参数使用错误:你传入了cv2.COLOR_BGR2GRAY作为读取模式,但这个常量是用于颜色空间转换的(配合cv2.cvtColor使用),而非读取灰度图的模式。正确的灰度图读取模式应该是cv2.IMREAD_GRAYSCALE。
修复步骤
1. 修正图片读取代码
将错误的读取语句:
img = cv2.imread(img_path, cv2.COLOR_BGR2GRAY)
替换为:
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
2. 添加读取失败校验
为了避免后续处理无效图片,建议在读取后添加校验逻辑,跳过无法读取的文件:
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) if img is None: print(f"无法读取图片,已跳过: {img_path}") continue
3. 验证图片有效性
可以在读取后打印图片形状,确认是否为2D数组:
print(f"图片 {img_path} 形状: {img.shape}")
修正后的关键代码片段
for file in FILES: path = os.path.join(DIRECTORY, file) for img_name in os.listdir(path): # 重命名变量避免与读取后的img混淆 img_path = os.path.join(path, img_name) label = FILES.index(file) # 修正灰度图读取模式 img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 校验读取是否成功 if img is None: print(f"跳过无效图片: {img_path}") continue data.append([img, label])
额外补充
- 如果你的图片路径包含中文或特殊字符,
cv2.imread可能读取失败,此时可以改用PIL库读取:from PIL import Image img = Image.open(img_path).convert('L') # 'L'表示灰度模式 img = np.array(img) cv2.COLOR_BGR2GRAY的正确用法是配合cv2.cvtColor,将彩色图转为灰度图:color_img = cv2.imread(img_path) gray_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2GRAY)
内容的提问来源于stack exchange,提问作者Bn.
相关产品推荐
相关产品推荐

