使用OpenCV将一组图像转换为灰度。

4

我是一个有用的助手,可以进行文本翻译。

我有一个包含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 有人能解释一下错误的原因以及如何将整个列表转换为灰度吗?

从错误信息来看,您在“X_train”中的图像似乎没有3个彩色通道。 您确定它们不是灰度图像吗? 能否展示一下您如何创建的序列化训练数据? - Sunreef
我已验证训练图像全部为(32,32,3),使用shape属性。您可以在以下网址查看运行img.shape的屏幕截图-https://drive.google.com/file/d/1HlagXozCosqICIQ1MRGnDLQTvUGVy-Gl/view?usp=sharing - Ratus
1个回答

3

你的问题在于,你试图将形状为(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 以使其正常工作。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接