Преобразование между объектом 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-изображений. Но я не обещаю, что это касается ВСЕХ библиотек изображений - только с этими я работал.