matlab 讀取ENVI中*.img格式圖片程式碼
阿新 • • 發佈:2019-02-03
function data=read_ENVIimagefile_img(imgfilename) %本函式讀取img格式,前提是img影象顯式帶有'.img'字尾名。 if length(imgfilename)>=4 switch strcmp(imgfilename(length(imgfilename)-3:end), '.img') case 0 hdrfilename=strcat(imgfilename, '.hdr'); case 1 hdrfilename=strcat(imgfilename(1: (length(imgfilename)-4)), '.hdr'); end else hdrfilename=strcat(imgfilename, '.hdr'); end %讀取ENVI標準格式影象檔案 %讀取影象標頭檔案 fid = fopen(hdrfilename, 'r'); info = fread(fid,'char=>char'); info=info';%預設讀入列向量,須要轉置為行向量才適於顯示 fclose(fid); %查詢列數 a=strfind(info,'samples = '); b=length('samples = '); c=strfind(info,'lines'); samples=[]; for i=a+b:c-1 samples=[samples,info(i)]; end samples=str2num(samples); %查詢行數 a=strfind(info,'lines = '); b=length('lines = '); c=strfind(info,'bands'); lines=[]; for i=a+b:c-1 lines=[lines,info(i)]; end lines=str2num(lines); %查詢波段數 a=strfind(info,'bands = '); b=length('bands = '); c=strfind(info,'header offset'); bands=[]; for i=a+b:c-1 bands=[bands,info(i)]; end bands=str2num(bands); %查詢資料型別 a=strfind(info,'data type = '); b=length('data type = '); c=strfind(info,'interleave'); datatype=[]; for i=a+b:c-1 datatype=[datatype,info(i)]; end datatype=str2num(datatype); precision=[]; switch datatype case 1 precision='uint8=>uint8';%標頭檔案中datatype=1對應ENVI中資料型別為Byte,對應MATLAB中資料型別為uint8 case 2 precision='int16=>int16';%標頭檔案中datatype=2對應ENVI中資料型別為Integer,對應MATLAB中資料型別為int16 case 12 precision='uint16=>uint16';%標頭檔案中datatype=12對應ENVI中資料型別為Unsighed Int,對應MATLAB中資料型別為uint16 case 3 precision='int32=>int32';%標頭檔案中datatype=3對應ENVI中資料型別為Long Integer,對應MATLAB中資料型別為int32 case 13 precision='uint32=>uint32';%標頭檔案中datatype=13對應ENVI中資料型別為Unsighed Long,對應MATLAB中資料型別為uint32 case 4 precision='float32=>float32';%標頭檔案中datatype=4對應ENVI中資料型別為Floating Point,對應MATLAB中資料型別為float32 case 5 precision='double=>double';%標頭檔案中datatype=5對應ENVI中資料型別為Double Precision,對應MATLAB中資料型別為double otherwise error('invalid datatype');%除以上幾種常見資料型別之外的資料型別視為無效的資料型別 end %查詢資料格式 a=strfind(info,'interleave = '); b=length('interleave = '); c=strfind(info,'sensor type'); interleave=[]; for i=a+b:c-1 interleave=[interleave,info(i)]; end interleave=strtrim(interleave);%刪除字串中的空格 %讀取影象檔案 fid = fopen(imgfilename, 'r'); data = multibandread(imgfilename ,[lines, samples, bands],precision,0,interleave,'ieee-le'); data= double(data); end