2015-03-18 2 views
1

У меня есть серия изображений TIFF для загрузки в Python.Загрузить изображение TIFF как массив numpy

Сначала я использую:

im=Image.open(*) 

Он загружает и отображает должным образом.

>>> im 
PIL.TiffImagePlugin.TiffImageFile image mode=I;16 size=1408x1044 at 0x116154050 
>>> type(im) 
instance 
>>> im.size 
(1408, 1044) 

Затем я использую:

imarray=numpy.array(im) 

где

>>> imarray.shape 
() 
>>> imarray.size 
1 
>>> type(imarray) 
numpy.ndarray 
>>> imarray 
array(PIL.TiffImagePlugin.TiffImageFile image mode=I;16 size=1408x1044 at 0x116154050, dtype=object) 

Я прочитал this previous post и следовали инструкциям, но я не могу получить imarray.shape и im.size, чтобы соответствовать.

+2

Это может иметь отношение к вашей версии PIL. Вы пробовали предлагаемые решения [здесь] (http://stackoverflow.com/q/15284601/190597)? – unutbu

+0

Если вы планируете делать ** любой тип манипуляции с изображениями, я бы предложил использовать OpenCV. Они имеют привязки Python и делают вашу жизнь намного проще, включая автоматическое преобразование изображений в массивы numpy. – KronoS

+0

@KronoS OpenCV * массивный * overkill для простого ввода изображений. [Pillow] (https://pillow.readthedocs.org/) или даже [matplotlib] (http://stackoverflow.com/a/15293007/1461210) предлагают гораздо более легкие решения. –

ответ

0

Это решение, которое копирует данные в массив numpy.

from PIL import Image 
    import numpy as np 
    import ubelt as ub 

    # Grab some test data 
    fpath = ub.grabdata('http://www.topcoder.com/contest/problem/UrbanMapper3D/JAX_Tile_043_DTM.tif') 

    # Open the tiff image 
    pil_img = Image.open(fpath) 

    # Map PIL mode to numpy dtype (note this may need to be extended) 
    dtype = {'F': np.float32, 'L': np.uint8}[pil_img.mode] 

    # Load the data into a flat numpy array and reshape 
    np_img = np.array(pil_img.getdata(), dtype=dtype) 
    w, h = pil_img.size 
    np_img.shape = (h, w, np_img.size // (w * h)) 
Смежные вопросы