天天看點

圖像平均梯度matlab,為什麼圖像不清楚但平均梯度很大

滿意答案

先用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分享舉報