如何从 Matlab 生成有效的 HyperStack ImageJ 数据文件?
How to generate valid HyperStack ImageJ data files from Matlab?
ImageJ HyperStacks 具有数据类型(8-32 位)、宽度、高度、通道数、切片数和帧数。它们代表 5D (XYCZT) 数据集。 ImageJ 将它们存储为多页 tiff 文件,其中存储了通道数乘以切片数乘以帧数的 2D (XY) 图像。第一张图片似乎有两个自定义标签,ID 分别为 50838 和 50839。
我想创建包含来自 Matlab 的 5D 数据的 tif 文件,ImageJ 可以将其读取为有效的 5D HyperStack。
我可以使用 imwrite(matrix, file, 'WriteMode','append')
在 Matlab 中的多页 tiff 文件中存储许多 2D 图像,但 ImageJ 只会将其读取为 3D (XYZ) 图像堆栈。不包含通道、切片和帧的信息。
我想我可以查看 ImageJ 源以找出它们存储这些缺失信息的位置,然后使用 Matlab 的 LibTIFF 包装器重新创建 ImageJ 的元信息。但是,如果您已经知道该怎么做或者有其他选择,我想听听。
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 class 可能会为您提供足够细粒度的控制,以便将自定义 ImageDescription 写入第一个 IFD;我不确定。
可能更容易使用 ImageJ 的 Bio-Formats library's bfsave.m
function to write OME-TIFF, which can be 5-dimensional; ImageJ can read this format via the Bio-Formats plugin. I recommend using the Fiji 发行版,它预装了 Bio-Formats。
使用 Matlab 的 Tiff class。
我可以 assemble 我认为看起来不错的 ImageDescription 标签,并且 ImageJ 将其读取(File>Open)作为 5D Hyperstack,但数据部分损坏。似乎有偏移问题(我可以用Matlab再次读取数据)。
但是,如果使用 File>Import>Bio-Formats 读取 tiff 文件,如果在 Bio-格式导入对话框。感谢 的有益评论。
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-Formats 是将 >2D 数据从 Matlab 导出到 ImageJ 的唯一完全铺平和可用的方法,尽管在没有太多元数据可用且需要传输的情况下,此解决方案可能是一个轻量级的替代方案.
我也认为Bio-Fomats是唯一的方法。但后来我意识到斐济的 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
,它创建了 ImageJ2 ImgPlus
对象。
https://github.com/fiji/fiji/blob/master/scripts/copytoImgPlus.m
ImageJ HyperStacks 具有数据类型(8-32 位)、宽度、高度、通道数、切片数和帧数。它们代表 5D (XYCZT) 数据集。 ImageJ 将它们存储为多页 tiff 文件,其中存储了通道数乘以切片数乘以帧数的 2D (XY) 图像。第一张图片似乎有两个自定义标签,ID 分别为 50838 和 50839。
我想创建包含来自 Matlab 的 5D 数据的 tif 文件,ImageJ 可以将其读取为有效的 5D HyperStack。
我可以使用 imwrite(matrix, file, 'WriteMode','append')
在 Matlab 中的多页 tiff 文件中存储许多 2D 图像,但 ImageJ 只会将其读取为 3D (XYZ) 图像堆栈。不包含通道、切片和帧的信息。
我想我可以查看 ImageJ 源以找出它们存储这些缺失信息的位置,然后使用 Matlab 的 LibTIFF 包装器重新创建 ImageJ 的元信息。但是,如果您已经知道该怎么做或者有其他选择,我想听听。
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 class 可能会为您提供足够细粒度的控制,以便将自定义 ImageDescription 写入第一个 IFD;我不确定。
可能更容易使用 ImageJ 的 Bio-Formats library's bfsave.m
function to write OME-TIFF, which can be 5-dimensional; ImageJ can read this format via the Bio-Formats plugin. I recommend using the Fiji 发行版,它预装了 Bio-Formats。
使用 Matlab 的 Tiff class。
我可以 assemble 我认为看起来不错的 ImageDescription 标签,并且 ImageJ 将其读取(File>Open)作为 5D Hyperstack,但数据部分损坏。似乎有偏移问题(我可以用Matlab再次读取数据)。
但是,如果使用 File>Import>Bio-Formats 读取 tiff 文件,如果在 Bio-格式导入对话框。感谢
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-Formats 是将 >2D 数据从 Matlab 导出到 ImageJ 的唯一完全铺平和可用的方法,尽管在没有太多元数据可用且需要传输的情况下,此解决方案可能是一个轻量级的替代方案.
我也认为Bio-Fomats是唯一的方法。但后来我意识到斐济的 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
,它创建了 ImageJ2 ImgPlus
对象。
https://github.com/fiji/fiji/blob/master/scripts/copytoImgPlus.m