我的系统是 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... 可能不是巧合。
如果我假装通过 PIL 更改像素并恢复为 TIFF 图像(只需将数组作为图像放回):
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?
我正在寻找一种在 Python 中处理这些 TIFF 图像的“轻量级”方式。我很惊讶它是如此困难,这让我相信这个问题对其他人来说是显而易见的。