资源简介

训练样本(资源已附一个训练样本)来自ENVI CLASSIC导出的ASCLL码格式(文本文件),执行代码会有对话框要求手动打开若干个波段的TM图像,有对话框可以调整输出图像的大小,输出图像显示并以系统时间命名保存。 代码注释完整,易于看懂。

资源截图

代码片段和文件信息


%打开待读取txt样本数据
[FileName_YBPathName_YB] = uigetfile(‘*.txt‘‘选择样本数据‘);%YB为样本的简写
fidin=fopen(strcat(PathName_YBFileName_YB)‘r‘);   
fidout=fopen(‘HEAD.txt‘‘w‘);   %HEAD文件存储样本中首行为分号的数据
fidout2=fopen(‘RGB_NUM.txt‘‘w‘);  %RGB_NUM文件存储样本数据中不同类别的颜色RGB数值所在字符串
semnum=0;
while ~feof(fidin)                                      % 判断是否为文件末尾               
    tline=fgets(fidin);                                 % 从文件读行   
    if ~isempty(strfind(tline(1)‘;‘))                  %判断行首字符是否为分号
        semnum=semnum+1;                                %记录分号的数量
        fprintf(fidout‘%s\n\n‘tline);  
        if semnum==6||(semnum-6>0&&rem(semnum-64)==0)  %将样本类别所在颜色RGB数值所在行打印
            fprintf(fidout2‘%s\n‘tline);
        end
    else
        break;
    end
end
fclose(fidout);
fclose(fidout2);
importdata(‘HEAD.txt‘);  
importdata(‘RGB_NUM.txt‘);  
M=semnum/4-1;                %M为样本类别数,文件头占4行,每一类别也占4行,semnum为分号的个数也就是无关数据的行数

FormatString=repmat(‘%d ‘113);    %读取除HEAD文件外的全数字数据
YB_0 =cell2mat(textscan(fidinFormatString‘HeaderLines‘0));   %YB_0就是列数为波段数的矩阵
YB_0(11)=1;
ind=find(all(YB_0(:1)==12)); %找出所有行首为1的数值所在行号,用于计算每一类别矩阵行数
fclose(fidin);
RGB=zeros(M3);
%读取RGB_NUM文件中的RGB数值,数据在S_3S_4S_5中
[S_1S_2S_3S_4S_5]=textread(‘RGB_NUM.txt‘‘%s%s%s%s%s‘‘delimiter‘ ‘{}:‘);

for x=1:M                                               %获得RGB值
    RGB(x1)=str2num(S_3{x1}(:)‘);
    RGB(x2)=str2num(S_4{x1}(:)‘);
    RGB(x3)=str2num(S_5{x1}(:)‘);
end

%元胞数组YB_Mtri存储不同样本类别的数据
for i_0=1:M-1
     YB_Mtri{1i_0}=YB_0(ind(i_0):(ind(i_0+1)-1)8:13);
 end
YB_Mtri{1M}=YB_0(ind(M):size(YB_01)8:13);



%求均值
for i_1=1:M
    Mean{1i_1}=mean(YB_Mtri{1i_1}) ;
end

%求协方差阵
for i_2=1:M
    for a=1:size(YB_Mtri{1i_2}2) 
        for b=1:size(YB_Mtri{1i_2}2) 
            Sigma{1i_2}(ab)=sum((YB_Mtri{1i_2}(:a)-mean(YB_Mtri{1i_2}(:a))).*(YB_Mtri{1i_2}(:b)-mean(YB_Mtri{1i_2}(:b))))/(size(YB_Mtri{1i_2}1)-1);
        end 
    end
end
%用BD_num求波段数目
BD_num=inputdlg(‘需要打开几个波段的TIF图像‘...
             ‘图像数目:‘ [1 50]{‘6‘});
img_num=str2num(BD_num{1});                             %图像的数目等于波段数目
scale=inputdlg(‘输入缩放比(1为原始大小)‘...
            ‘请输入缩放比以决定处理后图像大小‘[1 70]{‘0.1‘});

for i_3=1:img_num                                       %读取各波段图像
    [FileName_img{i_3}PathName_img] = uigetfile(‘*.tif‘‘选择各波段图像‘);
    img{i_3}=imread(strcat(PathName_imgFileName_img{i_3}));  
    img{i_3}=imresize(img{i_3}eval(scale{1}));
end

New_img=uint8(zeros(size(img{1}1)size(img{1}2)));    %初始化新图像

%求马氏距离,进行分类
for i=1:size(img{1}1)
    for j=1:size(img{1}2)
        if img{1}(ij)==0                               %将图像周围区别开来
           New_img(ij1)=255;New_img(ij2)=255;New_img(ij3)=255;
        else
            for m=1:img_num                             %在此P只为了简化计算  
                P(1m)=double(img{m}(ij));
            end
            for n=1:M                                   %求马氏距离
    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        4099  2018-05-08 09:03  TM_Supervised_Mahalanobis_Distance_Classification.m
     文件    12227250  2018-05-08 08:49  训练样本.txt

评论

共有 条评论