首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Matlab生成有效的HyperStack ImageJ数据文件?

如何从Matlab生成有效的HyperStack ImageJ数据文件?
EN

Stack Overflow用户
提问于 2017-11-22 15:42:03
回答 3查看 2.1K关注 0票数 2

ImageJ HyperStacks具有一个数据类型(8-32位)、一个宽度、一个高度、多个通道、多个切片和多个帧。它们代表5D (XYCZT)数据集。ImageJ将它们存储为多页tiff文件,其中存储通道数、切片数、帧数、2D (XY)图像。第一个映像似乎有两个ID为50838和50839的自定义标记。

我想要创建包含5D数据的tif文件,这些数据可以被ImageJ作为一个有效的5D HyperStack读取。

我可以使用imwrite(matrix, file, 'WriteMode','append')在Matlab中将多个2D图像存储在一个多页tiff文件中,但是ImageJ只会将其读取为3D (XYZ)图像堆栈。有关通道、切片和帧的信息不包含。

我想我可以查看ImageJ源代码,找出它们将丢失的信息存储在哪里,然后使用Matlab的LibTIFF包装器重新创建ImageJ的元信息。但是,如果你已经知道该做什么,或者有其他选择,我想听听。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-28 12:30:16

使用Matlab的Tiff类

我可以组装一个我认为很好的ImageDescription标记,ImageJ将它(File>Open)读取为一个5D的超级堆栈,但是数据部分损坏了。似乎存在偏移问题(我可以用Matlab再次很好地读取数据)。

但是,如果使用file > import >Bio-Format读取tiff文件,则在ImageJ中,如果在Bio-Format导入对话框中标记了带有超级堆栈的视图堆栈,则成为5D (XYCZT)堆栈。感谢切特瑞登的有益评论。

代码语言:javascript
复制
d = ones(100, 200, 10, 2, 3, 'single') * 3.765;
hyperstack_write('test.tif', d);

function hyperstack_write(file, hyperstack)
% Writes an (up to) 5D stack into a (XYCZT) HyperStack Tiff file
% readable by ImageJ
%
% hyperstack must have class single

% simple checks
assert(nargin == 2, 'Not enough arguments');
assert(isa(hyperstack, 'single'), 'hyperstack must be single');

% get all five dimensions
d = zeros(5, 1);
for i = 1 : 5
    d(i) = size(hyperstack, i);
end

% assemble image description
s = sprintf('ImageJ=1.51\nnimages=%d\nchannels=%d\nslices=%d\nframes=%d\nhyperstack=true\nmode=color\nloop=false\nmin=%.1f\nmax=%.1f\n', prod(d(3:5)), d(3), d(4), d(5), floor(min(hyperstack(:))*10)/10, ceil(max(hyperstack(:))*10)/10);

% open tif file for writing and set file tags
t = Tiff(file, 'w');

ts.ImageLength = d(1);
ts.ImageWidth = d(2);
ts.Photometric = Tiff.Photometric.MinIsBlack;
ts.Compression = Tiff.Compression.None;
ts.BitsPerSample = 32;
ts.SamplesPerPixel = 1;
ts.SampleFormat = Tiff.SampleFormat.IEEEFP;
ts.RowsPerStrip = 5;
ts.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky;
ts.Software = 'MATLAB';
ts.ImageDescription = s;

% loop over dimensions 3, 4, and 5
for k = 1 : d(5)
    for j = 1 : d(4)
        for i = 1 : d(3)
            frame = hyperstack(:, :, i, j, k);
            t.setTag(ts)            
            t.write(frame);
            t.writeDirectory();
        end
    end
end

% close tif file
t.close();

end

似乎Bio格式是将>2D数据从Matlab导出到ImageJ的唯一完全铺就和可用的方式,尽管在没有多少元数据可用和需要传输的情况下,这种解决方案可能是一个轻量级的替代方案。

票数 1
EN

Stack Overflow用户

发布于 2018-05-03 20:18:07

我还认为是唯一的方法。但后来我意识到斐济的ImageJ允许你把MATLAB的数据传递给ImageJ。然后,您可以通过ImageJ保存图像,这样ImageJ就可以确定地打开它。

问题是人们(或者只有一个人?)在创建一条从MATLAB到ImageJ的路径方面做得很好,但他们似乎并没有改变这种行为。ImageJ的IJM.show('name')有许多隐藏的或无文档的限制(我大规模地改变了文献资料,所以现在应该更清楚了)。最后,我讨论了一个包装函数。

ijmshow

https://github.com/kouichi-c-nakamura/ijmshow

示例MATLAB代码

你可以用四行线来完成。

代码语言:javascript
复制
addpath '/Applications/Fiji.app/scripts' % depends your Fiji installation
ImageJ

imp = ijmshow(I,'YXCZT') % I is 5D array of uint8 or uint16
% the second argument determines which dimension represents what
% imp is a 5D hyperstack

ij.IJ.saveAsTiff(imp, 'image1.tif');

在保存之前,您可能需要设置每个频道的显示范围。

2018年7月5日增加

copytoImagePlus提供了比上面的ijmshow更好的解决方案(您可以使用相同的语法),因为copytoImagePlus不再依赖基本工作区中的IJM变量。

https://github.com/kouichi-c-nakamura/copytoImagePlus

代码语言:javascript
复制
addpath '/Applications/Fiji.app/scripts' % depends your Fiji installation
ImageJ

imp = copytoImagePlus(I,'YXCZT') % I is 5D array of uint8 or uint16
% the second argument determines which dimension represents what
% imp is a 5D hyperstack

ij.IJ.saveAsTiff(imp, 'image1.tif');

还请参阅copytoImgPlus,它将创建ImageJ2 ImgPlus对象。

https://github.com/fiji/fiji/blob/master/scripts/copytoImgPlus.m

票数 3
EN

Stack Overflow用户

发布于 2017-11-26 19:06:10

ImageJ使用TIFF的第一个IFD的ImageDescription标记来存储其元信息。下面是有丝分裂样本数据集中的一个示例(File > Open sample >有丝分裂):

代码语言:javascript
复制
ImageJ=1.51d
images=510
channels=2
slices=5
frames=51
hyperstack=true
mode=composite
unit=\u00B5m
finterval=0.14285714285714285
loop=false
min=1582.0
max=6440.0

MATLAB的蒂夫类可能为您提供足够细粒度的控件,以便将自定义ImageDescription写入第一个IFD;我不确定。

使用生物格式库的函数编写OME可能更容易一些,它可以是5维的;ImageJ可以通过生物格式插件读取这种格式。我建议使用斐济发行版的ImageJ,它附带的生物格式预装.

也有在MATLAB Central上发布的同样的问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47438678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档