Преобразование списка изображений в оттенки серого с использованием OpenCV - PullRequest
2 голосов
/ 31 мая 2019

У меня есть маринованный учебный набор данных, содержащий изображения RGB 32x32. В качестве шага предварительной обработки я хочу преобразовать их в оттенки серого. Я прочитал в наборе данных обучения как -

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 Ответ

2 голосов
/ 31 мая 2019

Ваша проблема связана с тем, что вы пытаетесь сохранить изображения в градациях серого с формой (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, чтобы он работал.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...