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组包含来自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); }