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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络优化软件apk,金九银十怎么从中小企业挤进一线大厂?我先收藏为敬

前言 从毕业到现在面试也就那么几家公司&#xff0c;单前几次都比较顺利&#xff0c;在面到第三家时都给到了我offer&#xff01;前面两次找工作&#xff0c;没考虑到以后需要什么&#xff0c;自己的对未来的规划是什么&#xff0c;只要有份工作&#xff0c;工资符合自己的要求…

渣本毕业两年经验,大厂面试题汇总

开头 最近有个老铁&#xff0c;告诉我说&#xff0c;上班一个月&#xff0c;后悔当初着急入职现在公司了。他之前在美图做手机研发&#xff0c;今年美图那边今年也有一波组织优化调整&#xff0c;他是其中一个&#xff0c;在协商离职后&#xff0c;当时捉急找工作上班&#xf…

渣本毕业两年经验,看这一篇就够了!

最近跟我的一些读者交流&#xff0c;有一位读者的经历让我记忆深刻&#xff1a; “有一次和大学同学聚会&#xff0c;和几个在BAT的同学聊了聊技术&#xff0c;发现自己在创业公司这几年&#xff0c;完全是吃老本的状态&#xff0c;没有什么机会精进技术&#xff0c;同样是工作…

温故而知新!微信小程序的事件处理,吊打面试官系列!

前言 现实就是&#xff0c;99%的职业&#xff0c;年龄增大后都没前途。没前途是绝大多数普通人的宿命&#xff0c;有前途的人也用不着等到老。有没有前途已然不重要&#xff0c;无论做哪一行&#xff0c;健康的心态永远是首位。 从我个人的角度写写30多岁码工的感受&#xff…

温故而知新!这篇文章可以满足你80%日常工作!面试真题解析

前言 程序员这个行业&#xff0c;日新月异&#xff0c;技术体系更新速度快&#xff0c;新技术新框架层出不穷&#xff0c;所有的技术都像是一个无底洞&#xff0c;当你学得越多就会发现不懂的越多&#xff0c;不懂的越多&#xff0c;需要学习的就更多。 因此&#xff0c;一旦…

我的MarkDown入门

目录 0.前言1.软件准备2.基本语法2.1斜体&加粗2.2分级标题2.3分割线2.4超链接2.5列表2.6引用2.7插入代码2.8插入图像2.9插入表格2.10目录2.11注脚2.12LaTex公式3.Tepora主题4.结语0.前言 最近学习了最基础的MarkDown的使用&#xff0c;MarkDown真的很好上手&#xff0c;大概…

漫谈MySQL权限安全,威力加强版

缘起 经过近十年的发展&#xff0c;Android技术优化日新月异&#xff0c;如今Android 10.0 已经发布&#xff0c;Android系统性能也已经非常流畅&#xff0c;可以在体验上完全媲美iOS。到了各大厂商手里&#xff0c;改源码、自定义系统&#xff0c;使得Android原生系统变得鱼龙…

漫谈MySQL权限安全,跳槽薪资翻倍

前言 很多公司在招人这件事情上都会面临一个问题&#xff1b; “我们的招聘要求又不高&#xff0c;能做项目就行&#xff0c;但为什么就是招不到人&#xff1f;” 很多公司还面临一个问题&#xff0c;招聘的时候这人各方面都不错&#xff0c;但上岗了就是不出活&#xff0c;绩…

灵魂一问-如何彻底防止APK反编译?成功定级腾讯T3-2

前言 这次去腾讯面试的是我大学同学&#xff0c;我们大学都是一学习&#xff0c;一起吃饭&#xff0c;一起洗脚&#xff0c;一起。。。 他们公司最近也裁员了&#xff0c;不过他是裁员前去的腾讯&#xff0c;不知道谁捞到他简历了&#xff0c;莫名就走了流程&#xff0c;他莫…

asp.net core 系列 6 MVC框架路由(下)

一.URL 生成 接着上篇讲MVC的路由&#xff0c;MVC 应用程序可以使用路由的 URL 生成功能&#xff0c;生成指向操作的 URL 链接。 生成 URL 可消除硬编码 URL&#xff0c;使代码更稳定、更易维护。 此部分重点介绍 MVC 提供的 URL 生成功能&#xff0c;并且仅涵盖 URL 生成工作原…

Jenkins 中定时任务构建

一般&#xff0c;在Jenkins中搭建项目完成后&#xff0c;项目可正常运行&#xff0c;基本都会进行定时任务的构建。特别是重要的接口&#xff0c;进行关键接口自动化的日常巡检 时&#xff0c;基本都会设置成定时任务&#xff0c;以方便每天&#xff0c;接口的自动化&#xff0…

爆赞!Jetpack-MVVM-高频提问和解答,满满干货指导

前言 今天我给大家再次分享一下&#xff0c;我最近的一些读书的感想&#xff0c;思考起来&#xff0c;确实能够给自己带来一些真实的帮助和启发&#xff0c;希望大家在平时的工作学习中&#xff0c;也能够认清楚学习的一些本质。 如果我们的学习是在不断掌握应对具体工作场景…

牛笔了!Android面试真题解析火爆全网,面试必备

开头 最近有粉丝反应&#xff0c;不想做安卓了&#xff0c;有朋友转到前端了&#xff0c;安卓不行了&#xff0c;问我怎么办&#xff1f; 自从RN&#xff0c;Weex这种跨平台编程语言出来以后&#xff0c;安卓将死的言论总是不绝于耳。随着颇有摧枯拉朽之势Flutter的出现&…

腾讯,字节等大厂面试真题汇总,深夜思考

前言 最近经常被朋友问到的两个问题。 问题一&#xff1a; “从事IT工作3年了&#xff0c;做技术好累啊&#xff0c;是不是做到30岁就不能继续往下做啊&#xff1f;”问题二&#xff1a; “我已经30岁了&#xff0c;还能不能学编程&#xff1f;” 我给出的答案是&#xff1a…

腾讯,字节等大厂面试真题汇总,进阶学习资料!

前言 找工作还是需要大家不要紧张&#xff0c;有我们干这一行的接触人本来就不多 难免看到面试官会紧张&#xff0c;主要是因为怕面试官问的问题到不上来&#xff0c;那时候不要着急 &#xff0c;答不上了的千万不然胡扯一些&#xff0c;直接就给面试官说这块我还没接触到&…

【题解】鱼塘钓鱼

题目描述 有N个鱼塘排成一排&#xff08;N&#xff1c;100&#xff09;&#xff0c;每个鱼塘中有一定数量的鱼&#xff0c;例如&#xff1a;N5时&#xff0c;如下表&#xff1a; 即&#xff1a;在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼&#xff0c;第2分钟内只能钓到8条鱼&…

腾讯,字节,阿里,小米,京东大厂Offer拿到手软!分享一点面试小经验

&#xff08;一&#xff09;简介 Handler机制是一套Android消息传递机制。在Android开发多线程的应用场景中&#xff0c;将工作线程中需更新UI的操作信息 传递到 UI主线程&#xff0c;从而实现 工作线程对UI的更新处理&#xff0c;最终实现异步消息的处理。 在Android开发中&a…

腾讯,字节,阿里,小米,京东大厂Offer拿到手软!绝对干货

开头 又到年底了&#xff0c;每到这个时候&#xff0c;我们都会慢慢反思&#xff0c;这一年都做了什么&#xff1f;有什么进步&#xff1f;年初的计划都实现了吗&#xff1f;明年年初有跳槽的底气了吗&#xff1f;况且今年的互联网环境太差&#xff0c;需要自己有足够的知识储…

腾讯,字节,阿里,小米,京东大厂Offer拿到手软!讲的明明白白!

缘起 随着Android开发行业逐渐饱和&#xff0c;对Android开发者的面试要求也越来越高&#xff0c;是否掌握底层源码&#xff0c;是面试官衡量一名Android开发者的重要依据。有没有读过源码也可以很大程度上判断你这个人的学习能力和思维方式。无论你开发经验几年&#xff0c;面…

膜拜大佬!5年经验Android程序员面试27天,高级面试题+解析

前言 网上关于启动优化的文章多不胜数&#xff0c;内容千篇一律&#xff0c;大都是列举一些耗时操作&#xff0c;采用异步加载、懒加载等。 而在面试过程中&#xff0c;关于启动优化的问题&#xff0c;如果只是很表面地回答耗时操作应该放在子线程&#xff0c;显然太过于普通…