使用 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 元数据。
我正在尝试编写一个脚本来简化我在实验室的日常生活。我操作一台 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 元数据。