• 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
Copyright © 2020-2023  润新知