我有一个腌制的训练数据集,包含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)
但是,如果仅使用一张图像重复此过程,则不会出现任何错误。我做了以下-
有人可以解释错误的原因,以及如何将整个列表转换为灰度?
答案 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
才能使其正常工作。)