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