python - 使用 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)
但是,如果我只使用单个图像重复此过程,我不会收到任何错误。我做了以下 -
有人可以解释错误的原因以及如何将整个列表转换为灰度吗?
解决方案
您的问题来自这样一个事实,即您试图将带有 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 np
Python 脚本的顶部使用通常的代码才能使其正常工作。)
推荐阅读
- python - 将 Pandas 标头转换为字符串类型
- python - 如何过滤字符串列表中的关键字?
- python - AttributeError:“NoneType”对象没有属性“nrows”
- django - 尝试使用导出为 csv 时,我只得到 id
- angular - http post Observable / subscribe 中的角度路由
- gcc - 无法识别的选项 --gc-keep-exported on arm ld
- git - 在 Windows 10 和 WSL2 之间共享 Git 和 SSH 配置
- python - 在 python 中升级 pip 时出现以下错误
- android - Android 11 - ROOT:挂载 /system 失败,在 /proc/system 中找不到
- python-3.x - 如何在熊猫数据框中为每周列设置日期时间类型索引