牛津仪器集团的一部分狗万正网地址
扩大

Imaris文件格式描述(IMS)

Imaris文件格式设计用于快速可视化非常大的图像。为此,它不仅存储原始图像数据,还存储原始数据的低分辨率版本。这允许可视化软件在低分辨率数据足够时只加载低分辨率数据。此外,为了实现快速可视化,Imaris文件格式将图像数据存储在连续的3D块中(用于3D块的hdf术语),这允许可视化软件只加载在视场中的那些数据。多分辨率结构和块式存储布局是这种高性能文件格式的基础。

总结

该文件格式基于标准HDF5(分级数据格式5),由伊利诺伊大学香槟分校的国家超级计算应用中心开发。万博电脑网页版登录这允许使用广泛可用的HDF5库和工具。

Imaris 5.5文件包含三种主要类型的映像组(或文件夹):

另外一个组可能包含Imaris场景:

在本文档中,术语组、属性和数据集指的是HDF5文档中给出的概念。只要给出一个路径(/DataSet/ResolutionLevel 12),就应该打开相应的组和子组。

先前的“imarisclassic”和“Imaris3”文件格式不是基于HDF5规范的,在本文档中不进行描述。

工具和资源

Bitplane使用HDF Group中的HDF5库作为后端来读写HDF5文件。阅读关于HDF5文件格式的一个很好的起点是HDF5组的网站,http://www.hdfgroup.org/HDF5/。HDF集团提供的图书馆是开源的,并且是免费的。建议使用这个库,而不是创建自己的HDF5阅读器/写入器。

HDF组在提供库的同时还提供了有用的工具。值得注意的是HDFView,一个基于java的HDF文件检查器。它可以在这里免费下载。

强烈建议使用HDFView查看一些示例IMS文件,以便理解文件格式。

结构

Imaris 5.5文件结构由一个根“文件夹”和三个主要组组成:DataSet、DataSetInfo和Thumbnail。

HDFView中IMS文件的右侧截图显示了HDF文件的结构。示例图像有两个通道和3个分辨率级别。

DataSet文件夹包含实际的图像数据。DataSetInfo文件夹包含描述性参数。缩略图文件夹包含图像的2D缩略图。

路径 属性 价值 描述
/ ImarisDataSet ImarisDataSet 特定的格式
FormatVersion 发送的 格式版本
/ DataSetInfo 包含数据集信息
/缩略图 包含缩略图数据

数据集

Imaris 5.5数据集具有以下结构。一个数据集由一个或多个3D图像组成(对于二维图像,一个维度的大小等于1)。当一个数据集有多个通道或多个时间点时,它存储每个通道和每个时间点的3D图像。数据集使用块保存在文件中(参见HDF5文档),可以选择使用GNU GZIP进行压缩。为了获得良好的读取性能,数据块必须存储在Imaris软件为实现可视化而请求的大小中(参见下面的Imaris数据锁一章)。

HDF5块机制意味着数据集的有效大小可以大于原始3D图像的大小。因此,属性ImageSizeZ, ImageSizeY和ImageSizeX也与每个数据集一起保存。

数据集的类型需要与要存储的数据类型相似。下表中列出了有效的类型。

HDF5数据类型 Imaris Image数据类型
H5T_NATIVE_UCHAR 8位无符号整数(char)
H5T_NATIVE_USHORT 16位无符号整数(短)
H5T_NATIVE_UINT32 32位无符号整数
H5T_NATIVE_FLOAT 32位浮点数

数据集的创建属性应该是分块的、存储分配时间是增量的、填充值为零、压缩为零或GZIP。如果激活了GZIP压缩,则可以使用任何有效的GZIP参数(即压缩0到9是可接受的,3是首选)。

随着每个3D图像,相应的直方图也被保存(见下表)。直方图是一个HDF5 1D数据集,类型为64位无符号整数。它的长度可以使用HDF5库读取。第一个值对应于图像中值HistogramMin的计数。最后一个值是图像中HistogramMax的计数。

路径 属性 描述
/DataSet/ResolutionLevel 0/TimePoint 0/Channel 0 分辨率0、时间点0和通道0的信息
ImageSizeX = 285 分辨率级别0的像素大小为X
ImageSizeY = 218 Y的大小以像素为单位
ImageSizeZ = 64 Z的大小以像素为单位
ImageBlockSizeX = 64 像素为X的图像块大小用于分辨率级别0(仅alpha版本)-已弃用
ImageBlockSizeY = 256 像素为Y的图像块大小(仅alpha版本)-已弃用
ImageBlockSizeZ = 64 像素为Z的图像块大小(仅alpha版本)-已弃用
HistogramMin = 0 与此图像对应的直方图的最小值
HistogramMax = 255 直方图的最大值
/数据集/分辨率级别0/时间点0/通道0/数据 图像,大小ImageSizeX*ImageSizeY*ImageSizeZ
/数据集/分辨率级别0/时间点0/通道0/直方图 图像的直方图。第一个bin对应histogramin,最后一个bin对应HistogramMax
/DataSet/ResolutionLevel 0/TimePoint 0/Channel 1 关于分辨率0、时间点0和通道1的信息
/数据/ ResolutionLevel 0 0 /通道0 /数据的计算 分辨率0,时间点0,通道0的图像数据
/DataSet/ResolutionLevel 0/TimePoint 0/Channel 0/直方图 分辨率0,时间点0,通道0的图像直方图

例子:

mFileId = H5Fopen(mFileName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);hid_t vDataSetId = H5Gopen(mFileId, " DataSet ");hid_t vLevelId = H5Gopen(vDataSetId, "分辨率级别为0 ");hid_t vTimePointId = H5Gopen(vLevelId, "TimePoint 0");hid_t vChannelId = H5Gopen(vTimePointId, "Channel 0");hid_t vDataId = H5Dopen(vChannelId, " Data ");//读取属性ImageSizeX,Y,Z hsize_t vFileDim[3] = {ImageSizeZ, ImageSizeY, ImageSizeX};hid_t vFileSpaceId = H5Screate_simple(3, vFileDim, NULL);char* vBuffer = new vBuffer[ImageSizeZ*ImageSizeY*ImageSizeX];H5Dread(vDataId, H5T_NATIVE_CHAR, H5S_ALL, vFileSpaceId, H5P_DEFAULT, vBuffer);

在上面的例子中,读取分辨率0、时间点0和通道0对应的整个3D图像。使用HDF5库也可以只读取图像的一部分,以满足内存或其他要求

DataSetInfo

DataSetInfo组包含来自Imaris的所有图像参数。section存储为HDF5组,参数存储为HDF5属性。Hdf5属性可以使用H5Aopen_name打开,并使用H5Aread读取。所有属性都存储为类型字符串,即数字必须转换为字符串。属性的HDF5类型是一个H5T_C_S1 (C String)的数组。

在下面,术语“LSM”被用作“激光扫描显微镜”的缩写。

小组/组别名称 属性/参数名称 描述
ImarisDataSet 该部分保存有关文件中数据组织的信息。(总是)
创造者=伊万里瓷器
NumberOfImages = 1 目前,每个文件只有一个多通道时间图像
版本= 5.5 创建此文件的Imaris版本
伊万里瓷器 关于缩略图和Imaris的信息。(总是)
文件名= retina.ims 原始文件的名称
ManufactorString =通用Imaris 3.x Manufactor信息
ManufactorType = LSM Manufactor类型信息
ThumbnailMode = thumbnailMIP 缩略图的数据表示的类型。取值为“thumbnailNone”、“thumbnailMiddleSection”、“thumbnailMIP”或“thumbnailNone”。
版本= 5.5 创建此文件的Imaris版本
图像 关于数据集的信息。(总是)
描述=核 以纯文本形式对图像的详细描述(可以是多行)
ExtMax0 = 46.7464 最大的数据。扩展X(给定单位:um, nm,…)
ExtMax1 = 35.7182 最大的数据。扩展Y
ExtMax2 = 12.6 最大的数据。扩展Z
ExtMin0 = -10.3 数据来源X
ExtMin1 = -1.5 数据来源Y
ExtMin2 = 3.4 数据来源Z
LensPower x = 63 反褶积参数
Name = m1193.pic 图像的简短描述(一些字符)
Noc = 2 数量的渠道
RecordingDate = 1991-10-01 16:45:45 “YYYY-MM-DD HH: MM: SS”
单位=嗯 "m ", "mm ", "um "或"nm "
X = 285 图像大小X(以体素为单位)
Y = 218 图像大小Y(以体素为单位)
Z = 64 图像大小Z(体素单位)
X频道 关于通道X的信息(每个通道有一个部分)(始终存在)
颜色= 1 0 0 基本颜色(r,g,b浮动值从0.0到1.0)
ColorMode = BaseColor " BaseColor ", " TableColor "颜色表模式见下面的例子。
ColorOpacity = 0.168 体渲染显示通道的不透明度(从0.0到1.0的浮动值)
ColorRange = 0 194.921 显示“对比”
描述= Cy5 通道的详细描述
获得= 0 反褶积参数
LSMEmissionWavelength = 发射波长
LSMExcitationWavelength = 激发波长
LSMPhotons = 反褶积参数
LSMPinhole = 针孔直径
Max = 255 通道图像的数据最大值
MicroscopeMode = 反褶积参数
最小值= 0 通道图像的数据最小值
名称:CollagenIV (TxRed) 通道的简短描述(一些字符)
NumericalAperture = 数值孔径
抵消= 0 反褶积参数
针孔= 0 反褶积参数
RefractionIndexEmbedding = 反褶积参数
RefractionIndexImmersion = 反褶积参数
TimeInfo 所有通道的时间信息。(总是)
DataSetTimePoints = 1 数据集中时间点的数量
FileTimePoints = 1 文件中的时间点数量(当前与DataSetTimePoints相同)
TimePoint1 = 1991-10-01 16:45:45.000 时间点1。时间必须在时间点之间严格递增。
日志 关于图像历史的任何信息(特别是数据操作)。
条目= 3 条目数(图像数据修改数)。可以是零。
Entry0 = 第一次修改
Entry1 = 第二次修改
Entry2 = 第三次修改

注意,根据原始文件格式(奥林巴斯,蔡司等),可以使用任何其他组/部分

读取通道3的LSMEmissionWavelength

mFileId = H5Fopen(mFileName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);//打开DataSetInfo组hid_t vDataSetInfoId = H5Gopen(mFileId, " DataSetInfo ");//打开channel 3组hid_t vChannel3Id = H5Gopen(vDataSetInfoId, " channel 3 ");//打开属性LSMEmissionWavelength hid_t vAttributeId = H5Aopen_name(vChannelId, " LSMEmissionWavelength ");//获取数据空间hid_t vattributeespaceid = H5Aget_space(vAttributeId);//获取属性值大小hsize_t vAttributeSize = 0;H5Sget_simple_extent_dims (vAttributeSpaceId &vAttributeSize, NULL);// create buffer char* vBuffer = new char[(bpSize)vAttributeSize+1];vBuffer [vAttributeSize] = ' \ 0 ';//读取属性值H5Aread(vAttributeId, H5T_C_S1, vBuffer);

缩略图

缩略图目录包含一个2D正方形RGBA图像,大小任意(典型值为128x128或256x256)。大小为W的缩略图的图像数据应该使用大小为W x W x 4的无符号字符缓冲区读取(与H5Dread)。HDF5数据集的大小是W行W x 4列。每个图像像素存储为4个HDF5值,顺序为红、绿、蓝和Alpha组件。

例子

//打开缩略图内容为H5Gopen的组(mFileId, " thumbnail ");//获取数据集hid_t vThumbnailDataId = H5Dopen(vThumbnailId, "Data");//获取数据空间hid_t vThumbnailSpaceId = H5Dget_space(vThumbnailDataId);//获取数据的大小hsize_t vThumbnailDims[2];H5Sget_simple_extent_dims (vThumbnailSpaceId vThumbnailDims, NULL);char* vBuffer = new char[(bpSize)(vThumbnailDims[0] * vThumbnailDims[1])];//读取缩略图数据H5Dread(vThumbnailDataId, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, vBuffer);// create image vThumbnail = new image(vThumbnailDim[1]/4, vThumbnailDim[0]);for所有缩略图像素{vThumbnail[vPixel]。红色= vBuffer [vIndex];vThumbnail [vPixel]。Green = vBuffer[vIndex+1]; vThumbnail[vPixel].Blue = vBuffer[vIndex+2]; vThumbnail[vPixel].Alpha = vBuffer[vIndex+3];

数据

多分辨率结构和块式存储布局是这种高性能文件格式的基础。

块大小

为了实现可视化的高效数据访问,Imaris 5.5文件格式将图像数据存储在3D块中。典型的块大小是128x128x64或256x256x16。最佳块大小是由图像的几何形状决定的,要指定规则来精确复制Imaris将写入hdf文件的块大小并不容易。这也是没有必要的,因为只要布局不是完全不同,hdf库在读取数据时非常高效。如果您想写图像文件供Imaris读取,请尝试创建大约1mb大小的3D块。这将在Imaris中产生良好的渲染效果。如果您需要调整性能,请联系Bitplane工程团队以获得更详细的信息。

分辨率水平

为了实现高效的可视化,Imaris 5.5文件格式不仅存储原始数据,还存储原始数据的低分辨率版本。文件中分辨率级别的数量由以下伪代码决定:

void getMultiResolutionPyramidalSizes(const size_t[3] aDataSize, std::vector& aResolutionSizes) {const float mMinVolumeSizeMB = 1.f;aResolutionSizes.clear ();vNewResolution = aDataSize;浮动vVolumeMB;做{vResolutionSizes.push_back (vNewResolution);vLastResolution = vNewResolution;vLastVolume = vLastResolution[0] * vLastResolution[1] * vLastResolution[2];For (int d = 0;d < N;++d) {if ((10*vLastResolution[d]) * (10*vLastResolution[d]) > vLastVolume / vLastResolution[d]) vNewResolution[d] = vLastResolution[d] / 2; else vNewResolution[d] = vLastResolution[d]; // make sure we don't have zero-size dimension vNewResolution[d] = std::max((size_t)1, vNewResolution[d]); } vVolumeMB = vNewResolution[0] * vNewResolution[1] * vNewResolution[2]) / (1024.f * 1024.f); } while (vVolumeMB > mMinVolumeSizeMB); }