Преобразование между объектом Pillow Image и размерным массивом изменяет размерность

Я использую 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)

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

3 ответа

Решение

Я, может быть, столбец-майор, в то время как массивы в NumPy являются мажор

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

вероятно, следует проверить in_data с matplotlib"s imshow чтобы убедиться, что картинка выглядит правильно.

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

Если ваше изображение серого цвета, сделайте:

in_data = in_data.T

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

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

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

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

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

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

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

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

Другие вопросы по тегам