主成分變換(Principal Component Analysis,PCA)又稱K-L(Karhunen-Loeve)變換或霍特林(Hotelling)變換,是基於變量之間的相關關係,在儘可能不丟失信息前提下的一種線性變換的方法,主要用於數據壓縮和信息加強。算法
主成分正變換,通常意義的K-L變換就是指正變換,該過程經過對圖像進行統計,在波段協方差矩陣的基礎上計算特徵值,構造主成分。根據主成分與特徵值的關係,能夠選擇少數的主成分做爲輸出結果。ide
主成分逆變換,若是在正變換中選擇的主成分數目與波段/變量數目相同,那麼逆變換結果將徹底等同於原始影像。若是選擇的主成分數目少於波段數逆變換結果至關於壓抑了圖像中的噪聲。受選擇的主成分數目的影響,逆變換結果圖像的各個「波段」與原始圖像波段可能會有較大的差別而再也不具備原始圖像波段的物理意義。測試
PIESDK提供了正變換和逆變換的算法,只須要設置對應的參數條件就能夠執行,下面介紹下兩種算法使用方法。spa
下面的示例代碼須要安裝DevExpress三方界面庫code
第一步orm |
算法參數設置視頻 |
第二步對象 |
算法執行blog |
第三步排序 |
結果顯示 |
算法名稱 |
主成分正變換 |
|
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位); 一、無符號整形(16位); 二、整形(16位); 三、無符號長整形(32位); 四、長整形(32位); 五、浮點型(32位); 六、雙精度浮點型(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位); 一、無符號整形(16位); 二、整形(16位); 三、無符號長整形(32位); 四、長整形(32位); 五、浮點型(32位); 六、雙精度浮點型(64位) |
m_strFileTypeCode |
String |
輸出文件格式 |
m_strInputPcaFile |
String |
輸入PCA結果文件 |
m_strInputStatsFile |
String |
輸入PCA結果統計文件 |
m_strOutputResultFile |
String |
輸出文件路徑 |
項目路徑 |
百度雲盤地址下/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 //一、參數設置 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 //二、建立算法對象 21 ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.TransformForwardPCAAlgo"); 22 if (algo == null) return; 23 algo.Params = info; 24 25 //三、執行算法 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 //一、參數設置 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 //二、建立算法對象 62 ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.TransformInversePCAAlgo"); 63 if (algo == null) return; 64 algo.Params = info; 65 66 //三、執行算法並加載結果圖層 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 } |
圖1、主成分正變換
圖二:主成分逆變換