Применение оттенков серого CV2 к массиву Numpy 4D

Хотя я знаю, как преобразовать одноцветное изображение (32,32,3) в оттенки серого, используя CV2:

img = cv2.cvtColor( img, cv2.COLOR_RGB2GRAY )

Мне нужно преобразовать пакет из 60 000 изображений в массив 4D numpy (60000,32,32,3), как я могу этого добиться?


person Anurag H    schedule 09.05.2018    source источник


Ответы (2)


Допустим, ваш четырехмерный массив изображений называется img_stack с формой (60000,32,32,3).

Вы можете сделать:

gray_stack = np.empty_like(img_stack[...,0])
for i in range(img_stack.shape[0]):
    gray_stack[i] = cv2.cvtColor(img_stack[i], cv2.COLOR_RGB2GRAY)

Результирующая форма (60000,32,32).

Или вы можете сделать:

gray_stack = np.empty_like(img_stack[...,:1])
for i in range(img_stack.shape[0]):
    gray_stack[i,:,:,0] = cv2.cvtColor(img_stack[i], cv2.COLOR_RGB2GRAY)

Результирующая форма (60000,32,32,1).


Бонусное решение Tensorflow:

gray_stack = tf.image.rgb_to_grayscale(img_stack, name=None)

Результирующая форма будет (60000,32,32,1).

Вышеупомянутые решения OpenCV могут работать быстрее.

person Andriy Makukha    schedule 21.07.2018

Еще один вариант использования numpy:

grayscale_imgs = np.dot(img_stack, [0.299 , 0.587, 0.114])
grayscale_imgs.shape # => (60000, 32, 32)

Подробнее о взвешенной сумме можно узнать здесь

person Aray Karjauv    schedule 24.10.2020