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

示例代码

 /// <summary>
/// 主成分正变换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripButton1_Click(object sender, EventArgs e)
{
//1、参数设置
PIE.CommonAlgo.ForwardPCA_Exchange_Info info = new ForwardPCA_Exchange_Info();
info.m_strInputFile = @"D:\data\02.测试数据\World\World.tif";
info.m_nOutDataType = ;//float32
info.m_strOutputResultFile = @"D:\PCPT.tif";//输出文件
info.m_strOutputStatsFile = @"D:\PCPT.pcasta";//输出统计文件
info.m_nPCBands = ;//输出的主成分波段数
info.m_strFileTypeCode = "GTiff";//文件格式类型
info.m_bOutputLikeEnvi = true;//零均值处理
info.m_bPCBandsFromEigenvalus = false;//是否根据特征值排序PCA波段(如果为true,m_nPCBands 为0个波段)
info.m_bCovariance = true;//统计使用矩阵 true 协方差矩阵 false 使用相关系矩阵 前提是
bPCBandsFromEigenvalus为true,设置的才有效
//2、创建算法对象
ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.TransformForwardPCAAlgo");
if (algo == null) return;
algo.Params = info; //3、执行算法
bool result = AlgoFactory.Instance().ExecuteAlgo(algo);
if (result)
{
if (info.m_nPCBands == && info.m_bPCBandsFromEigenvalus)
{
PIE.CommonAlgo.ForwardPCA_Exchange_Info info1 = algo.Params as PIE.CommonAlgo.ForwardPCA_Exchange_Info;
PIE.Plugin.FrmPCABandSelect frm = new PIE.Plugin.FrmPCABandSelect();
frm.Init(info1.m_eigenvalues, info1.m_accumulate_contribute);
if (frm.ShowDialog() != DialogResult.OK) return;
info1.m_nPCBands = frm.nOutBandCount;//选择输出的波段号
algo.Params = info1;
result = AlgoFactory.Instance().ExecuteAlgo(algo);
}
}
if (result == false) return;
mapControlMain.AddLayerFromFile(info.m_strOutputResultFile, );
mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
} /// <summary>
/// 主成分逆变换 (对主成分正变换的结果做逆变换,得到正变换之前的影像数据)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripButton2_Click(object sender, EventArgs e)
{
//1、参数设置
PIE.CommonAlgo.InversePCA_Exchange_Info info = new InversePCA_Exchange_Info();
info.m_strInputPcaFile = @"D:\PCPT.tif";//输入文件 主成分正变换结果
info.m_strInputStatsFile = @"D:\PCPT.pcasta";//pac统计文件
info.m_strOutputResultFile = @"D:\InversePC.tif";//逆变换结果
info.m_strFileTypeCode = "GTiff";//输出结果
info.m_nOutDataType = ;//float32 //2、创建算法对象
ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.TransformInversePCAAlgo");
if (algo == null) return;
algo.Params = info; //3、执行算法并加载结果图层
bool result = AlgoFactory.Instance().ExecuteAlgo(algo);
if (result != true) return;
ILayer layer = LayerFactory.CreateDefaultLayer(info.m_strOutputResultFile);
mapControlMain.ActiveView.FocusMap.AddLayer(layer);
mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
}

2.4. 示例截图

图一、主成分正变换

图二:主成分逆变换

PIE SDK主成分变换的更多相关文章

  1. PIE SDK最小噪声变换

    1.算法功能简介 最小噪声分离变换是用于判定图像数据内在的维数(即波段数),分离数据中的噪声,减少随后处理中的计算需求量. MNF 本质上是两次层叠的主成分变换.第一次变换(基于估计的噪声协方差矩阵) ...

  2. 图像处理中的数学原理具体解释20——主成分变换(PCA)

    欢迎关注我的博客专栏"图像处理中的数学原理具体解释" 全文文件夹请见 图像处理中的数学原理具体解释(总纲) http://blog.csdn.net/baimafujinji/ar ...

  3. PIE SDK主/次要分析

    1.算法功能简介 主要分析功能是采用类似卷积滤波的方法将较大类别中的虚假像元归到该类中,首先定义一个变换核尺寸,然后用变换核中占主要地位(像元最多)类别数代替中心像元的类别数,次要分析相反,用变换核中 ...

  4. PIE SDK彩色空间变换

    1. 算法功能简介 使用彩色空间变换工具可以将三波段红.绿.蓝图像变换到一个特定的彩色空间,并且能从所选彩色空间变换回 RGB.两次变换之间,通过对比度拉伸,可以生成一个色彩增强的彩色合成图像.此外, ...

  5. PIE SDK缨帽变换

    1.算法功能简介 缨帽变换是根据多光谱遥感中土壤.植被等信息在多维光谱空间中信息分布结构对图像做的经验性线性正交变换. PIE 支持对 Landsat MSS. Landsat 5 TM.Landsa ...

  6. PIE SDK傅里叶变换

    1.算法功能简介 傅里叶变换能把遥感图像从空域变换到只包含不同频域信息的频域中.原图像上的灰度突变部位(如物体边缘).图像结构复杂的区域.图像细节及干扰噪声等,经傅里叶变换后,其信息大多集中在高频区: ...

  7. PIE SDK小波变换

    1.算法功能简介 小波变换是一种信号的时间——尺度分析方法,具有多分辨率分析的特点,而且在时频两域都具有表征信号局部特征的能力,是一种窗口大小固定不变但其形状可变,时间窗和频率窗都可变的时频局部化分析 ...

  8. PIE SDK PCA融合

    1.算法功能简介 PCA 融合分三步实现,首先将多光谱数据进行主成分变换,然后用高分辨单波段替换第一主成分波段,最后进行主成份逆变换得到融合图像. PIE支持算法功能的执行,下面对PCA融合算法功能进 ...

  9. PIE SDK Command&&Tool工具命令一览表

    PIE SDK Command&&Tool工具命令一览表 编号 模板 名称(中文) Command&Tool 程序集 备注 1 数据管理 加载栅格数据 PIE.Controls ...

随机推荐

  1. nginx Linux内核参数的优化

    默认的Linux内核参数考虑的是最通用的场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,使得Nginx可以拥有更高的性能. 这里针对最通用的.使Nginx支持 ...

  2. springcloud学习之路: (五) springcloud集成SpringCloudConfig分布式配置中心

    SpringCloud全家桶中的分布式配置中心SpringCloudConfig, 它使用git来管理配置文件, 在修改配置文件后只需要调用一个接口就可以让新配置生效, 非常方便. SpringClo ...

  3. python 模块、包

    #-----模块.包----- 模块: 一个.py 文件就称之为模块模块好处:1.提高代码可读性 2.编写代码不需要从零开始 python 模块: 1.python标准库 2.第三方模块 3.应用程序 ...

  4. linux关闭ACPI电源管理模块

    一.运行环境 # cat /etc/redhat-release CentOS release 6.2 (Final) # uname -a Linux web-server- -.el6.x86_6 ...

  5. JS高阶---继承模式(借用构造函数继承+组合继承)

    (1)借用构造函数继承 案例如下: 验证: (2)组合继承 案例如下: 验证如下: 结果如右图所示 . .

  6. 如何使用jmockit进行单元测试

    1. Jmockit简介 JMockit 是用以帮助开发人员编写测试程序的一组工具和API,它完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来 ...

  7. django学习-视图练习

    写一个真正有用的视图 每个视图必须要做的只有两件事: 返回一个包含被请求页面内容的HttpResponse对象,或抛出一个异常,比如Http404. 至于你还想干些什么,随便你. 你的视图可以从数据库 ...

  8. 【Mybatis】多个参数如何写xml和mapper

    1:#{0},#{1}  不写parameterType 2:注解 @Param("id")String id 3:Map   parameterType="hashma ...

  9. function函数——函数的定义及参数

    #_*_coding:utf-8_*_#作者:王佃元#日期:2019/12/21#函数function subrouting \ procedure#函数的意义 # 1.减少代码重复 # 2.更易扩展 ...

  10. [LeetCode] 20. Valid Parentheses 验证括号

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...