我想把几个32位像素深度的TIFF文件转换成8位像素深度的TIFF while retaining metadata and TIFF tags.
32位TIFF是四维ImageJ超级堆栈,具有TZYX轴(即时间、z深度、y坐标、x坐标)和[0,1]范围内的值.
我可以转换为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]
)被错误地识别为 colored颜色 通道,而时间轴(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
呢?