Подтвердить что ты не робот

Преобразование объекта Pillow Image и измерения размера массива numpy

Я использую Pillow и numpy, но имею проблему с преобразованием между объектом Pillow Image и массивом numpy.

когда я выполняю следующий код, результат выглядит странно.

im = Image.open(os.path.join(self.img_path, ifname))
print im.size
in_data = np.asarray(im, dtype=np.uint8)
print in_data.shape

результат

(1024, 768)
(768, 1024)

Почему изменяется размер?

4b9b3361

Ответ 1

im может быть столбцом, в то время как массивы в numpy являются строковыми

do in_data = in_data.T для переноса массива python

возможно, необходимо проверить in_data с помощью matplotlib imshow, чтобы убедиться, что изображение выглядит правильно.

Но знаете ли вы, что matplotlib поставляется с собственными функциями загрузки, которые дают вам массивы numpy напрямую? См.: http://matplotlib.org/users/image_tutorial.html

Ответ 2

Если ваше изображение выполнено в оттенках серого:

in_data = in_data.T

но если вы работаете с изображениями rbg, вы хотите убедиться, что операция транспонирования выполняется только по двум осям:

in_data = np.transpose(in_data, (1,0,2))

Ответ 3

на самом деле это потому, что большинство библиотек изображений предоставляют вам изображения, которые преобразуются по сравнению с массивами numpy. это (я думаю), потому что вы пишете файлы изображений по строкам, поэтому первый индекс (скажем, x) относится к номеру строки (поэтому x - вертикальная ось) и второй индекс (y) относится к последующему пикселю в строке (поэтому y является горизонтальной осью), что противоречит нашему повседневному пониманию координат.

Если вы хотите правильно его обработать, вам необходимо запомнить:

image = library.LoadImage(path)
array = (library.FromImageToNumpyArray(image)).T

и, следовательно,

image = library.FromNumpyArrayToImage(array.T)
library.WriteImage(image, path)

Что также работает для 3D-изображений. Но я не обещаю, что это так для ВСЕХ библиотек изображений - именно с этими я работал.