首页 > 解决方案 > 使用 OpenCV 将图像列表转换为灰度

问题描述

我有一个包含 32x32 RGB 图像的腌制训练数据集。作为预处理步骤,我想将它们转换为灰度。我在训练数据集中读到 -

import pickle
import cv2

training_file = "../data/train.p"

with open(training_file, mode='rb') as f:
    train = pickle.load(f)

X_train, y_train = train['features'], train['labels']

然后,我尝试使用for以下代码使用循环将每个图像转换为灰度 -

for i in range(0,len(X_train)-1): 
    X_train[i] = cv2.cvtColor(X_train[i], cv2.COLOR_BGR2GRAY) 

但这会引发以下错误 -

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-a920a94faefc> in <module>()
      1 for i in range(0,len(X_train)-1):
----> 2     X_train[i] = cv2.cvtColor(X_train[i], cv2.COLOR_BGR2GRAY)

ValueError: could not broadcast input array from shape (32,32) into shape (32,32,3)

但是,如果我只使用单个图像重复此过程,我不会收到任何错误。我做了以下 - 将单个图像转换为灰度

有人可以解释错误的原因以及如何将整个列表转换为灰度吗?

标签: pythonopencvmatplotlib

解决方案


您的问题来自这样一个事实,即您试图将带有 shape 的灰度图像存储在一个存储带有 shape(32, 32)的 RGB 图像的数组中(32, 32, 3)

X_train_grayscale = np.zeros(X_train.shape[:-1])
for i in range(X_train.shape[0]): 
    X_train_grayscale[i] = cv2.cvtColor(X_train[i], cv2.COLOR_BGR2GRAY) 

这将创建一个名为的新数组X_train_grayscale,该数组将包含转换后的灰度图像。

(当然,您需要在import numpy as npPython 脚本的顶部使用通常的代码才能使其正常工作。)


推荐阅读