]> Creatis software - CreaPhase.git/blob - utilities_LW/mha_read_header.m
Useful functions for simulations (created by LW, free to use)
[CreaPhase.git] / utilities_LW / mha_read_header.m
1 function info =mha_read_header(filename)
2 % Function for reading the header of a Insight Meta-Image (.mha,.mhd) file
3
4 % info  = mha_read_header(filename);
5 %
6 % examples:
7 % 1,  info=mha_read_header()
8 % 2,  info=mha_read_header('volume.mha');
9
10 if(exist('filename','var')==0)
11     [filename, pathname] = uigetfile('*.mha', 'Read mha-file');
12     filename = [pathname filename];
13 end
14
15 fid=fopen(filename,'rb');
16 if(fid<0)
17     fprintf('could not open file %s\n',filename);
18     return
19 end
20
21 info.Filename=filename;
22 info.Format='MHA';
23 info.CompressedData='false';
24 readelementdatafile=false;
25 while(~readelementdatafile)
26     str=fgetl(fid);
27     s=find(str=='=',1,'first');
28     if(~isempty(s))
29         type=str(1:s-1); 
30         data=str(s+1:end);
31         while(type(end)==' '); type=type(1:end-1); end
32         while(data(1)==' '); data=data(2:end); end
33     else
34         type=''; data=str;
35     end
36     
37     switch(lower(type))
38         case 'ndims'
39             info.NumberOfDimensions=sscanf(data, '%d')';
40         case 'dimsize'
41             info.Dimensions=sscanf(data, '%d')';
42         case 'elementspacing'
43             info.PixelDimensions=sscanf(data, '%lf')';
44         case 'elementsize'
45             info.ElementSize=sscanf(data, '%lf')';
46             if(~isfield(info,'PixelDimensions'))
47                 info.PixelDimensions=info.ElementSize;
48             end
49         case 'elementbyteordermsb'
50             info.ByteOrder=lower(data);
51         case 'anatomicalorientation'
52             info.AnatomicalOrientation=data;
53         case 'centerofrotation'
54             info.CenterOfRotation=sscanf(data, '%lf')';
55         case 'offset'
56             info.Offset=sscanf(data, '%lf')';
57         case 'binarydata'
58             info.BinaryData=lower(data);
59         case 'compresseddatasize'
60             info.CompressedDataSize=sscanf(data, '%d')';
61         case 'objecttype',
62             info.ObjectType=lower(data);
63         case 'transformmatrix'
64             info.TransformMatrix=sscanf(data, '%lf')';
65         case 'compresseddata';
66             info.CompressedData=lower(data);
67         case 'binarydatabyteordermsb'
68             info.ByteOrder=lower(data);
69         case 'elementdatafile'
70             info.DataFile=data;
71             readelementdatafile=true;
72         case 'elementtype'
73             info.DataType=lower(data(5:end));
74         case 'headersize'
75             val=sscanf(data, '%d')';
76             if(val(1)>0), info.HeaderSize=val(1); end
77         otherwise
78             info.(type)=data;
79     end
80 end
81
82 switch(info.DataType)
83     case 'char', info.BitDepth=8;
84     case 'uchar', info.BitDepth=8;
85     case 'short', info.BitDepth=16;
86     case 'ushort', info.BitDepth=16;
87     case 'int', info.BitDepth=32;
88     case 'uint', info.BitDepth=32;
89     case 'float', info.BitDepth=32;
90     case 'double', info.BitDepth=64;
91     otherwise, info.BitDepth=0;
92 end
93 if(~isfield(info,'HeaderSize'))
94     info.HeaderSize=ftell(fid);
95 end
96 fclose(fid);