Как изменить форму изображения numpy массив - PullRequest
0 голосов
/ 26 мая 2020

У меня есть изображение RGB с формой (640,480,3)

Мне нужна форма (3,640 * 480)

Я использую

picture.reshape(3,(picture.shape[0]*picture.shape[1]))

и он дает ожидаемую форму, но с неверными данными внутри. Мне нужен каждый канал в одной строке.

Как сделать?

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Проблема здесь в использовании функции изменения формы:

Документация:

np.reshape(array,shape)

, которая возвращает массив. Проблема с вашим кодом заключается в том, что вы неправильно перечислили элементы, что заставляет компьютер думать, что вы меняете форму числа 3 в форму (640 * 480).

Правильный код в этом сценарии:

picture = np.reshape(picture,(3,640*480))
0 голосов
/ 26 мая 2020

Изменение формы не меняет порядок данных. Попробуйте сначала сериализовать пространственные измерения, а затем транспонировать:

>>> by_channel = picture.reshape(-1, 3).transpose()  # or .T for short
>>> by_channel.shape  # Correct shape?
(3, 311040)
>>> np.all(by_channel[0] == picture[..., 0].ravel())  # Correct data?
True

Операция .transpose() является собственной инверсией, поэтому для ее обратного преобразования просто выполните:

>>> _picture = by_channel.T.reshape(picture.shape)
>>> np.all(_picture == picture)
True
...