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

时间:2019-05-31 07:51:25

标签: python opencv matplotlib

我有一个腌制的训练数据集,包含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)

但是,如果仅使用一张图像重复此过程,则不会出现任何错误。我做了以下- convert single image to grayscale

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

1 个答案:

答案 0 :(得分:2)

您的问题来自以下事实:您试图将形状为(32, 32)的灰度图像存储在存储形状为(32, 32, 3)的RGB图像的数组中。

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的新数组,该数组将在转换后包含您的灰度图像。

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