PIE SDK主成分变换

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:data2.测试数据WorldWorld.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 }
View Code

2.4. 示例截图

 

图一、主成分正变换

 

图二:主成分逆变换

原文地址:https://www.cnblogs.com/PIESat/p/11202621.html