代码之家  ›  专栏  ›  技术社区  ›  NoDataDumpNoContribution

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

  •  2
  • NoDataDumpNoContribution  · 技术社区  · 7 年前

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

    我想创建tif文件,其中包含来自Matlab的5D数据,可以由ImageJ作为有效的5D HyperStack读取。

    我可以在Matlab中使用 imwrite(matrix, file, 'WriteMode','append') 但ImageJ将仅将其读取为3D(XYZ)图像堆栈。不包含有关通道、切片和帧的信息。

    我想我可以查看ImageJ源代码,找出它们存储这些缺失信息的位置,然后使用Matlab的LibTIFF包装器重新创建ImageJ的元信息。然而,如果你已经知道该做什么,或者有其他选择,我很乐意听听。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Kouichi C. Nakamura    6 年前

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

    问题是人们(或者只有一个人?)创建ImageJ MATLAB在创建从MATLAB到ImageJ的路径方面做得很好,但他们似乎没有费心优化行为。ImageJ MATLAB的 IJM.show('name') 有很多隐藏的或未记录的限制(我大量改变了 the documentation ,所以现在应该更清楚了)。最后,我编写了一个包装器函数

    ijmshow

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

    示例MATLAB代码

    你可以用4行来完成。

    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年5月7日增加

    copytoImagePlus 提供比 ijmshow公司 (您可以使用相同的语法),因为 copytoImagePlus 不依赖于 IJM 基本工作区中的变量。

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

    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 创建图像J2 ImgPlus 对象。

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

        2
  •  2
  •   ctrueden    7 年前

    ImageJ使用TIFF的第一个IFD的ImageDescription标记来存储其元信息。以下是有丝分裂样本数据集的示例(文件>打开样本>有丝分裂):

    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的 Tiff 类可能为您提供足够细粒度的控制,以便将自定义ImageDescription写入第一个IFD;我不确定。

    可能更容易使用 Bio-Formats 图书馆的 bfsave.m function 编写OME-TIFF,可以是5维;ImageJ可以通过 Bio-Formats plugin . 我建议使用 Fiji ImageJ的发行版,预装了Bio格式。

    还有 this same question posted on MATLAB Central .

        3
  •  1
  •   NoDataDumpNoContribution    7 年前

    使用Matlab的 Tiff class .

    我可以组装一个ImageDescription标记,我认为它看起来很好,ImageJ可以读取它( 文件(>);打开 )作为5D Hyperstack,但数据部分损坏。似乎存在偏移问题(我可以用Matlab再次很好地读取数据)。

    但是,如果使用 文件(>);导入(>);Bio格式 如果在“生物格式导入”对话框中标记了带有Hyperstack的视图堆栈,则它在ImageJ中变为5D(XYCZT)堆栈。幸亏 ctrueden 感谢他有益的评论。

    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
    

    看来,生物格式是唯一完全铺就和可用的出口方式>2D数据从Matlab传输到ImageJ,尽管在没有太多可用元数据且需要传输的情况下,此解决方案可能是一种轻量级的替代方案。

    推荐文章