如何在保存tiff堆栈时指定colormap

时间:2018-05-09 16:41:32

标签: python tiff imagej fiji

我在python中使用tifffile来保存3通道tiff堆栈,然后我想读入ImageJ或FIJI。这些tiff堆栈在ImageJ中作为复合物打开,每个通道分配一个(可能是默认的)色彩映射/ LUT。但是,分配的颜色不是对我的图像有意义的颜色。 我的问题是,在使用tifffile保存图片时,我无法弄清楚如何为每个频道指定色彩映射。

例如,我想要进行以下色彩映射分配:

  • ch 0:灰色
  • ch 1:green
  • ch 2:red

这是我用来保存文件的代码:

# save hyperstack
with tifffile.TiffWriter(filename, bigtiff=False, imagej=True) as tif:
    for i in range(t_stack.shape[0]):
        tif.save(t_stack[i], metadata={'Composite mode': 'composite'})

必须有保存带有频道色彩图信息的tiff保存的元数据,因为我可以手动编辑ImageJ中的颜色分配然后保存,关闭它,然后当我再次打开文件时它会保留我的手动色彩映射分配。所以我猜测必须有一个元数据标签(可能是colormap?),可用于指定通道颜色,但我找不到任何关于使用什么标签或语法的信息。

2 个答案:

答案 0 :(得分:3)

您可以将许多关键字参数传递给tifffile的imsave函数。 它的文档记录不是很好,所以我发现最有用的是阅读TiffWriter类中 save 函数的文档字符串:

https://github.com/blink1073/tifffile/blob/master/tifffile/tifffile.py#L750

对于ImageJ元数据规范, TiffWriter.save 然后参考 imagej_metadata_tags ,您可以在其中查看可以存储在变量metadata_types中的数据类型(第7749行): / p>

https://github.com/blink1073/tifffile/blob/master/tifffile/tifffile.py#L7710

metadata_types = (
    ('Info', b'info', 1, _string),
    ('Labels', b'labl', None, _string),
    ('Ranges', b'rang', 1, _doubles),
    ('LUTs', b'luts', None, _ndarray),
    ('Plot', b'plot', 1, _bytes),
    ('ROI', b'roi ', 1, _bytes),
    ('Overlays', b'over', None, _bytes))

您可以创建LUT,以使用不同的颜色图可视化数据。 假设您的数据是uint8,则您需要的LUT的形状为(3,256) 3个颜色通道和256个强度值。因此,对于灰色,绿色和红色的LUT,您需要遵循以下原则:

import numpy as np
import tifffile

# Create a random test image
im_3frame = np.random.randint(0, 255, size=(3, 150, 250), dtype=np.uint8)
# Intensity value range
val_range = np.arange(256, dtype=np.uint8)
# Gray LUT
lut_gray = np.stack([val_range, val_range, val_range])
# Red LUT
lut_red = np.zeros((3, 256), dtype=np.uint8)
lut_red[0, :] = val_range
# Green LUT
lut_green = np.zeros((3, 256), dtype=np.uint8)
lut_green[1, :] = val_range
# Create ijmetadata kwarg
ijmeta = {'LUTs': [lut_gray, lut_red, lut_green]}
# Save image
tifffile.imsave(
    save_name,
    im_rgb,
    imagej=True,
    metadata={'mode': 'composite'},
    ijmetadata=ijmeta,
) 

答案 1 :(得分:2)

我最近遇到了这个问题,当时正在寻找一种解决方案,可以用ImageJ元数据保存tiff文件以及除灰色通道之外的3种以上颜色通道。上述解决方案非常有帮助,我将示例扩展到其他渠道。

在ImageJ中,基于RGB配色方案,您可以在复合模式下使用多达7个不同的颜色通道-红色,绿色和蓝色这三种原色,以及两种黄色,原色和青色的原色的混合,以及灰色通道。

要添加蓝色LUT,您只需为红色或绿色LUT定义一个ndarray(如上例所示),但将强度值从0到255分配给第三个数组,而将其他两个数组(红色和绿色)分配给充满零。

lut_blue = np.zeros((3, 256), dtype=np.uint8)
lut_blue[2, :] = val_range

通过“混合”红色和绿色的原色现在可以生成黄色的LUT。

lut_yellow= np.zeros((3, 256), dtype='uint8')
lut_yellow[[0,1],:] = np.arange(256, dtype='uint8')

下面给出的示例将生成具有7个通道的tiff文件。 TIFF堆栈中图像的颜色分配由以下方式定义:

ijmeta = {'LUTs': [lut_gray, lut_red, lut_green, lut_blue, lut_yellow, lut_magenta, lut_cyan]}

,可以根据需要进行调整。基于Jenny Folkesson的示例的完整代码如下:

import numpy as np
from tifffile import imread, imsave

# Create a random test image
im_3frame = np.random.randint(0, 255, size=(7, 150, 250), dtype=np.uint8)
# Intensity value range
val_range = np.arange(256, dtype=np.uint8)
# Gray LUT
lut_gray = np.stack([val_range, val_range, val_range])
# Red LUT
lut_red = np.zeros((3, 256), dtype=np.uint8)
lut_red[0, :] = val_range
# Green LUT
lut_green = np.zeros((3, 256), dtype=np.uint8)
lut_green[1, :] = val_range
# Blue LUT
lut_blue = np.zeros((3, 256), dtype=np.uint8)
lut_blue[2, :] = val_range
# Yellow LUT
lut_yellow= np.zeros((3, 256), dtype='uint8')
lut_yellow[[0,1],:] = np.arange(256, dtype='uint8')
# Magenta LUT
lut_magenta= np.zeros((3, 256), dtype='uint8')
lut_magenta[[0,2],:] = np.arange(256, dtype='uint8')
# Cyan LUT
lut_cyan= np.zeros((3, 256), dtype='uint8')
lut_cyan[[1,2],:] = np.arange(256, dtype='uint8')


# Create ijmetadata kwarg
ijmeta = {'LUTs': [lut_gray, lut_red, lut_green, lut_blue, lut_yellow, lut_magenta, lut_cyan]}
# Save image
imsave(
    'test.tif',
    im_3frame,
    imagej=True,
    metadata={'mode': 'composite'},
    ijmetadata=ijmeta,
)