Как преобразовать три трехмерных массива в матрицу RGB в Python - PullRequest
0 голосов
/ 03 декабря 2018

Я даже не уверен, возможно ли это, но я довольно плохо знаком с Python.

У меня есть три набора 3D-данных, каждый из которых представляет собой массив размером 64 x 64 x 50.Я пытаюсь объединить каждый набор 3D-данных в одно 3D-изображение RGB, где каждая ячейка представлена ​​значением RGB, а каждый цветовой канал представляет значения для одного набора данных.

Например, мои данные представляют собой три различных изотопа, измеренных в породе, поэтому я хотел бы, чтобы R представлял значения для кислорода-16, G = серы-32 и B = магния-24.

Я выяснил, как нормализовать каждый массив изотопов к дискретизированному значению в диапазоне 0-255 с помощью следующего обобщенного уравнения:

new_arr = ((arr - arr.min()) * (1/(arr.max() - arr.min()) * 255).astype('uint8')

Более конкретно для моих данных у меня есть следующее:

O16R = ((O16.get_data() - np.min(O16.get_data())) * (1/(np.max(O16.get_data()) - np.min(O16.get_data())) * 255).astype('uint8'))

S32G = ((S32.get_data() - np.min(S32.get_data())) * (1/(np.max(S32.get_data()) - np.min(S32.get_data())) * 255).astype('uint8'))

Mg24B = ((Mg24.get_data() - np.min(Mg24.get_data())) * (1/(np.max(Mg24.get_data()) - np.min(Mg24.get_data())) * 255).astype('uint8'))

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

Для упрощенного примера, если бы у меня были небольшие массивы 2 x 1:

O16R = (151, 3)

S32G = (2 , 57)

Mg24B = (0, 111)

Тогда мне нужна результирующая вложенная матрица RGB со значениями:

RGB = ( [151,2,0] , [3,57,111] )

Я считаю, что мне нужно создать цикл for, но я не смог понять это.Это то, что я имею до сих пор, но это не анализирует данные.

RGB = np.zeros(shape=(64,64,50)) 
for i in RGB:
    RGB = ([O16R, S32G, Mg24B])

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 04 декабря 2018

IIUC, для вашего минимального примера вы можете сделать одно из следующих действий:

# setup:
O16R = (151, 3)
S32G = (2 , 57)
Mg24B = (0, 111)

# using zip:
RGB = np.array(list(zip(O16R, S32G, Mg24B)))
# or just transposing the array:
RGB = np.array([O16R, S32G, Mg24B]).T

Оба возвращают:

>>> RGB
array([[151,   2,   0],
       [  3,  57, 111]])
...