通常,当您想在 Python 中读取或写入任何位深度和格式的图像时,最好使用ImageIO。顾名思义,它的单一目标是输入/输出图像。唯一警告:它可能会忽略图像的元数据。也就是说:它可能无法正确处理定义颜色空间而非标准 sRGB 的图像,或者它可能无法保持图像的预期方向。
你会读到图片,比如example.tif,就像这样:
import imageio
image = imageio.imread('example.tif')
至于转换,这只是基本的数学运算。您将在其中接收像素数据的数据结构是 NumPy 数组。内省image.shape 和image.dtype。您应该期望您的图像具有(y, x, 3) 中的shape,其中y 是垂直方向的像素数,x 是水平方向的像素数,3 代表三个颜色通道:红色、绿色, 蓝色的。它的dtype(数据类型)应该是uint16,意思是无符号的16位整数。
旁注:由于有三个颜色通道,每个通道都以 16 位分辨率进行采样,因此图像的颜色深度通常被描述为“48 位”(每像素)。
16 位整数的范围在 0 到 65535 (= 216−1) 之间。它们需要被强制为 8 位范围:0 到 255 (= 28-1)。所以除以 256(= 28):
image = image / 256
这将产生一个浮点像素值数组。它的数据类型必须显式转换为 8 位整数才能删除任何分数。
image = image.astype('uint8')
同样,更有效地,您还可以bit-shift 右侧 8 位的 16 位值:
image = (image >> 8).astype('uint8')
这使得转换速度更快(现代硬件的两倍左右),因为它跳过了浮点运算。
然后,要么使用最终的image 数组进行进一步处理,要么将其保存到新文件中:
imageio.imwrite('example.png', image)