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:\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 //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
PIE SDK主成分变换相关推荐
- PIE SDK傅里叶变换
1.算法功能简介 傅里叶变换能把遥感图像从空域变换到只包含不同频域信息的频域中.原图像上的灰度突变部位(如物体边缘).图像结构复杂的区域.图像细节及干扰噪声等,经傅里叶变换后,其信息大多集中在高频区: ...
- PIE SDK CommandTool工具命令一览表
PIE SDK Command&&Tool工具命令一览表 编号 模板 名称(中文) Command&Tool 程序集 备注 1 数据管理 加载栅格数据 PIE.Controls ...
- matlab mysvd代码解释,关于使用SVD进行PCA主成分提取的代码问题!也是必须涉及到原理的!...
如标题所示,目的是将矩阵进行PCA分析最终得到降维后的新主成分,对于特征值特征向量的提取方法是通过svd.代码和函数名称定义如下/如图所示 function [Xm,U,L]=pca(X,K); % ...
- 代码实证:风险平价及其改进思路——主成分风险平价
原创文章第85篇,专注"个人成长与财富自由.世界运作的逻辑, AI量化投资". 今天继续风险平价,风险平价是大类资产配置非常好的起点.可以很好的控制回撤,缺点是收益率偏低,原版是通 ...
- PCA主成分分析 提取主成分,过滤噪音
前一篇提到的人脸识别中,我们在使用SVM支持向量机做人脸分类之前使用到PCA提取人脸数据中的主要成分,降低计算的维度,那么具体PCA是如何提取的呢?下文了解一下. PCA is a method to ...
- 主成分分析;主成分回归分析——Hald水泥问题;主成分分析案例——各地区普通高等教育发展水平综合评价;matlab
目的 对原变量加以"改造",在不致损失原变量太多信息的条件下尽可能地降低变量地维数,即用较少的"新变量"代替原来地各变量. 通过变换:用低维(主成分)近似高维( ...
- 主成分回归python实现
主成分分析python实现 这是我一直都想写的内容,但是迟迟没有动手开始写,主要的原因是没有理解python中PCA降维后再进行回归时应该要怎么做.再网上查了很多资料,也没有这方面的讲解,书上也是讲到 ...
- 主成分回归之后预测_主成分回归解析.ppt
教学课件课件PPT医学培训课件教育资源教材讲义 主成分回归分析 一.主成分估计 主成分估计是以P个主成分中的前q个贡献大的主成分为自变量建立回归方程,估计参数的一种方法. 它可以消除变量间的多重共线性 ...
- ESL3.5 学习笔记(主成分回归,偏最小二乘回归步骤详解)
3.5 运用派生输入方向的方法 这是一篇有关<统计学习基础>,原书名The Elements of Statistical Learning的学习笔记,该书学习难度较高,有很棒的学者将其翻 ...
最新文章
- 你还在使用 try-catch-finally 关闭资源?
- 算法笔记_218:花朵数(Java)
- python开发能做什么-python能做什么?是什么?
- Mysql存储引擎MyIsAM和InnoDB区别
- python 英语分词_Python英文文本分词(无空格)模块wordninja的使用实例
- JavaScript中try, catch, throw的用法
- java蓝桥杯算法训练 奇偶判断
- 叮咚买菜大裁员?回应:消息不实 目前业务都在正常运转
- python百度知道_用Python写的一个【百度知道】自动点赞
- linux下图形远程桌面
- ArcGIS API for Silverlight 入门学习笔记(一)hello world 补充问题
- 05.javascript访问CSS
- 构建Docker镜像仓库的另一选择:Nexus3 - DockOne.io
- php 万能密码,万能用户名和万能密码
- ITSM正向浪涌测试仪
- 重新编译使用CMake的旧项目的问题处理
- 猜字游戏python程序_python 猜字游戏
- oracle if else嵌套,else能嵌入if吗
- 浅谈目前政企办公协作的需求与痛点
- Windows下运行python脚本报错“ImportError: No Module named ...”的解决方法
热门文章
- [转]JAVA AES 加密算法
- 调整和改编赛车游戏——游戏屏幕
- SQL Server 2005: 存储过程签名
- java spark 读取json_apache-spark - 与aws-java-sdk链接时,在读取json文件时发生Spark崩溃 - 堆栈内存溢出...
- js php 数据类型判断,【js基础】变量类型判断
- python1~10阶乘while_Python3基础 while 阶乘
- C语言开发笔记(二)volatile
- NewCode----彩色宝石项链
- 操作系统上机题目(多进程2)
- 不属于个人计算机范围的是,计算机应用基础模拟试卷2