热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PIESDK距离分类和最大似然分类

1.算法功能简介监督分类,也叫训练场地法、训练分类法,是遥感图像分类的一种,用被确认类别的样本像元去识别其他未知类别像元的过程。监督分类算法有平行算法、平行六面体法、最小距离法、最大似

  

1.算法功能简介

  监督分类,也叫训练场地法、训练分类法,是遥感图像分类的一种,用被确认类别的样本像元去识别其他未知类别像元的过程。监督分类算法有平行算法、平行六面体法、最小距离法、最大似然法、马氏距离法、二值编码分类法等算法。

  最小距离法是一种原理简单,应用方便的分类方法,它利用训练样本中各类别在各波段的均值,根据各像元离训练样本平均值的距离大小来决定其类别,其在遥感分类中应用并不广泛,主要缺点是此方法没有考虑不同类别内部方差的不同,从而造成一些类别在其边界上的重叠,引起分类误差,因此需要一些更有效的测量距离的方法。

  最大似然分类,在多类地物识别时,常采用某种统计方法建立起一个判别函数集,然后根据这个判别函数计算各待分类样本的归属概率,样本属于哪一类的概率最大就判别其属于哪一类,这就是最大似然法 。最大似然法是根据训练样本的均值和方差来评价其他像元和训练类别之间的相似性,它可以同时定量地考虑两个以上的波段和类别,是一种广泛应用的分类器,但是这种算法的计算量较大,同时对不同类别的方差变化比较敏感。

  PIE SDK支持算法功能的执行,下面对距离分类算法和最大似然分类法功能进行介绍。

2.算法功能实现说明

2.1 实现步骤

第一步

设置ROI统计参数ROIStatistics_Exchange_Info并执行ROI统计算法得到ROI统计信息。

第二步

根据roi统计信息设置监督分类参数SupervisedClassification_Exchange_Info并执行距离分类算法

第三步

结果显示

2.2 算法参数

算法名称

距离分类

C#算法DLL

PIE.CommonAlgo.dll

C#算法名称

PIE.CommonAlgo.DistanceClassificationAlgo(距离分类)

PIE.CommonAlgo.MLClassificationAlgo(最大似然分类)

参数结构体

SupervisedClassification_Exchange_Info

参数说明

InputFilePath

String

输入文件(*.tif;*.tiff; *.img)

OutputFilePath

String

输出文件路径

(*.tif;*.tiff; *.img)

RStart

Int

行起始值(大于0小于等于栅格总行数)

REnd

Int

行结束值(大于0小于等于栅格总行数,大于RStart)

CStart

Int

列起始值(大于0小于等于栅格总列数)

CEnd

Int

列结束值(大于0小于等于栅格总列数,大于CEnd)

SelBandNums

Int

多光谱波段个数

SelBandIndexs

IList

多光谱波段集合

ROINums

Int

ROI个数

ROIMean

IList

ROI均值集合

ROICof

IList

ROICof集合

ListRoiNames

IList

ROI名称集合

ListRoiColors

IList

ROI颜色集合

ClassifierType

Int

监督分类类型(0代表最大似然分类;1代表距离分类)

FuncName

String

C#算法名称

 

2.3 示例代码

项目路径

百度云盘地址下/PIE示例程序/10.算法调用/图像处理/ DistanceClassify

数据路径

百度云盘地址下/PIE示例数据/栅格数据/04.World.tif

视频路径

百度云盘地址下/PIE视频教程/10.算法调用/图像处理/距离分类算法.avi

示例代码

 

  1 using PIE.Carto;
  2 using PIE.CommonAlgo;
  3 using PIE.Framework;
  4 using PIE.SystemAlgo;
  5 using System;
  6 using System.Collections.Generic;
  7 using System.Linq;
  8 using System.Text;
  9 
 10 namespace DistanceClassify
 11 {
 12     //距离分类
 13     class DistanceClassifyCommand : DesktopCommand
 14     {
 15         /// 
 16         /// 监督分类参数
 17         /// 
 18         private PIE.CommonAlgo.SupervisedClassification_Exchange_Info m_DataInfo = null;
 19 
 20         public DistanceClassifyCommand()
 21         {
 22             this.Name = "DistanceClassifyCommand";
 23             this.Caption = "DistanceClassifyCommand";
 24         }
 25 
 26         /// 
 27         /// 单击方法
 28         /// 
 29         public override void OnClick()
 30         {
 31             int selBandNums = 3;//选择分类数据的波段
 32             m_DataInfo = new PIE.CommonAlgo.SupervisedClassification_Exchange_Info();
 33             m_DataInfo.InputFilePath = @"D:\data\China1\World.tif";
 34             m_DataInfo.OutputFilePath = @"D:\data\temp\WorldDisClassify.tif";
 35             m_DataInfo.CStart = 0;//行列起止值
 36             m_DataInfo.CEnd = 2046;
 37             m_DataInfo.RStart = 0;
 38             m_DataInfo.REnd = 1022;
 39             m_DataInfo.SelBandNums = selBandNums;//波段的个数
 40             m_DataInfo.ClassifierType = 1;//分类类型 0 代表最大似然;1代表距离分类
 41 
 42             //多光谱波段的的集合
 43             List<int> listBandIndex = new List<int>();
 44             for (int i = 0; i )
 45             {
 46                 listBandIndex.Add(i + 1);
 47             }
 48             m_DataInfo.SelBandIndexs = listBandIndex;
 49 
 50             #region ROIStatistics ROI统计算法
 51             ROIStatistics_Exchange_Info roiDataInfo = new PIE.CommonAlgo.ROIStatistics_Exchange_Info();
 52             roiDataInfo.ClassifierType = m_DataInfo.ClassifierType;
 53             roiDataInfo.currentFileName = m_DataInfo.InputFilePath;
 54             roiDataInfo.selBandIndex = m_DataInfo.SelBandIndexs.ToArray();
 55             roiDataInfo.selBandNums = m_DataInfo.SelBandNums;
 56 
 57             IList listLayer = m_HookHelper.ActiveView.FocusMap.GetAllLayer();
 58             foreach (ILayer item in listLayer)
 59             {
 60                 if (item.Name == "roi_layer")//得到利用分类工具生成的roi文件
 61                 {
 62                     roiDataInfo.pROILayer = item as IGraphicsLayer;
 63                 }
 64             }
 65 //创建并执行roi统计算法
 66             ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.ROIStatisticsAlgo");
 67             algo.Params = roiDataInfo;
 68             bool result = AlgoFactory.Instance().ExecuteAlgo(algo);//同步执行roi统计算法
 69             #endregion
 70 
 71             #region DistanceClassify算法
 72 //执行完成后得到roi统计的参数会发生变化
 73             roiDataInfo = (ROIStatistics_Exchange_Info)algo.Params;
 74            int roiNum = roiDataInfo.vecROIName.Count;
 75 
 76             m_DataInfo.ROINums = roiNum; //ROI个数
 77             m_DataInfo.ListRoiNames = roiDataInfo.vecROIName;//roi名称列表
 78             m_DataInfo.ListRoiColors = roiDataInfo.vecROIColor;//roi颜色集合
 79             m_DataInfo.ROIMean = new List<double>();
 80             m_DataInfo.ROICof = new List<double>();
 81             for (int i = 0; i //roi均值集合
 82             {
 83                 for (int j = 0; j )
 84                 {
 85                     m_DataInfo.ROIMean.Add(roiDataInfo.vecMean[i * selBandNums + j]);
 86                 }
 87                 for (int k = 0; k )
 88                 {
 89                     m_DataInfo.ROICof.Add(roiDataInfo.vecCof[i * selBandNums * selBandNums + k]);
 90                 }
 91             }
 92             ISystemAlgo distanceAlgo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.DistanceClassificationAlgo");//最大似然法就将DistanceClassificationAlgo替换为MLClassificationAlgo
 93             distanceAlgo.Params = m_DataInfo;
 94             ISystemAlgoEvents systemEvents = distanceAlgo as ISystemAlgoEvents;
 95             systemEvents.OnExecuteCompleted += systemEvents_OnExecuteCompleted;
 96             result = AlgoFactory.Instance().ExecuteAlgo(distanceAlgo);
 97             #endregion
 98         }
 99 
100         /// 
101         /// 算法执行完成事件
102         /// 
103         /// 
104         void systemEvents_OnExecuteCompleted(ISystemAlgo algo)
105         {
106             ISystemAlgoEvents systemEvents = algo as ISystemAlgoEvents;
107             systemEvents.OnExecuteCompleted -= systemEvents_OnExecuteCompleted;
108 ILayer layer = LayerFactory.CreateDefaultLayer(m_DataInfo.OutputFilePath);
109             if (layer == null)
110             {
111                 System.Windows.Forms.MessageBox.Show("分类后图层为空");
112                 return;
113             }
114             m_HookHelper.ActiveView.FocusMap.AddLayer(layer);
115             m_HookHelper.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
116         }
117     }
118 }
View Code

2.4 示例截图

 

 

注意:

1、上述分类图由于roi分类的类别很少可能误差有点大,稍微做了些渲染修改

2、如果要改成最大似然分类法,修改执行算法以及ClassifierType=0;

其他不变(距离分类和最大似然分类的参数文件是同一个素以不需要修改其他内容):

 PIE.SystemAlgo.ISystemAlgo algo=PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.MLClassificationAlgo")


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
author-avatar
诡道89_431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有