资源简介
训练样本(资源已附一个训练样本)来自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
相关资源
- 国外计算机科学经典教材 MATLAB科学计
- Matlab完整版车牌定位识别
- 显著性检测GR算法--Matlab
- 显著性检测COV算法--MATLAB
- 图像分割程序matlab版
- LabelMeToolbox-master
- 稀疏三维变换协同滤波图像去噪MATL
- MATLAB图像与视频处理实用案例详解—
- matlab30个案例程序源码
- dace.rar+Kriging+surrogate model
- Model+Predictive Control System Design and Imp
- TIR透镜设计过程
- 数字图像处理课程设计matlab源码及课
- 大写 英文 字符识别
- Matlab2019a官方指导文件
- 滤波反投影matlab仿真程序
- 《信号与系统》计算机练习 利用MAT
- 数理统计与Matlab讲义
-
matlab/simuli
nk经典教材-姚俊《Simuli - 基于模板匹配的人脸检测实现-MATLAB
- matlab时频分析工具箱最新版
- 《基于matlab7.0的统计信息处理》.pdf
- surf算法-matlab版
- 红外运动目标识别系统的Matlab实现
- BNT_SLP v1.5
- 基于人工神经网络的汽车牌照识别M
- zw_PID控制Matlab仿真.zip
- MATLAB初学者教程 MATLAB编程-菜鸟入门清
- 基于MATLAB的车牌自动识别系统源码
- SVPWM原理及MATLAB仿真指导
评论
共有 条评论