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 }
View Code

2.4 示例截图

 

 

注意:

1、上述分类图由于roi分类的类别很少可能误差有点大,稍微做了些渲染修改

2、如果要改成最大似然分类法,修改执行算法以及ClassifierType=0;

其他不变(距离分类和最大似然分类的参数文件是同一个素以不需要修改其他内容):

 PIE.SystemAlgo.ISystemAlgo algo=PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.MLClassificationAlgo")

posted @ 2019-04-17 18:09  PIESAT  阅读(3265)  评论(7编辑  收藏  举报