作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
mhd和raw是什么?
MHD(MetaImage)和RAW(Raw Image Data)是用于医学图像处理和分析的常见文件格式之一。
-
MHD (MetaImage) 文件格式:
- 描述:MHD 文件是一种元数据文件,用于描述与医学图像相关的数据。通常与 RAW 格式文件一起使用,MHD 文件包含有关图像数据的元信息,如图像尺寸、像素类型、数据间隔等。
- 特点:MHD 文件不存储图像本身的像素数据,而是提供关于数据的描述信息。
- 元信息:MHD 文件通常包含有关图像的描述信息,例如像素类型(如无符号字节型、有符号字节型、无符号短整型、有符号短整型等)、像素尺寸(如宽度、高度、深度)、数据间隔(指数据在内存中的存储方式)等。
- 扩展名:通常的 MHD 文件扩展名为 .mhd。
-
RAW (Raw Image Data) 文件格式:
- 描述:RAW 文件是包含原始像素数据的文件格式,通常不包含任何元信息或者包含极少的元信息。
- 特点:RAW 文件通常存储医学图像的原始像素数据,这些数据未经过处理或解码。
- 像素数据:RAW 文件包含图像的原始像素数据,通常以二进制形式存储。这些数据可能是未经过任何压缩或编码的原始数据。
- 用途:通常需要与 MHD 文件一起使用,通过 MHD 文件提供的元信息,可以解释 RAW 文件中的原始像素数据。
- 扩展名:RAW 文件可以使用各种扩展名,如 .raw、.bin、.dat 等。
在医学图像处理中,通常使用 MHD 文件来描述图像的属性和结构,而使用 RAW 文件来存储图像的原始像素数据。这种结合使得图像处理软件能够准确解释图像数据,并进行进一步的处理、分析或可视化。
Matlab代码
% 写入Mhd和Raw文件
function writeMhdAndRaw(filename, data, element_spacing, data_type)
% 创建mhd和raw
mhd = strcat(filename, '.mhd');
raw = strcat(filename, '.raw');
% 写入mhd文件
fid = fopen(mhd, 'w');
assert(fid > 0, 'Open MHD File Error.');
% 类型
fprintf(fid, 'ObjectType = Image\n');
% 维度
fprintf(fid, 'NDims = %d\n', ndims(data));
% 不同维度的尺寸和元素间距
dims = ndims(data);
if(dims == 2)fprintf(fid, 'DimSize = %d %d \n', size(data,1), size(data,2));fprintf(fid, 'ElementSpacing = %1.4f %1.4f\n', element_spacing(1), element_spacing(2));
elseif(dims == 3)fprintf(fid, 'DimSize = %d %d %d\n', size(data,1), size(data,2), size(data,3));fprintf(fid, 'ElementSpacing = %1.4f %1.4f %1.4f\n', element_spacing(1), element_spacing(2), element_spacing(3));
elseif(dims == 4)fprintf(fid, 'DimSize = %d %d %d %d\n', size(data,1), size(data,2), size(data,3), size(data,4));fprintf(fid, 'ElementSpacing = %1.4f %1.4f %1.4f %1.4f\n', element_spacing(1), element_spacing(2), element_spacing(3), element_spacing(4));
end
% 数据类型
if(strcmp(data_type,'char') || strcmp(data_type,'uint8'))fprintf(fid, 'ElementType = MET_UCHAR\n');
elseif(strcmp(data_type,'short'))fprintf(fid, 'ElementType = MET_SHORT\n');
elseif(strcmp(data_type,'float32'))fprintf(fid, 'ElementType = MET_FLOAT\n');
end
% 元素字节顺序
% MSB(又名big-endian)排序在SPARC和摩托罗拉处理器(例如Macintoshes)中很常见。
% LSB(又名little-endian)排序在英特尔处理器(例如PC兼容机)中很常见。
fprintf(fid, 'ElementByteOrderMSB = False\n');
% 设置raw文件
fprintf(fid, 'ElementDataFile = %s\n', raw);
% 关闭mhd
fclose(fid);
% 写入raw文件
fid = fopen(raw, 'w');
assert(fid > 0, 'Open RAW File Error.');
% 写入数据
fwrite(fid, data, data_type);
% 关闭raw
fclose(fid);
end
测试代码
测试功能就是将test.mat中的图像矩阵A1,保存为mhd和raw格式,并用ImageJ软件加载测试。
% 加载mat文件
load('test.mat');
filename = 'test';
image_data = int16(A1);
element_spacing = [1, 1];
data_type = 'short';
% 调用函数
writeMhdAndRaw(filename, image_data, element_spacing, data_type);
测试数据地址:
链接:https://pan.baidu.com/s/1xkR1lfDrCYoGYsfBXRDMIA
提取码:p0s6
测试效果
源数据:
ImageJ加载保存的mhd文件:
ImageJ中宽高对应matlab中的行列,所以显示效果是转置的。因为我刚开始用ImageJ,也可能是我没配置好,如果有问题烦请指出。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!