PIE SDK主成分變換

1.算法功能簡介

     主成分變換(Principal Component Analysis,PCA)又稱K-L(Karhunen-Loeve)變換或霍特林(Hotelling)變換,是基於變量之間的相關關係,在儘可能不丟失信息前提下的一種線性變換的方法,主要用於數據壓縮和信息加強。算法

  主成分正變換,通常意義的K-L變換就是指正變換,該過程經過對圖像進行統計,在波段協方差矩陣的基礎上計算特徵值,構造主成分。根據主成分與特徵值的關係,能夠選擇少數的主成分做爲輸出結果。ide

  主成分逆變換,若是在正變換中選擇的主成分數目與波段/變量數目相同,那麼逆變換結果將徹底等同於原始影像。若是選擇的主成分數目少於波段數逆變換結果至關於壓抑了圖像中的噪聲。受選擇的主成分數目的影響,逆變換結果圖像的各個「波段」與原始圖像波段可能會有較大的差別而再也不具備原始圖像波段的物理意義。測試

  PIESDK提供了正變換和逆變換的算法,只須要設置對應的參數條件就能夠執行,下面介紹下兩種算法使用方法。spa

      下面的示例代碼須要安裝DevExpress三方界面庫code

2.算法功能實現說明

2.1. 實現步驟

第一步orm

算法參數設置視頻

第二步對象

算法執行blog

第三步排序

結果顯示

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位);

一、無符號整形(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

輸出文件路徑

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     //一、參數設置
 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 }
View Code

2.4. 示例截圖

 

圖1、主成分正變換

 

圖二:主成分逆變換

相關文章
相關標籤/搜索