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



我想将几个具有32位像素深度的TIFF文件转换为8位像素深度TIFFs,同时保留元数据和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)
>>> (4, 3, 10, 11)

然而,像素分辨率(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

但是如何将这些标签传递给tifffile.imwrite

复制resolutionresolutionunit属性,并将图像阵列的轴顺序添加到imagej_metadatadict:

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,
)

最新更新