我想把几个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呢?

推荐答案

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

Python相关问答推荐

Polars LazyFrame在收集后未返回指定的模式顺序

如何检测背景有噪的图像中的正方形

如何使用数组的最小条目拆分数组

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

如何在solve()之后获得症状上的等式的值

ODE集成中如何终止solve_ivp的无限运行

avxspan与pandas period_range

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

如何在Polars中从列表中的所有 struct 中 Select 字段?

将输入聚合到统一词典中

为一个组的每个子组绘制,

当点击tkinter菜单而不是菜单选项时,如何执行命令?

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

Pandas:计算中间时间条目的总时间增量

OpenCV轮廓.很难找到给定图像的所需轮廓

python sklearn ValueError:使用序列设置数组元素

Gekko中基于时间的间隔约束

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

当lambda函数作为参数传递时,pyo3执行