READENVIRASTER - Read an image of ENVI standard type to a MATLAB array.
Contents
Syntax
image = READENVIRASTER(fname); [image,p,t] = READENVIRASTER(fname, ext);
Input
fname : string giving the full pathname of the ENVI image to read.
Outputs
image : array of size (c,l,b) containing the ENVI image values organised
% in |c| cols, |l| lines and |b| bands. % % *|p|* : vector of size |(1,3)| that contains (1) the nb of cols, (2) the % number of lines and (3) the number of bands of the opened image. % % *|t|* : string describing the image data type string in MATLAB conventions. %
Remark
READENVIRASTER needs the corresponding image header file generated automatically by ENVI. The ENVI header file must have the same name as the ENVI image file + the '.hdf' exention.
See also
Ressembles: READENVIROI.
Function implementation
function [image,p,t] = readenviraster(fname,varargin)
parameters initialization
elements={'samples ' 'lines ' 'bands ' 'bands ' 'data type '}; d={'bit8' 'int16' 'int32' 'float32' 'float64' 'uint16' 'uint32' 'int64' 'uint64'};
check user input
if ~ischar(fname) error('readenviraster:errorinput', 'fname should be a char string'); end if nargin>=2 ext=varargin{1}; if ~isempty(ext) && ~strcmp(ext(1),'.') ext=strcat('.',ext); end if nargin==3, disp = varargin{2}; else disp = false; end else % default: empty string ext = ''; disp = false; end
open ENVI header file to retreive s, l, b & d variables
rfid = fopen(strcat(fname,'.hdr'),'r');
check if the header file is correctely open
if rfid == -1 error('readenviraster:readerror','input header file does not exist'); end;
read ENVI image header file and get p(1) : nb samples, p(2) : nb lines, p(3) : nb bands and t : data type
while 1 tline = fgetl(rfid); if ~ischar(tline), break, end [first,second]=strtok(tline,'='); switch first case elements(1) [~,s] = strtok(second); p(1) = str2double(s); case elements(2) [~,s] = strtok(second); p(2) = str2double(s); case elements(3) [~,s] = strtok(second); p(3) = str2double(s); case elements(4) [~,s] = strtok(second); p(3) = str2double(s); case elements(5) [~,s] = strtok(second); t = str2double(s); switch t case 1 t = d(1); case 2 t = d(2); case 3 t = d(3); case 4 t = d(4); case 5 t = d(5); case 12 t = d(6); case 13 t = d(7); case 14 t = d(8); case 15 t = d(9); otherwise error('readenviraster:errorinput', 'unknown image data type'); end end end fclose(rfid); t = t{1,1};
open the ENVI image and store it in the 'image' MATLAB array
if disp disp([('Opening '), ... (num2str(p(1))),('cols x '),... (num2str(p(2))),('lines x '),... (num2str(p(3))),('bands'),... ('of type '), (t), (' image...')]); end
read and store into an image
fid = fopen(strcat(fname,ext)); image = fread(fid,t); image = reshape(image,[p(1),p(2),p(3)]);
close the file
fclose(fid);
% disp([('Image data type : '),(t)])
end % end of readenviraster