Python PIL борется с несжатыми 16-битными изображениями TIFF

Моя система Mac OS X v10.8.2. У меня есть несколько 2560x500 несжатых 16-битных изображений в формате TIFF (оттенки серого, 16-битные целые числа без знака). Сначала я пытаюсь загрузить их, используя PIL (установлен через Homebrew, версия 1.7.8):

from PIL import Image
import numpy as np

filename = 'Rocks_2ptCal_750KHz_20ms_1ma_120KV_2013-03-06_20-02-12.tif'
img = Image.open(filename)

# >>> img
# <PIL.TiffImagePlugin.TiffImageFile image mode=I;16B size=2560x500 at 0x10A383C68>

img.show() 

# almost all pixels displayed as white.  Not correct.  
# MatLab, EZ-draw, even Mac Preview show correct images in grayscale.

imgdata = list(img.getdata()) 

# most values negative:
# >>> imgdata[0:10]
# [-26588, -24079, -27822, -26045, -27245, -25368, -26139, -28454, -30675, -28455]

imgarray = np.asarray(imgdata, dtype=np.uint16) 

# values now correct
# >>> imgarray
# array([38948, 41457, 37714, ..., 61922, 59565, 60035], dtype=uint16)

Отрицательные значения отключены на 65 536 ... вероятно, не случайно.

Если я притворяюсь, что изменяю пиксели и возвращаюсь к изображению TIFF через PIL (просто помещая массив обратно как изображение):

newimg = Image.fromarray(imgarray)

Я получаю ошибки:

File "/usr/local/lib/python2.7/site-packages/PIL/Image.py", line 1884, in fromarray
    raise TypeError("Cannot handle this data type")
TypeError: Cannot handle this data type

Я не могу найтиImage.fromarray() в документации PIL. Я пытался загрузить черезImage.fromstring(), но я не понимаю документацию PIL, и есть немного примеров.

Как показано в приведенном выше коде, PIL, похоже, «обнаруживает» данные какI;16B, Из того, что я могу сказать из документов PIL, режимI является:

*I* (32-bit signed integer pixels)

Очевидно, что это не правильно.

Я нахожу много сообщений на SX, предполагающих, что PIL не поддерживает 16-битные изображения. Я нашел предложения использовать pylibtiff, но я считаю, что это только Windows?

Я ищу "легкий" способ работы с этими изображениями TIFF в Python. Я удивлен, что это так сложно, и это заставляет меня полагать, что проблема будет очевидна для других.

Ответы на вопрос(2)

Ваш ответ на вопрос