• 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:dataChina1World.tif";
     34             m_DataInfo.OutputFilePath = @"D:data	empWorldDisClassify.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")

  • 相关阅读:
    MongoDB创建索引
    mongodb基本指令与高级查询指令以及聚合命令
    数据挖掘流程
    Python魔法方法__getattr__、__setattr__、__getattribute__的介绍
    Python中property描述器的使用
    Python类的构造方法及继承问题
    Python3将字节类型的Unicode码转换为文字
    自定义Django Admin后台管理界面的名称
    Django Admin在search_fields包含外键字段
    Python 3与Python 2中模块导入操作的区别
  • 原文地址:https://www.cnblogs.com/PIESat/p/10725270.html
Copyright © 2020-2023  润新知