使用 tifffile 添加自定义 extratags

Adding custom extratags with tifffile

我正在尝试编写一个脚本来简化我在实验室的日常生活。我操作一台 ThermoFisher / FEI 扫描电子显微镜,我将所有图片保存为 TIFF 格式。

显微镜软件正在添加包含所有显微镜/图像参数的广泛自定义 TiffTag(代码 34682)。

在我的脚本中,我想打开一个图像,执行一些操作,然后将数据保存在一个新文件中,包括原始的 FEI 元数据。为此,我想使用 tifffile 模块的 python 脚本。

我可以打开图像文件并毫无问题地执行所需的操作。从输入文件中检索 FEI 元数据也工作正常。

我正在考虑使用 imwrite 函数保存输出文件并使用 extratags 可选参数将原始 FEI 元数据传输到输出文件。

这是 tifffile 文档的摘录,内容涉及额外标签:

   extratags : sequence of tuples
       Additional tags as [(code, dtype, count, value, writeonce)].
       code : int
           The TIFF tag Id.
       dtype : int or str
           Data type of items in 'value'. One of TIFF.DATATYPES.
       count : int
           Number of data values. Not used for string or bytes values.
       value : sequence
           'Count' values compatible with 'dtype'.
           Bytes must contain count values of dtype packed as binary data.
       writeonce : bool
           If True, the tag is written to the first page of a series only.

这是我的代码片段。

my_extratags = [(input_tags['FEI_HELIOS'].code,
 input_tags['FEI_HELIOS'].dtype, 
 input_tags['FEI_HELIOS'].count,
 input_tags['FEI_HELIOS'].value, True)]

tifffile.imwrite('output.tif', data, extratags = my_extratags)

此代码无效,并抱怨额外标记的值应为 ASCII 7 位编码。这对我来说已经很奇怪了,因为我没有触及元数据,我只是将它复制到输出文件。

如果我将元数据标签值转换为如下字符串:

my_extratags = [(input_tags['FEI_HELIOS'].code,
 input_tags['FEI_HELIOS'].dtype, 
 input_tags['FEI_HELIOS'].count,
 str(input_tags['FEI_HELIOS'].value), True)]

tifffile.imwrite('output.tif', data, extratags = my_extratags)

代码正在运行,图像已保存,对应于 'FEI_HELIOS' 的元数据已创建,但它是空的!

你能帮我找出我做错了什么吗? 我不需要使用 tifffile,但我更愿意使用 python 而不是 ImageJ,因为我已经有其他几个 python 脚本并且我想将这个新脚本与其他脚本集成。

提前致谢!

多多

ps。我是 Whosebug 的常客,但这实际上是我的第一个问题!

原则上该方法是正确的。但是,tifffile 将某些标签(包括 FEI_HELIOS)的原始值解析为字典或其他 Python 类型。要获得用于重写的原始标记值,需要再次从文件中读取它。在这些情况下,使用内部 TiffTag._astuple 函数来获取标签的 extratag 兼容元组,例如:

import tifffile

with tifffile.TiffFile('FEI_SEM.tif') as tif:
    assert tif.is_fei
    page = tif.pages[0]
    image = page.asarray()
    ...  # process image
    with tifffile.TiffWriter('copy1.tif') as out:
        out.write(
            image,
            photometric=page.photometric,
            compression=page.compression,
            planarconfig=page.planarconfig,
            rowsperstrip=page.rowsperstrip,
            resolution=(
                page.tags['XResolution'].value,
                page.tags['YResolution'].value,
                page.tags['ResolutionUnit'].value,
            ),
            extratags=[page.tags['FEI_HELIOS']._astuple()],
        )

此方法不保留 tifffile 无法写入的 Exif 元数据。

另一种方法,由于 FEI 文件似乎是未压缩的,因此直接将文件中的图像数据内存映射到一个 numpy 数组并操作该数组:

import shutil
import tifffile

shutil.copyfile('FEI_SEM.tif', 'copy2.tif')

image = tifffile.memmap('copy2.tif')
...  # process image
image.flush()

最后,考虑 tifftools 重写 tifffile 当前失败的 TIFF 文件,例如Exif 元数据。