PIE SDK 距離分類和最大似然分類

  

1.算法功能簡介

  監督分類,也叫訓練場地法、訓練分類法,是遙感圖像分類的一種,用被確認類別的樣本像元去識別其餘未知類別像元的過程。監督分類算法有平行算法、平行六面體法、最小距離法、最大似然法、馬氏距離法、二值編碼分類法等算法。算法

  最小距離法是一種原理簡單,應用方便的分類方法,它利用訓練樣本中各種別在各波段的均值,根據各像元離訓練樣本平均值的距離大小來決定其類別,其在遙感分類中應用並不普遍,主要缺點是此方法沒有考慮不一樣類別內部方差的不一樣,從而形成一些類別在其邊界上的重疊,引發分類偏差,所以須要一些更有效的測量距離的方法。ide

  最大似然分類,在多類地物識別時,常採用某種統計方法創建起一個判別函數集,而後根據這個判別函數計算各待分類樣本的歸屬機率,樣本屬於哪一類的機率最大就判別其屬於哪一類,這就是最大似然法 。最大似然法是根據訓練樣本的均值和方差來評價其餘像元和訓練類別之間的類似性,它能夠同時定量地考慮兩個以上的波段和類別,是一種普遍應用的分類器,可是這種算法的計算量較大,同時對不一樣類別的方差變化比較敏感。函數

  PIE SDK支持算法功能的執行,下面對距離分類算法和最大似然分類法功能進行介紹。工具

2.算法功能實現說明

2.1 實現步驟

第一步this

設置ROI統計參數ROIStatistics_Exchange_Info並執行ROI統計算法獲得ROI統計信息。編碼

第二步spa

根據roi統計信息設置監督分類參數SupervisedClassification_Exchange_Info並執行距離分類算法code

第三步orm

結果顯示視頻

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 示例截圖

 

 

注意:

一、上述分類圖因爲roi分類的類別不多可能偏差有點大,稍微作了些渲染修改

二、若是要改爲最大似然分類法,修改執行算法以及ClassifierType=0;

其餘不變(距離分類和最大似然分類的參數文件是同一個素以不須要修改其餘內容):

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

相關文章
相關標籤/搜索