PIE SDK 距离分类和最大似然分类
1.算法功能简介
监督分类,也叫训练场地法、训练分类法,是遥感图像分类的一种,用被确认类别的样本像元去识别其他未知类别像元的过程。监督分类算法有平行算法、平行六面体法、最小距离法、最大似然法、马氏距离法、二值编码分类法等算法。
最小距离法是一种原理简单,应用方便的分类方法,它利用训练样本中各类别在各波段的均值,根据各像元离训练样本平均值的距离大小来决定其类别,其在遥感分类中应用并不广泛,主要缺点是此方法没有考虑不同类别内部方差的不同,从而造成一些类别在其边界上的重叠,引起分类误差,因此需要一些更有效的测量距离的方法。
最大似然分类,在多类地物识别时,常采用某种统计方法建立起一个判别函数集,然后根据这个判别函数计算各待分类样本的归属概率,样本属于哪一类的概率最大就判别其属于哪一类,这就是最大似然法 。最大似然法是根据训练样本的均值和方差来评价其他像元和训练类别之间的相似性,它可以同时定量地考虑两个以上的波段和类别,是一种广泛应用的分类器,但是这种算法的计算量较大,同时对不同类别的方差变化比较敏感。
PIE SDK支持算法功能的执行,下面对距离分类算法和最大似然分类法功能进行介绍。
2.算法功能实现说明
2.1 实现步骤
第一步 |
设置ROI统计参数ROIStatistics_Exchange_Info并执行ROI统计算法得到ROI统计信息。 |
第二步 |
根据roi统计信息设置监督分类参数SupervisedClassification_Exchange_Info并执行距离分类算法 |
第三步 |
结果显示 |
2.2 算法参数
算法名称 |
距离分类 |
|
C#算法DLL |
PIE.CommonAlgo.dll |
|
C#算法名称 |
PIE.CommonAlgo.DistanceClassificationAlgo(距离分类) PIE.CommonAlgo.MLClassificationAlgo(最大似然分类) |
|
参数结构体 |
SupervisedClassification_Exchange_Info |
|
参数说明 |
||
InputFilePath |
String |
输入文件(*.tif;*.tiff; *.img) |
OutputFilePath |
String |
输出文件路径 (*.tif;*.tiff; *.img) |
RStart |
Int |
行起始值(大于等于0小于栅格总行数) |
REnd |
Int |
行结束值(大于等于0小于栅格总行数,大于RStart) |
CStart |
Int |
列起始值(大于等于0小于栅格总列数) |
CEnd |
Int |
列结束值(大于等于0小于栅格总列数,大于CEnd) |
SelBandNums |
Int |
多光谱波段个数 |
SelBandIndexs |
IList<Int> |
多光谱波段集合 |
ROINums |
Int |
ROI个数 |
ROIMean |
IList<double> |
ROI均值集合 |
ROICof |
IList<double> |
ROICof集合 |
ListRoiNames |
IList<String> |
ROI名称集合 |
ListRoiColors |
IList<String> |
ROI颜色集合 |
ClassifierType |
Int |
监督分类类型(0代表最大似然分类;11代表最小距离分类;12带代表马氏距离分类) |
FuncName |
String |
C#算法名称 |
2.3 示例代码
项目路径 |
百度云盘地址下/PIE示例程序/10.算法调用/图像处理/ DistanceClassify |
数据路径 |
百度云盘地址下/PIE示例数据/栅格数据/04.World.tif |
视频路径 |
百度云盘地址下/PIE视频教程/10.算法调用/图像处理/距离分类算法.avi |
示例代码 |
|
1 using PIE.Carto; 2 using PIE.CommonAlgo; 3 using PIE.Controls; 4 using PIE.SystemAlgo; 5 using System; 6 using System.Collections.Generic; 7 using System.Linq; 8 using System.Text; 9 10 namespace DistanceClassify 11 { 12 //距离分类 13 class DistanceClassifyCommand : BaseCommand 14 { 15 /// <summary> 16 /// 监督分类参数 17 /// </summary> 18 private PIE.CommonAlgo.SupervisedClassification_Exchange_Info m_DataInfo = null; 19 20 public DistanceClassifyCommand() 21 { 22 this.Name = "DistanceClassifyCommand"; 23 this.Caption = "DistanceClassifyCommand"; 24 } 25 26 /// <summary> 27 /// 单击方法 28 /// </summary> 29 public override void OnClick() 30 { 31 int selBandNums = 3;//选择分类数据的波段 32 m_DataInfo = new PIE.CommonAlgo.SupervisedClassification_Exchange_Info(); 33 m_DataInfo.InputFilePath = @"D:\data\China1\World.tif"; 34 m_DataInfo.OutputFilePath = @"D:\data\temp\WorldDisClassify.img"; 35 m_DataInfo.CStart = 0;//行列起止值 36 m_DataInfo.CEnd = 2046; 37 m_DataInfo.RStart = 0; 38 m_DataInfo.REnd = 1022; 39 m_DataInfo.SelBandNums = selBandNums;//波段的个数 40 m_DataInfo.ClassifierType = 11;//分类类型 0 代表最大似然;11代表最小距离分类;12代表马氏距离分类 41 42 //多光谱波段的的集合 43 List<int> listBandIndex = new List<int>(); 44 for (int i = 0; i < selBandNums; i++) 45 { 46 listBandIndex.Add(i + 1); 47 } 48 m_DataInfo.SelBandIndexs = listBandIndex; 49 50 #region ROIStatistics ROI统计算法 51 ROIStatistics_Exchange_Info roiDataInfo = new PIE.CommonAlgo.ROIStatistics_Exchange_Info(); 52 roiDataInfo.ClassifierType = m_DataInfo.ClassifierType; 53 roiDataInfo.currentFileName = m_DataInfo.InputFilePath; 54 roiDataInfo.selBandIndex = m_DataInfo.SelBandIndexs.ToArray(); 55 roiDataInfo.selBandNums = m_DataInfo.SelBandNums; 56 57 IList<ILayer> listLayer = m_HookHelper.ActiveView.FocusMap.GetAllLayer(); 58 foreach (ILayer item in listLayer) 59 { 60 if (item.Name == "roi_layer")//得到利用分类工具生成的roi文件 61 { 62 roiDataInfo.pROILayer = item as IGraphicsLayer; 63 } 64 } 65 //创建并执行roi统计算法 66 ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.ROIStatisticsAlgo"); 67 algo.Params = roiDataInfo; 68 bool result = AlgoFactory.Instance().ExecuteAlgo(algo);//同步执行roi统计算法 69 #endregion 70 71 #region DistanceClassify算法 72 //执行完成后得到roi统计的参数会发生变化 73 roiDataInfo = (ROIStatistics_Exchange_Info)algo.Params; 74 int roiNum = roiDataInfo.vecROIName.Count; 75 76 m_DataInfo.ROINums = roiNum; //ROI个数 77 m_DataInfo.ListRoiNames = roiDataInfo.vecROIName;//roi名称列表 78 m_DataInfo.ListRoiColors = roiDataInfo.vecROIColor;//roi颜色集合 79 m_DataInfo.ROIMean = new List<double>(); 80 m_DataInfo.ROICof = new List<double>(); 81 for (int i = 0; i < roiNum; i++)//roi均值集合 82 { 83 for (int j = 0; j < selBandNums; j++) 84 { 85 m_DataInfo.ROIMean.Add(roiDataInfo.vecMean[i * selBandNums + j]); 86 } 87 for (int k = 0; k < selBandNums * selBandNums; k++) 88 { 89 m_DataInfo.ROICof.Add(roiDataInfo.vecCof[i * selBandNums * selBandNums + k]); 90 } 91 } 92 ISystemAlgo distanceAlgo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.DistanceClassificationAlgo");//最大似然法就将DistanceClassificationAlgo替换为MLClassificationAlgo 93 distanceAlgo.Params = m_DataInfo; 94 ISystemAlgoEvents systemEvents = distanceAlgo as ISystemAlgoEvents; 95 systemEvents.OnExecuteCompleted += systemEvents_OnExecuteCompleted; 96 result = AlgoFactory.Instance().ExecuteAlgo(distanceAlgo); 97 #endregion 98 } 99 100 /// <summary> 101 /// 算法执行完成事件 102 /// </summary> 103 /// <param name="algo"></param> 104 void systemEvents_OnExecuteCompleted(ISystemAlgo algo) 105 { 106 ISystemAlgoEvents systemEvents = algo as ISystemAlgoEvents; 107 systemEvents.OnExecuteCompleted -= systemEvents_OnExecuteCompleted; 108 ILayer layer = LayerFactory.CreateDefaultLayer(m_DataInfo.OutputFilePath); 109 if (layer == null) 110 { 111 System.Windows.Forms.MessageBox.Show("分类后图层为空"); 112 return; 113 } 114 m_HookHelper.ActiveView.FocusMap.AddLayer(layer); 115 m_HookHelper.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 116 } 117 } 118 } |
2.4 示例截图
注意:
1、上述分类图由于roi分类的类别很少可能误差有点大,稍微做了些渲染修改
2、如果要改成最大似然分类法,修改执行算法以及ClassifierType=0;
其他不变(距离分类和最大似然分类的参数文件是同一个素以不需要修改其他内容):
PIE.SystemAlgo.ISystemAlgo algo=PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.MLClassificationAlgo")