1.算法功能簡介
?? ? 主成分變換(Principal Component Analysis,PCA)又稱K-L(Karhunen-Loeve)變換或霍特林(Hotelling)變換,是基于變量之間的相關關系,在盡量不丟失信息前提下的一種線性變換的方法,主要用于數據壓縮和信息增強。
主成分正變換,一般意義的K-L變換就是指正變換,該過程通過對圖像進行統計,在波段協方差矩陣的基礎上計算特征值,構造主成分。根據主成分與特征值的關系,可以選擇少數的主成分作為輸出結果。
主成分逆變換,如果在正變換中選擇的主成分數目與波段/變量數目相同,那么逆變換結果將完全等同于原始影像。如果選擇的主成分數目少于波段數逆變換結果相當于壓抑了圖像中的噪聲。受選擇的主成分數目的影響,逆變換結果圖像的各個“波段”與原始圖像波段可能會有較大的差異而不再具有原始圖像波段的物理意義。
PIESDK提供了正變換和逆變換的算法,只需要設置對應的參數條件就可以執行,下面介紹下兩種算法使用方法。
? ? ? 下面的示例代碼需要安裝DevExpress三方界面庫
2.算法功能實現說明
2.1. 實現步驟
第一步 | 算法參數設置 |
第二步 | 算法執行 |
第三步 | 結果顯示 |
2.2. 算法參數
算法名稱 | 主成分正變換 | |
C#算法DLL | PIE.CommonAlgo.dll | |
C#算法名稱 | PIE.CommonAlgo.TransformForwardPCAAlgo | |
參數結構體 | ForwardPCA_Exchange_Info | |
參數說明 | ||
?m_strInputFile | String | 輸入文件 |
m_strOutputResultFile | String | 輸出影像路徑 |
m_strOutputStatsFile | String | 輸出統計文件 |
m_strFileTypeCode | String | 輸出文件類型 |
m_nPCBands | int | 輸出波段數量 |
m_nOutDataType | int | 輸出文件類型 0、字節型(8位); 1、無符號整形(16位); 2、整形(16位); 3、無符號長整形(32位); 4、長整形(32位); 5、浮點型(32位); 6、雙精度浮點型(64位) |
m_eigenvalues | IList<string> | 特征值 -返回 |
m_bPCBandsFromEigenvalus | bool | 根據特征值排序選擇PCA波段 |
m_bOutputLikeEnvi | bool | 零均值處理 |
m_bCovariance | bool | 統計使用矩陣 -true- 使用協方差矩陣 -false- 使用相關系數矩陣 |
m_accumulate_contribute | IList<string> | 百分比 -返回 |
?
算法名稱 | 主成分逆變換 | |
C#算法DLL | PIE.CommonAlgo.dll | |
C#算法名稱 | PIE.CommonAlgo.TransformInversePCAAlgo | |
參數結構體 | InversePCA_Exchange_Info | |
參數說明 | ||
?m_m_nOutDataType | int | 輸出文件字節類型 0、字節型(8位); 1、無符號整形(16位); 2、整形(16位); 3、無符號長整形(32位); 4、長整形(32位); 5、浮點型(32位); 6、雙精度浮點型(64位) |
m_strFileTypeCode | String | 輸出文件格式 |
m_strInputPcaFile | String | 輸入PCA結果文件 |
m_strInputStatsFile | String | 輸入PCA結果統計文件 |
m_strOutputResultFile | String | 輸出文件路徑 |
2.3. 示例代碼
項目路徑 | 百度云盤地址下/PIE示例程序/10.算法調用/圖像處理/ImageTransform |
數據路徑 | 百度云盤地址下/PIE示例數據/柵格數據/04.World/World.tif |
視頻路徑 | 百度云盤地址下/PIE視頻教程/10.算法調用/圖像處理/主成分變換.avi |
示例代碼 | |
![]() ![]() 1 /// <summary> 2 /// 主成分正變換 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void toolStripButton1_Click(object sender, EventArgs e) 7 { 8 //1、參數設置 9 PIE.CommonAlgo.ForwardPCA_Exchange_Info info = new ForwardPCA_Exchange_Info(); 10 info.m_strInputFile = @"D:\data\02.測試數據\World\World.tif"; 11 info.m_nOutDataType = 5;//float32 12 info.m_strOutputResultFile = @"D:\PCPT.tif";//輸出文件 13 info.m_strOutputStatsFile = @"D:\PCPT.pcasta";//輸出統計文件 14 info.m_nPCBands = 3;//輸出的主成分波段數 15 info.m_strFileTypeCode = "GTiff";//文件格式類型 16 info.m_bOutputLikeEnvi = true;//零均值處理 17 info.m_bPCBandsFromEigenvalus = false;//是否根據特征值排序PCA波段(如果為true,m_nPCBands 為0個波段) 18 info.m_bCovariance = true;//統計使用矩陣 true 協方差矩陣 false 使用相關系矩陣 前提是 19 bPCBandsFromEigenvalus為true,設置的才有效 20 //2、創建算法對象 21 ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.TransformForwardPCAAlgo"); 22 if (algo == null) return; 23 algo.Params = info; 24 25 //3、執行算法 26 bool result = AlgoFactory.Instance().ExecuteAlgo(algo); 27 if (result) 28 { 29 if (info.m_nPCBands == 0 && info.m_bPCBandsFromEigenvalus) 30 { 31 PIE.CommonAlgo.ForwardPCA_Exchange_Info info1 = algo.Params as PIE.CommonAlgo.ForwardPCA_Exchange_Info; 32 PIE.Plugin.FrmPCABandSelect frm = new PIE.Plugin.FrmPCABandSelect(); 33 frm.Init(info1.m_eigenvalues, info1.m_accumulate_contribute); 34 if (frm.ShowDialog() != DialogResult.OK) return; 35 info1.m_nPCBands = frm.nOutBandCount;//選擇輸出的波段號 36 algo.Params = info1; 37 result = AlgoFactory.Instance().ExecuteAlgo(algo); 38 } 39 } 40 if (result == false) return; 41 mapControlMain.AddLayerFromFile(info.m_strOutputResultFile, 0); 42 mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 43 } 44 45 46 /// <summary> 47 /// 主成分逆變換 (對主成分正變換的結果做逆變換,得到正變換之前的影像數據) 48 /// </summary> 49 /// <param name="sender"></param> 50 /// <param name="e"></param> 51 private void toolStripButton2_Click(object sender, EventArgs e) 52 { 53 //1、參數設置 54 PIE.CommonAlgo.InversePCA_Exchange_Info info = new InversePCA_Exchange_Info(); 55 info.m_strInputPcaFile = @"D:\PCPT.tif";//輸入文件 主成分正變換結果 56 info.m_strInputStatsFile = @"D:\PCPT.pcasta";//pac統計文件 57 info.m_strOutputResultFile = @"D:\InversePC.tif";//逆變換結果 58 info.m_strFileTypeCode = "GTiff";//輸出結果 59 info.m_nOutDataType = 5;//float32 60 61 //2、創建算法對象 62 ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.TransformInversePCAAlgo"); 63 if (algo == null) return; 64 algo.Params = info; 65 66 //3、執行算法并加載結果圖層 67 bool result = AlgoFactory.Instance().ExecuteAlgo(algo); 68 if (result != true) return; 69 ILayer layer = LayerFactory.CreateDefaultLayer(info.m_strOutputResultFile); 70 mapControlMain.ActiveView.FocusMap.AddLayer(layer); 71 mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 72 } |
2.4. 示例截圖
?
圖一、主成分正變換
?
圖二:主成分逆變換