满意答案
先用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分享举报