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. Idea2017常用功能

    1,添加java工程  2,导出可执行jar 3,本地代码提交svn新分支 4,乱码问题解决 一次解决所有问题,只需做配置文件的修改即可 解决方案:       在 IntelliJ IDEA 201 ...

  2. Sql的行列转换

    创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...

  3. sklearn中的随机森林

    阅读了Python的sklearn包中随机森林的代码实现,做了一些笔记. sklearn中的随机森林是基于RandomForestClassifier类实现的,它的原型是 class RandomFo ...

  4. 移动开发iOS&Android对比学习--异步处理

    在移动开发里很多时候需要用到异步处理.Android的主线程如果等待超过一定时间的时候直接出现ANR(对不熟悉Android的朋友这里需要解释一下什么叫ANR.ANR就是Application Not ...

  5. 使用ffmpeg将海康视频rtsp转为hls

    测试环境: Ubuntu14.04 LTS Desktop ffmpeg version 3.3.3 命令行运行: ffmpeg -i rtsp://admin:12345@10.0.10.19:55 ...

  6. C++ 内敛函数

    在主调函数调用函数时,先将现场压入栈以保存现场-转去执行被掉函数-返回主调函数.现场出栈以恢复现场-继续往下执行. 为了减少函数调用的成本,特别是对于小型函数,C++提供了内敛函数(inline).C ...

  7. 基于python+selenium的框架思路(二)

    一.如下是用例格式,第一个sheet为用例汇总,后面的sheet为具体的用例步骤 sheet:测试用例 sheet:搜索 sheet:刘江博客验证 二.读取该excel文件取出关键字等信息,作为关键字 ...

  8. thinkphp里数据嵌套循环

    做thinkphp时要用到循环里面嵌套循环的,并第二个循环是和外面的有关联的. thinkphp官网给出的文档为: <volist name="list" id=" ...

  9. 使用javascript随机生成斗地主玩家手牌

    学习javascript估摸着有半个多月了,好歹自己有过编程基础,学的还算轻松,不过js里的面向对象是真的打脑壳,但都但不懂,和我以前学过的c#简直相差太远 今天写了个随机生成斗地主玩家手牌的代码,自 ...

  10. C# 读Autofac源码笔记(2)

    刚看了下Autofac属性注入的源码 首先看看WithProperty方法   image.png Autofac将我们的属性值,存在了一个list集合中   image.png 然后将这个集合传递到 ...