Python 使用OpenCV将图像列表转换为灰度

Python 使用OpenCV将图像列表转换为灰度,python,opencv,matplotlib,Python,Opencv,Matplotlib,我有一个包含32x32 RGB图像的pickle训练数据集。作为预处理步骤,我想将它们转换为灰度。 我在培训数据集中读到: 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'] 然后

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

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)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
范围内的i为1(0,透镜(X_列)-1):
---->2 X_系列[i]=cv2.CVT颜色(X_系列[i],cv2.COLOR\u BGR2GRAY)
ValueError:无法将输入数组从形状(32,32)广播到形状(32,32,3)
然而,如果我只使用一个图像重复这个过程,我不会得到任何错误。我做了以下事情-


谁能解释一下错误的原因,以及我如何将整个列表转换成灰度

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

X\u train\u grayscale=np.zero(X\u train.shape[:-1])
对于范围内的i(X_列形状[0]):
X\U列\U灰度[i]=cv2.CVT颜色(X\U列[i],cv2.COLOR\U BGR2GRAY)
这将创建一个名为
X\u train\u grayscale
的新数组,该数组将包含转换后的灰度图像


(当然,您需要在Python脚本顶部使用通常的
import numpy as np
,以使其正常工作。)

从错误消息中,您在
X_train
中的图像似乎没有3个颜色通道。您确定它们不是灰度图像吗?您可以演示如何创建pickle训练数据吗?我已经使用
shape
属性验证了训练图像都是(32,32,3)。您可以在中看到running
img.shape的屏幕截图-