Otr*_*tri 5 python tiff imagej imagej-hyperstack
我想将多个具有 32 位像素深度的 TIFF 文件转换为 8 位像素深度 TIFF,同时保留元数据和 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)
Run Code Online (Sandbox Code Playgroud)
>>> (4, 3, 10, 11)
Run Code Online (Sandbox Code Playgroud)
但是,像素分辨率(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
Run Code Online (Sandbox Code Playgroud)
但我怎样才能将这些标签传递给 呢tifffile.imwrite?
复制resolution和resolutionunit属性并将图像数组的轴顺序添加到字典中imagej_metadata:
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,
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |