问题描述
我正在python中使用tifffile
来保存3通道tiff堆栈,然后将其读取到ImageJ或FIJI中.这些tiff堆栈在ImageJ中作为复合打开,每个通道分配了一个(大概是默认的)颜色表/LUT.但是,分配的颜色不是我的图像有意义的颜色. 我的问题是,使用tifffile
保存图像时,我不知道如何为每个通道指定颜色图.
I'm using tifffile
in python to save out 3-channel tiff stacks, which I then want to read into ImageJ or FIJI. These tiff stacks open as composites in ImageJ with each channel assigned a (presumably default) colormap/LUT. However, the colors that are assigned aren't the colors that make sense for my images. My problem is that I can't figure out how to specify the colormap for each channel when saving the image using tifffile
.
例如,我要分配以下颜色图:
For example, I'd like to have the following colormap assignments:
- ch 0:灰色
- ch 1:绿色
- ch 2:红色
这是我用来保存文件的代码:
Here's the code that I'm using to save the files:
# 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中手动编辑颜色分配,然后将其保存,关闭它,然后当我再次打开该文件时,它会保留我的手动颜色图作业.因此,我猜测必须有一个元数据标签(也许是颜色图?)可用于指定通道颜色,但是我找不到有关要使用的标签或语法的任何信息.
There must be metadata that's saved with the tiff that holds the channel colormap info because I can manually edit the color assignment in ImageJ and then save it, close it, and then when I open the file up again it retains my manual colormap assignments. So I'm guessing there must be a metadata tag (maybe colormap?) that can be used to specify channel colors, but I can't find any info on what tag or syntax to use.
推荐答案
自行创建私有的IJMetadata
(50839)和IJMetadataByteCounts
(50838)TIFF标记,并将它们作为Extratag传递给tifffile.imsave. IJMetadata包含二进制格式的应用程序内部元数据.颜色信息在luts
元数据中:
Create the private IJMetadata
(50839) and IJMetadataByteCounts
(50838) TIFF tags on your own and pass them to tifffile.imsave as extratags. IJMetadata contains application internal metadata in a binary format. The color information is in the luts
metadata:
import struct
import numpy
import tifffile
def imagej_metadata_tags(metadata, byteorder):
"""Return IJMetadata and IJMetadataByteCounts tags from metadata dict.
The tags can be passed to the TiffWriter.save function as extratags.
"""
header = [{'>': b'IJIJ', '<': b'JIJI'}[byteorder]]
bytecounts = [0]
body = []
def writestring(data, byteorder):
return data.encode('utf-16' + {'>': 'be', '<': 'le'}[byteorder])
def writedoubles(data, byteorder):
return struct.pack(byteorder+('d' * len(data)), *data)
def writebytes(data, byteorder):
return data.tobytes()
metadata_types = (
('Info', b'info', 1, writestring),
('Labels', b'labl', None, writestring),
('Ranges', b'rang', 1, writedoubles),
('LUTs', b'luts', None, writebytes),
('Plot', b'plot', 1, writebytes),
('ROI', b'roi ', 1, writebytes),
('Overlays', b'over', None, writebytes))
for key, mtype, count, func in metadata_types:
if key not in metadata:
continue
if byteorder == '<':
mtype = mtype[::-1]
values = metadata[key]
if count is None:
count = len(values)
else:
values = [values]
header.append(mtype + struct.pack(byteorder+'I', count))
for value in values:
data = func(value, byteorder)
body.append(data)
bytecounts.append(len(data))
body = b''.join(body)
header = b''.join(header)
data = header + body
bytecounts[0] = len(header)
bytecounts = struct.pack(byteorder+('I' * len(bytecounts)), *bytecounts)
return ((50839, 'B', len(data), data, True),
(50838, 'I', len(bytecounts)//4, bytecounts, True))
filename = 'FluorescentCells.tif'
image = tifffile.imread(filename)
grays = numpy.tile(numpy.arange(256, dtype='uint8'), (3, 1))
red = numpy.zeros((3, 256), dtype='uint8')
red[0] = numpy.arange(256, dtype='uint8')
green = numpy.zeros((3, 256), dtype='uint8')
green[1] = numpy.arange(256, dtype='uint8')
ijtags = imagej_metadata_tags({'LUTs': [grays, green, red]}, '>')
tifffile.imsave('test_ijmetadata.tif', image, byteorder='>', imagej=True,
metadata={'mode': 'composite'}, extratags=ijtags)
这篇关于保存TIFF堆栈时如何指定颜色图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!