将 32 位 TIFF 转换为 8 位 TIFF,同时保留 python 中的元数据和标签?

Otr*_*tri 5 python tiff imagej imagej-hyperstack

我想将多个具有 32 位像素深度的 TIFF 文件转换为 8 位像素深度 TIFF,同时保留元数据和 TIFF 标签

32 位 TIFF 是具有 TZYX 轴(即时间、z 深度、y 坐标、x 坐标)和 [0, 1] 范围内的值的四维 ImageJ 超级堆栈。

我可以转换为 8 位并复制元数据(使用在 ImageJ 中创建的非常小的示例图像):

import numpy as np
import tifffile

infile32 = "test.tif"

with tifffile.TiffFile(infile32) as tif:
    imagej_metadata = tif.imagej_metadata

a = tifffile.imread(infile32)
print(a.shape)

a = np.round(255 * a)
a = a.astype(np.uint8)

tifffile.imwrite("test_py-8bit.tif", a, imagej=True, metadata = imagej_metadata)
Run Code Online (Sandbox Code Playgroud)
>>> (4, 3, 10, 11)
Run Code Online (Sandbox Code Playgroud)

但是,像素分辨率(1 个像素有多少微米)错误,“z”轴 ( a.shape[1]) 被错误地识别为颜色通道,“时间”轴 (a.shape[0] ) 被错误地识别为 z。

如果我在 ImageJ 中手动执行此过程,则不会发生此问题,因此我怀疑 TIFF 标签是必要的。我想要一种编程方式来做到这一点,这样我就可以在包含数百个文件的集群上运行脚本。

查看tifffile的文档,我知道也可以提取标签:

with tifffile.TiffFile(infile32) as tif:
    for page in tif.pages:
        for tag in page.tags:
            tag_name, tag_value = tag.name, tag.value
Run Code Online (Sandbox Code Playgroud)

但我怎样才能将这些标签传递给 呢tifffile.imwrite

cgo*_*lke 5

复制resolutionresolutionunit属性并将图像数组的轴顺序添加到字典中imagej_metadata

import numpy
import tifffile

with tifffile.TiffFile('imagej_float32.tif') as tif:
    data = tif.asarray()
    imagej_metadata = tif.imagej_metadata
    imagej_metadata['axes'] = tif.series[0].axes
    resolution = tif.pages[0].resolution
    resolutionunit = tif.pages[0].resolutionunit

del imagej_metadata['hyperstack']
imagej_metadata['min'] = 0
imagej_metadata['max'] = 255

tifffile.imwrite(
    'imagej_uint8.tif',
    numpy.round(255 * data).astype(numpy.uint8),
    imagej=True,
    resolution=resolution,
    resolutionunit=resolutionunit,
    metadata=imagej_metadata,
)
Run Code Online (Sandbox Code Playgroud)