監督分類,也叫訓練場地法、訓練分類法,是遙感圖像分類的一種,用被確認類別的樣本像元去識別其餘未知類別像元的過程。監督分類算法有平行算法、平行六面體法、最小距離法、最大似然法、馬氏距離法、二值編碼分類法等算法。算法
最小距離法是一種原理簡單,應用方便的分類方法,它利用訓練樣本中各種別在各波段的均值,根據各像元離訓練樣本平均值的距離大小來決定其類別,其在遙感分類中應用並不普遍,主要缺點是此方法沒有考慮不一樣類別內部方差的不一樣,從而形成一些類別在其邊界上的重疊,引發分類偏差,所以須要一些更有效的測量距離的方法。ide
最大似然分類,在多類地物識別時,常採用某種統計方法創建起一個判別函數集,而後根據這個判別函數計算各待分類樣本的歸屬機率,樣本屬於哪一類的機率最大就判別其屬於哪一類,這就是最大似然法 。最大似然法是根據訓練樣本的均值和方差來評價其餘像元和訓練類別之間的類似性,它能夠同時定量地考慮兩個以上的波段和類別,是一種普遍應用的分類器,可是這種算法的計算量較大,同時對不一樣類別的方差變化比較敏感。函數
PIE SDK支持算法功能的執行,下面對距離分類算法和最大似然分類法功能進行介紹。工具
第一步this |
設置ROI統計參數ROIStatistics_Exchange_Info並執行ROI統計算法獲得ROI統計信息。編碼 |
第二步spa |
根據roi統計信息設置監督分類參數SupervisedClassification_Exchange_Info並執行距離分類算法code |
第三步orm |
結果顯示視頻 |
算法名稱 |
距離分類 |
|
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#算法名稱 |
項目路徑 |
百度雲盤地址下/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 } |
注意:
一、上述分類圖因爲roi分類的類別不多可能偏差有點大,稍微作了些渲染修改
二、若是要改爲最大似然分類法,修改執行算法以及ClassifierType=0;
其餘不變(距離分類和最大似然分類的參數文件是同一個素以不須要修改其餘內容):
PIE.SystemAlgo.ISystemAlgo algo=PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.MLClassificationAlgo")