it-roy-ru.com

numPy с Python: конвертировать 3D-массив в 2D

Скажем, у меня есть цветное изображение, и, естественно, это будет представлено в Python 3-мерным массивом, скажем, формы (n x m x 3) и назовите его img.

Я хочу, чтобы новый двумерный массив назвал его «narray», чтобы он имел форму (3, nxm), чтобы каждая строка этого массива содержала «сплющенную» версию каналов R, G и B. соответственно. Более того, он должен обладать тем свойством, что я могу легко восстановить любой исходный канал по чему-то вроде

narray[0,].reshape(img.shape[0:2])    #so this should reconstruct back the R channel.

Вопрос в том, как я могу построить «narray» из «img»? Простое img.reshape (3, -1) не работает, так как порядок элементов для меня нежелателен.

Спасибо

9
wudanao

Вам нужно использовать np.transpose , чтобы изменить размеры. Теперь n x m x 3 необходимо преобразовать в 3 x (n*m), поэтому отправьте последнюю ось вперед и сдвиньте вправо порядок остальных осей (0,1). Наконец, измените форму, чтобы получить 3 строк. Таким образом, реализация будет -

img.transpose(2,0,1).reshape(3,-1)

Пробный прогон -

In [16]: img
Out[16]: 
array([[[155,  33, 129],
        [161, 218,   6]],

       [[215, 142, 235],
        [143, 249, 164]],

       [[221,  71, 229],
        [ 56,  91, 120]],

       [[236,   4, 177],
        [171, 105,  40]]])

In [17]: img.transpose(2,0,1).reshape(3,-1)
Out[17]: 
array([[155, 161, 215, 143, 221,  56, 236, 171],
       [ 33, 218, 142, 249,  71,  91,   4, 105],
       [129,   6, 235, 164, 229, 120, 177,  40]])
13
Divakar

Если у вас установлен модуль scikit, то вы можете использовать rgb2grey (или rgb2gray), чтобы сделать фотографию от цветного до серого (от 3D до 2D) 

от Skimage import io, цвет

lina_color = io.imread (путь + изображение) lina_gray = color.rgb2gray (lina_color)

В [33]: lina_color.shape Out [33]: (1920, 1280, 3)

В [34]: lina_gray.shape Out [34]: (1920, 1280)

0
Harry

Допустим, у нас есть массив img размера m x n x 3 для преобразования в массив new_img размера 3 x (m*n)

new_img = img.reshape((img.shape[0]*img.shape[1]), img.shape[2])
new_img = new_img.transpose()
0
yashgarg1232