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<Int>

多光谱波段集合

ROINums

Int

ROI个数

ROIMean

IList<double>

ROI均值集合

ROICof

IList<double>

ROICof集合

ListRoiNames

IList<String>

ROI名称集合

ListRoiColors

IList<String>

ROI颜色集合

ClassifierType

Int

监督分类类型(0代表最大似然分类;11代表最小距离分类;12带代表马氏距离分类)

FuncName

String

C#算法名称

 

2.3 示例代码

项目路径

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

数据路径

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

视频路径

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

示例代码

 using PIE.Carto;
using PIE.CommonAlgo;
using PIE.Controls;
using PIE.SystemAlgo;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DistanceClassify
{
//距离分类
class DistanceClassifyCommand : BaseCommand
{
/// <summary>
/// 监督分类参数
/// </summary>
private PIE.CommonAlgo.SupervisedClassification_Exchange_Info m_DataInfo = null; public DistanceClassifyCommand()
{
this.Name = "DistanceClassifyCommand";
this.Caption = "DistanceClassifyCommand";
} /// <summary>
/// 单击方法
/// </summary>
public override void OnClick()
{
int selBandNums = ;//选择分类数据的波段
m_DataInfo = new PIE.CommonAlgo.SupervisedClassification_Exchange_Info();
m_DataInfo.InputFilePath = @"D:\data\China1\World.tif";
m_DataInfo.OutputFilePath = @"D:\data\temp\WorldDisClassify.img";
m_DataInfo.CStart = ;//行列起止值
m_DataInfo.CEnd = ;
m_DataInfo.RStart = ;
m_DataInfo.REnd = ;
m_DataInfo.SelBandNums = selBandNums;//波段的个数
m_DataInfo.ClassifierType = ;//分类类型 0 代表最大似然;11代表最小距离分类;12代表马氏距离分类 //多光谱波段的的集合
List<int> listBandIndex = new List<int>();
for (int i = ; i < selBandNums; i++)
{
listBandIndex.Add(i + );
}
m_DataInfo.SelBandIndexs = listBandIndex; #region ROIStatistics ROI统计算法
ROIStatistics_Exchange_Info roiDataInfo = new PIE.CommonAlgo.ROIStatistics_Exchange_Info();
roiDataInfo.ClassifierType = m_DataInfo.ClassifierType;
roiDataInfo.currentFileName = m_DataInfo.InputFilePath;
roiDataInfo.selBandIndex = m_DataInfo.SelBandIndexs.ToArray();
roiDataInfo.selBandNums = m_DataInfo.SelBandNums; IList<ILayer> listLayer = m_HookHelper.ActiveView.FocusMap.GetAllLayer();
foreach (ILayer item in listLayer)
{
if (item.Name == "roi_layer")//得到利用分类工具生成的roi文件
{
roiDataInfo.pROILayer = item as IGraphicsLayer;
}
}
//创建并执行roi统计算法
ISystemAlgo algo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.ROIStatisticsAlgo");
algo.Params = roiDataInfo;
bool result = AlgoFactory.Instance().ExecuteAlgo(algo);//同步执行roi统计算法
#endregion #region DistanceClassify算法
//执行完成后得到roi统计的参数会发生变化
roiDataInfo = (ROIStatistics_Exchange_Info)algo.Params;
int roiNum = roiDataInfo.vecROIName.Count; m_DataInfo.ROINums = roiNum; //ROI个数
m_DataInfo.ListRoiNames = roiDataInfo.vecROIName;//roi名称列表
m_DataInfo.ListRoiColors = roiDataInfo.vecROIColor;//roi颜色集合
m_DataInfo.ROIMean = new List<double>();
m_DataInfo.ROICof = new List<double>();
for (int i = ; i < roiNum; i++)//roi均值集合
{
for (int j = ; j < selBandNums; j++)
{
m_DataInfo.ROIMean.Add(roiDataInfo.vecMean[i * selBandNums + j]);
}
for (int k = ; k < selBandNums * selBandNums; k++)
{
m_DataInfo.ROICof.Add(roiDataInfo.vecCof[i * selBandNums * selBandNums + k]);
}
}
ISystemAlgo distanceAlgo = AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.DistanceClassificationAlgo");//最大似然法就将DistanceClassificationAlgo替换为MLClassificationAlgo
distanceAlgo.Params = m_DataInfo;
ISystemAlgoEvents systemEvents = distanceAlgo as ISystemAlgoEvents;
systemEvents.OnExecuteCompleted += systemEvents_OnExecuteCompleted;
result = AlgoFactory.Instance().ExecuteAlgo(distanceAlgo);
#endregion
} /// <summary>
/// 算法执行完成事件
/// </summary>
/// <param name="algo"></param>
void systemEvents_OnExecuteCompleted(ISystemAlgo algo)
{
ISystemAlgoEvents systemEvents = algo as ISystemAlgoEvents;
systemEvents.OnExecuteCompleted -= systemEvents_OnExecuteCompleted;
ILayer layer = LayerFactory.CreateDefaultLayer(m_DataInfo.OutputFilePath);
if (layer == null)
{
System.Windows.Forms.MessageBox.Show("分类后图层为空");
return;
}
m_HookHelper.ActiveView.FocusMap.AddLayer(layer);
m_HookHelper.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
}
}
}

2.4 示例截图

注意:

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

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

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

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

PIE SDK 距离分类和最大似然分类的更多相关文章

  1. PIE SDK K-Means分类

    1.算法功能简介 K-Means 算法的基本思想是:以空间中 k 个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果. 算法首先随机从数据集中选 ...

  2. PIE SDK 精度分析(分类后处理)

    1.算法功能简介 遥感图像分类精度分析通常把分类图与标准数据进行比较,然后用正确分类的百分比来表示分类的精度. PIE SDK支持算法功能的执行,下面对精度分析算法功能进行介绍. 2.算法功能实现说明 ...

  3. PIE SDK ISODATA分类

    1.算法功能简介 ISODATA(IterativeSelf-OrganizingDataAnalysisTechniqueAlgorithm)即迭代式自组织数据分析技术, 其大致原理是首先计算数据空 ...

  4. PIE SDK分类合并

    1. 算法功能简介 分类合并功能是将分类文件中所设置的对应类别进行合并. PIE SDK支持算法功能的执行,下面对分类合并算法功能进行介绍. 2. 算法功能实现说明 2.1. 实现步骤 第一步 算法参 ...

  5. PIE SDK 监督分类对话框类(SupervisedClassificaitonDialog)使用经验

    最近研究遥感,用到分类算法,PIE SDK正好提供了一些方法可供调用,他们的官方博客上也有相应的示例代码(可参考:https://www.cnblogs.com/PIESat/p/10725270.h ...

  6. PIE SDK 文章目录索引

    1.PIE SDK介绍 1.1.  PIE软件介绍 1.2.  PIE SDK介绍 1.3.  PIE支持项目介绍 1.4.  PIE.NET-SDK插件式二次开发介绍 1.5.  PIE.NET-S ...

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

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

  8. PIE SDK分类统计

    1. 算法功能简介 分类统计功能是将分类后的结果统计输出. PIE SDK支持算法功能的执行,下面对分类统计算法功能进行介绍. 2. 算法功能实现说明 2.1. 实现步骤 第一步 算法参数设置 第二步 ...

  9. PIE SDK过滤

    1. 算法功能简介 过滤功能使用斑点分组方法来消除分类文件中被隔离的分类像元,用以解决分类图像中出现的孤岛问题. PIE SDK支持算法功能的执行,下面对过滤算法功能进行介绍. 2. 算法功能实现说明 ...

随机推荐

  1. eclipse netbeans 代码模板

    eclipse  代码模板  插入slf4j ${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)} private static final Log ...

  2. LinqPad介绍,下载,用法说明

    介绍一款用于Linq运算和测试的工具,LinqPad.我感觉这个工具非常优秀,不只是功能上优秀,在使用上也非常优秀,让我爱不释手. LinqPad官方地址:http://www.linqpad.net ...

  3. (转)一个故事讲完https

    (转)一个故事讲完https 2 1  序言 今天来聊一聊https 安全传输的原理. 在开始之前,我们来虚构两个人物, 一个是位于中国的张大胖(怎么又是你?!), 还有一个是位于米国的Bill (怎 ...

  4. 编写高质量代码改善C#程序的157个建议——建议140:使用默认的访问修饰符

    建议140:使用默认的访问修饰符(我不太赞成作者的这个观点,这样减少的代码基本可以忽略不计,但是,如果把访问修饰符补充完整,反而会使代码更加易读.我认为自己写代码时应该尽量加上访问修饰符,看别人写的代 ...

  5. ibatis源码学习1_整体设计和核心流程

    背景介绍ibatis实现之前,先来看一段jdbc代码: Class.forName("com.mysql.jdbc.Driver"); String url = "jdb ...

  6. 小试maven工程

    由于工作中要用到maven来进行开发j2ee开发,所以选用了集成maven的eclipse版本: 下载地址: https://www.eclipse.org/downloads/ 根据提示下载32或者 ...

  7. C#在线运行

    初步完成c#代码的在线编辑.       首先,传回前端的c#在线代码,进行预编译,用CSharpCodeProvider这个方法.设置编译版本3.5 设置编译参数GenerateInMemory:是 ...

  8. C#多线程学习(三) 生产者和消费者

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  9. django DatabaseFunctions

    from django.db.functions import ... Cast() 转换类型 value = Value.objects.annotate(field_as_float=Cast(' ...

  10. 十八、Node.js创建Web服务器(二)

    在上一篇文章中我们在自定义模块自定义了几种文件类型的头文件加工的方法: /** * 自定义模块加工响应头文件类型 */ module.exports.getminiName=function (ext ...