滿意答案
先用envi提取出你的感興趣區 儲存
然後使用matlab 兩個調用函數 平均梯度avegrad.m 和 讀取envi資料函數read_ENVIimagefile.m
平均梯度avegrad.m (網上有)
function AVEGRAD=avegrad(img)
data=read_enviimagefile(img);
data=double(data);
imgband=data(:,:,1);
[M,N]=size(imgband);
gradval=zeros(M,N);
diffX=zeros(M,N);
diffY=zeros(M,N);
tempX=zeros(M,N);
tempY=zeros(M,N);
tempX(1:M,1:(N-1))=data(1:M,2:N);
tempY(1:(M-1),1:N)=data(2:M,1:N);
diffX=data-tempX;
diffY=data-tempY;
diffX(1:M,N)=0;
diffY(M,1:N)=0;
diffX=diffX.*diffX;
diffY=diffY.*diffY;
AVEGRAD=sum(sum(diffX+diffY));
AVEGRAD=sqrt(AVEGRAD/2);
AVEGRAD=AVEGRAD/((M-1)*(N-1));
end
讀取envi資料函數read_ENVIimagefile.m(上面的程式會調用到 這也是網上好心人給的)
function data=read_ENVIimagefile(imgfilename)
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
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';
case 2
precision='int16=>int16';
case 12
precision='uint16=>uint16';
case 3
precision='int32=>int32';
case 13
precision='uint32=>uint32';
case 4
precision='float32=>float32';
case 5
precision='double=>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
在指令視窗中輸入avegrad('C:\Users\long\Desktop\a\bhdemsub.img'); 括号裡為資料位置 ok了
專門為你的問題看得 自己也學習了
要在envi中的話 就要用idl程式設計的 不會 一開始準備學的 最後還是用matlab 主要有現成的改改
00分享舉報