Как я могу преобразовать массив изображений в 2D-массив в Python - PullRequest
1 голос
/ 22 марта 2019

У меня есть массив изображений в этой форме:

(50000, 32, 32, 3)
  • 50000 - это количество изображений
  • 32, 32 - это высота и ширина
  • 3 - значения RGB с диапазоном 0-1

Я хотел бы преобразовать его в 2D-форму:

(50000, 1024)

Здесь ябудет 50000 изображений, представленных в одной строке, значение RGB будет преобразовано в, скажем, шестнадцатеричное значение, я прошел через многие процессы преобразования в переполнение стека, и я нашел некоторые.Я знаю, что если бы мой массив был 3D-массивом с уже преобразованным значением, я мог бы легко использовать функцию reshape(), чтобы преобразовать его в 2D.Теперь то, что я ищу, это самый простой способ преобразовать значения RGB и изменить форму моего массива

Возможно ли это в одну или две строки или мне следует использовать внешнюю функцию?

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

Сначала преобразуйте значения RGB в последнем измерении в значение HEX, используя любую функцию, которая вам нравится.Этот SO ответ может помочь.

Изменение формы затем работает с любым числом измерений:

import numpy as np

def rgb2hex(r, g, b):
    return '#%02x%02x%02x' % (r, g, b)

vfunc = np.vectorize(rgb2hex)

a = (np.random.uniform(0,1,(10,5,5,3))*255).astype(int)

c = vfunc(a[:,:,:,0], a[:,:,:,1], a[:,:,:,2])

c.reshape((10,25))
1 голос
/ 22 марта 2019

Чтобы сделать это, вам сначала нужно изменить форму ndarray (np.reshape):

a = np.random.randint(1,10,(500, 32, 32, 3))
a_r = np.reshape(a, (500, 1024, 3))
print(a_r.shape)
# (500, 1024, 3)

Теперь, чтобы преобразовать значения RGB по последнему измерению в шестнадцатеричное представление, как вы предлагаете, вы можете определить функцию, которая возвращает шестнадцатеричное представление трех значений с простым форматированием строки:

def rgb_to_hex(x):
    return '#{:02X}{:02X}{:02X}'.format(*rgb.reshape(3))

Чтобы применить преобразование ко всем строкам на последней оси, вы можете использовать np.apply_along_axis:

a_new = np.apply_along_axis(rgb2hex, axis=-1, arr=a_r).shape
print(a_new.shape)
# (500, 1024)
1 голос
/ 22 марта 2019

Следующее объединяет значения RGB в одно значение

x=np.zeros((100,32,32,3))
x[:,:,:,0] = np.trunc(x[:,:,:,0]) + np.trunc(x[:,:,:,1] *256) + np.trunc(x[:,:,:,2] *65535)
y=x[:,:,:,0]
print(y.shape)

Полученная форма y: (100, 32, 32)

Далее вы можете использовать функцию изменения формы для y.

...