I;16" 图像文件的 numpy.array

6 投票
3 回答
7256 浏览
提问于 2025-04-17 03:51

我想用TIFF格式的图片来有效地保存大量的测量数据。把它们设置为mode="I;16"(这对应我的16位数据范围),生成的文件大约是2MB(大约1000x1000个“像素”)。这还不错。

不过,在分析这些数据时,我在把它们重新转换成数组时遇到了麻烦。对于32位数据(用"I"表示),numpy.array命令可以正常工作。但如果是"I;16",结果却是一个0维的numpy数组,里面只有TIFF作为[0,0]的条目。

有没有办法让它正常工作?我真的不想使用32位的图片,因为我不需要那么大的范围,而且这会让硬盘空间翻倍(我计划有很多很多这样的测量...)

3 个回答

0

将一个(ImageJ格式的)TIFF图像转换成8位的numpy数组

im = numpy.array(Image.open('my.tiff'))
n = (im / numpy.amax(im) * 255).astype(numpy.uint8)
3

你可以使用GDAL和Numpy/Scipy来读取带有16位通道数据的栅格图像:

import gdal
tif = gdal.Open('path.tif')
arr = tif.ReadAsArray()
6

这个方法应该可以用(使用pillow/PIL的解决方案,对于16位图像来说比较慢,具体见下文)。

from PIL import Image
import numpy as np

data = np.random.randint(0,2**16-1,(1000,1000))
im = Image.fromarray(data)
im.save('test.tif')

im2 = Image.open('test.tif')
data2 = np.array(im2.getdata()).reshape(im2.size[::-1])

还有一个使用tifffile的解决方案,由C. Gohlke提供(速度非常快):

import tifffile

fp = r'path\to\image\image.tif'

with tifffile.TIFFfile(fp) as tif:
    data = tif.asarray()

撰写回答