changeset 10926:d84dda882a95 octave-forge

analyze75: new functions analyze75read and analyze75info from Adam H Aitkenhead <adamaitkenhead@hotmail.com> through mailing list
author carandraug
date Tue, 25 Sep 2012 12:41:30 +0000
parents dab2d9b2d7d8
children e108354f2e31
files main/image/INDEX main/image/NEWS main/image/inst/analyze75info.m main/image/inst/analyze75read.m
diffstat 4 files changed, 307 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/main/image/INDEX	Tue Sep 25 04:26:01 2012 +0000
+++ b/main/image/INDEX	Tue Sep 25 12:41:30 2012 +0000
@@ -82,6 +82,8 @@
  imtophat
  mmgradm
 Read/write
+ analyze75info
+ analyze75read
  bmpwrite
  readexif
  tiff_tag_read
--- a/main/image/NEWS	Tue Sep 25 04:26:01 2012 +0000
+++ b/main/image/NEWS	Tue Sep 25 12:41:30 2012 +0000
@@ -3,6 +3,8 @@
 
  ** The following functions are new:
 
+      analyze75info
+      analyze75read
       blockproc
       bwlabeln
       getrangefromclass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/image/inst/analyze75info.m	Tue Sep 25 12:41:30 2012 +0000
@@ -0,0 +1,195 @@
+%% Copyright (C) 2012 Adam H Aitkenhead <adamaitkenhead@hotmail.com>
+%%
+%% This program is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by
+%% the Free Software Foundation; either version 3 of the License, or
+%% (at your option) any later version.
+%%
+%% This program is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%% GNU General Public License for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; If not, see <http://www.gnu.org/licenses/>.
+
+%% -*- texinfo -*-
+%% @deftypefn {Function File} {@var{header} = } analyze75info(@var{filename})
+%% Read the header of an Analyze file.
+%%
+%% FILENAME is a string (giving the filename).
+%% @end deftypefn
+
+function header = analyze75info(varargin);
+%--------------------------------------------------------------------------
+
+%--------------
+% Check filename
+%--------------
+
+filename = varargin{1};
+
+if exist('filename','var')==1 && exist(filename,'dir')==7
+  filelist = dir([filename,filesep,'*.hdr']);
+  if numel(filelist)==1
+    filename = [filename,filesep,filelist.name];
+  else
+    [filename,filepath] = uigetfile([filename,filesep,'*.hdr'],'Select the input file');
+    filename = [filepath,filename];
+  end
+elseif ( exist('filename','var')==1 && exist(filename,'file')==0 ) || exist('filename','var')==0
+  [filename,filepath] = uigetfile('*.hdr','Select the input file');
+  filename = [filepath,filename];
+end
+
+% Strip the filename of the extension
+
+fileextH = strfind(filename,'.hdr');
+fileextI = strfind(filename,'.img');
+if isempty(fileextH)==0
+  fileprefix = filename(1:fileextH-1);
+elseif isempty(fileextI)==0
+  fileprefix = filename(1:fileextI-1);
+else
+  fileprefix = filename;
+end
+
+%--------------
+% Check the byteorder
+%--------------
+
+byteorder = 'ieee-le';
+
+for loopN = 2:nargin-1
+  if ischar(varargin{loopN}) && strcmpi(varargin{loopN})=='ByteOrder'
+    if ischar(varargin{loopN+1}) && ( strcmpi(varargin{loopN+1})=='ieee-be' || strcmpi(varargin{loopN+1})=='b' )
+      byteorder = 'ieee-be';
+      disp('Code does not yet work for big-endian files.')
+    else
+      byteorder = 'ieee-le';
+    end
+  end
+end
+
+%--------------
+% Read the file
+%--------------
+
+header = READ_hdr(fileprefix);
+
+
+end %function
+%--------------------------------------------------------------------------
+
+
+%--------------------------------------------------------------------------
+function [header] = READ_hdr(fileprefix)
+
+%----------------------------
+% Gather the header info
+%----------------------------
+
+dirdata                 = dir([fileprefix,'.hdr']);
+
+header.Filename         = [fileprefix,'.hdr'];
+header.FileModDate      = dirdata.date;
+header.Format           = 'Analyze';
+header.FormatVersion    = '7.5';
+header.ColorType        = 'grayscale';
+header.ByteOrder        = 'ieee-le';
+
+fidH                    = fopen([fileprefix,'.hdr']);
+
+header.HdrFileSize      = fread(fidH,1,'int32');
+header.HdrDataType      = char(fread(fidH,10,'char'))';
+header.DatabaseName     = char(fread(fidH,18,'char'))';
+header.Extents          = fread(fidH,1,'int32');
+header.SessionError     = fread(fidH,1,'int16');
+header.Regular          = char(fread(fidH,1,'char'));
+unused                  = char(fread(fidH,1,'char'));
+unused                  = fread(fidH,1,'int16');
+header.Dimensions       = zeros(size(1,4));
+header.Dimensions(1)    = fread(fidH,1,'int16');
+header.Dimensions(2)    = fread(fidH,1,'int16');
+header.Dimensions(3)    = fread(fidH,1,'int16');
+header.Dimensions(4)    = fread(fidH,1,'int16');
+unused                  = fread(fidH,3,'int16');
+header.VoxelUnits       = char(fread(fidH,4,'char'))';
+header.CalibrationUnits = char(fread(fidH,8,'char'))';
+unused                  = fread(fidH,1,'int16');
+
+datatype = fread(fidH,1,'int16');
+if datatype==0 
+  header.ImgDataType = 'DT_UNKNOWN';
+elseif datatype==1
+  header.ImgDataType = 'DT_BINARY';
+elseif datatype==2
+  header.ImgDataType = 'DT_UNSIGNED_CHAR';
+elseif datatype==4
+  header.ImgDataType = 'DT_SIGNED_SHORT';
+elseif datatype==8
+  header.ImgDataType = 'DT_SIGNED_INT';
+elseif datatype==16
+  header.ImgDataType = 'DT_FLOAT';
+elseif datatype==32
+  header.ImgDataType = 'DT_COMPLEX';
+elseif datatype==64
+  header.ImgDataType = 'DT_DOUBLE';
+elseif datatype==128
+  header.ImgDataType = 'DT_RGB';
+elseif datatype==255
+  header.ImgDataType = 'DT_ALL';
+end
+
+header.BitDepth           = fread(fidH,1,'int16');
+unused                    = fread(fidH,1,'int16');
+unused                    = fread(fidH,1,'float');
+header.PixelDimensions    = zeros(1,3);
+header.PixelDimensions(1) = fread(fidH,1,'float');
+header.PixelDimensions(2) = fread(fidH,1,'float');
+header.PixelDimensions(3) = fread(fidH,1,'float');
+unused                    = fread(fidH,4,'float');
+header.VoxelOffset        = fread(fidH,1,'float');
+unused                    = fread(fidH,3,'float');
+header.CalibrationMax     = fread(fidH,1,'float');
+header.CalibrationMin     = fread(fidH,1,'float');
+header.Compressed         = fread(fidH,1,'float');
+header.Verified           = fread(fidH,1,'float');
+header.GlobalMax          = fread(fidH,1,'int32');
+header.GlobalMin          = fread(fidH,1,'int32');
+header.Descriptor         = char(fread(fidH,80,'char'))';
+header.AuxFile            = char(fread(fidH,24,'char'))';
+header.Orientation        = char(fread(fidH,1,'char'))';
+header.Originator         = char(fread(fidH,10,'char'))';
+header.Generated          = char(fread(fidH,10,'char'))';
+header.Scannumber         = char(fread(fidH,10,'char'))';
+header.PatientID          = char(fread(fidH,10,'char'))';
+header.ExposureDate       = char(fread(fidH,10,'char'))';
+header.ExposureTime       = char(fread(fidH,10,'char'))';
+unused                    = char(fread(fidH,3,'char'))';
+header.Views              = fread(fidH,1,'int32');
+header.VolumesAdded       = fread(fidH,1,'int32');
+header.StartField         = fread(fidH,1,'int32');
+header.FieldSkip          = fread(fidH,1,'int32');
+header.OMax               = fread(fidH,1,'int32');
+header.OMin               = fread(fidH,1,'int32');
+header.SMax               = fread(fidH,1,'int32');
+header.SMin               = fread(fidH,1,'int32');
+
+header.Width              = header.Dimensions(1);
+header.Height             = header.Dimensions(2);
+
+fclose(fidH);
+
+%----------------------------
+% Check the img filesize
+%----------------------------
+
+fidI = fopen([fileprefix,'.img']);
+fseek(fidI,0,1);
+header.ImgFileSize = ftell(fidI);
+fclose(fidI);
+
+end %function
+%--------------------------------------------------------------------------
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/image/inst/analyze75read.m	Tue Sep 25 12:41:30 2012 +0000
@@ -0,0 +1,108 @@
+%% Copyright (C) 2012 Adam H Aitkenhead <adamaitkenhead@hotmail.com>
+%%
+%% This program is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by
+%% the Free Software Foundation; either version 3 of the License, or
+%% (at your option) any later version.
+%%
+%% This program is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%% GNU General Public License for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; If not, see <http://www.gnu.org/licenses/>.
+
+%% -*- texinfo -*-
+%% @deftypefn {Function File} {@var{image} = } analyze75read(@var{filename})
+%% @deftypefnx {Function File} {@var{image} = } analyze75read(@var{structure})
+%% Read the image data contained in an Analyze file.
+%%
+%% FILENAME is a string (giving the filename).
+%% Alternatively, STRUCTURE is a structure containing a field `Filename'
+%% (such as returned by `analyze75info').
+%% @end deftypefn
+
+function data = analyze75read(varargin);
+%--------------------------------------------------------------------------
+
+%--------------
+% Check filename
+%--------------
+
+filename = varargin{1};
+
+if isstruct(filename)==1 && isfield(filename,'Filename')==1
+  header   = filename;
+  filename = header.Filename;
+elseif exist('filename','var')==1 && exist(filename,'dir')==7
+  filelist = dir([filename,filesep,'*.hdr']);
+  if numel(filelist)==1
+    filename = [filename,filesep,filelist.name];
+  else
+    [filename,filepath] = uigetfile([filename,filesep,'*.hdr'],'Select the input file');
+    filename = [filepath,filename];
+  end
+elseif ( exist('filename','var')==1 && exist(filename,'file')==0 ) || exist('filename','var')==0
+  [filename,filepath] = uigetfile('*.hdr','Select the input file');
+  filename = [filepath,filename];
+end
+
+% Strip the filename of the extension
+
+fileextH = strfind(filename,'.hdr');
+fileextI = strfind(filename,'.img');
+if isempty(fileextH)==0
+  fileprefix = filename(1:fileextH-1);
+elseif isempty(fileextI)==0
+  fileprefix = filename(1:fileextI-1);
+else
+  fileprefix = filename;
+end
+
+%--------------
+% Read the file
+%--------------
+
+if exist('header','var')==0
+  header = analyze75info(filename);
+end
+
+data = READ_img(fileprefix,header);
+
+end %function
+%--------------------------------------------------------------------------
+
+
+%--------------------------------------------------------------------------
+function [data] = READ_img(fileprefix,header)
+
+%----------------------------
+% Read the .img file
+%----------------------------
+
+fidI = fopen([fileprefix,'.img']);
+
+fseek(fidI,0,-1);
+
+if strcmp(header.ImgDataType,'DT_FLOAT')==1
+  datatype = 'single';
+else
+  datatype = 'double';
+end
+
+data    = zeros(header.Dimensions,datatype);
+data(:) = fread(fidI,datatype,header.ByteOrder);
+
+fclose(fidI);
+
+%----------------------------
+% Rearrange the data
+%----------------------------
+
+data = permute(data,[2,1,3]);
+
+end %function
+%--------------------------------------------------------------------------
+
+