图像平均梯度matlab,为什么图像不清楚但平均梯度很大

这篇博客详细介绍了如何使用Matlab中的avegrad.m和read_ENVIimagefile.m函数来处理Envi数据,包括提取感兴趣区、计算平均梯度,以及通过调用函数读取和转换ENVI图像文件。适合环境科学或遥感分析的Matlab初学者。
摘要由CSDN通过智能技术生成

满意答案

先用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分享举报

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值