1.  功能简介

栅格数据前置过滤是在渲染之前对内存中的数据根据特定的规则进行处理,然后再进行数据渲染。本示例以定标为例进行示例代码编写。

定标(校准)是将遥感器所得的测量值变换为绝对亮度或变换为与地表反射率、表面温度等物理量有关的相对值的处理过程。或者说,遥感器定标就是建立遥感器每个探测器输出值与该探测器对应的实际地物辐射亮度之间的定量关系。它是遥感定量化的前提。

栅格后置过滤是对渲染过程的控制。本示例以曲线调整为例进行示例代码编写

灰度拉伸又叫对比度拉伸,它是最基本的一种灰度变换,使用的是最简单的分段线性变换函数,它的主要思想是提高图像处理时灰度级的动态范围。

[灰度拉伸函数]

2. 功能实现说明

2.1  实现思路及原理说明

本示例代码以FY-4A数据的定标为例,已经运用静止卫星数据读取方法,读取NOMChannel13波段数据为tiff。

前置过滤(以定标为例)

第一步

初始化前置过滤回调函数。

第二步

实现定标算法。

第三步

实例化自定义前置过滤对象。

第四步

为前置过滤对象设置前置过滤算法

第五步

接口转换

第六步

添加前置过滤器

后置过滤(以曲线拉伸为例)

第一步

初始化拉伸结果表。

第二步

添加折点。

第三步

根据折点,计算结果拉伸表。

第四步

实例化后置过滤器

第五步

设置对照表

第六步

接口转换,添加后置过滤条件

2.2 核心接口与方法

接口/类

方法

说明

前置过滤

Carto.PreFilterFunCallback

Carto.ICustomerPreRasterFilter

SetPreFilterFun

设置前置过滤算法

Carto.IrasterFilterProps

AddPreRasterFilter

添加前置过滤

后置过滤

Carto. ILutAfterFilter

SetLut

为指定波段设置对照表

Carto. IRasterFilterProps

AddAfterRasterFilter

添加后置过滤器

2.3 示例代码

项目路径

百度云盘地址下/PIE示例程序/07图层渲染/12.栅格过滤制

数据路径

百度云盘地址下/PIE示例数据/栅格数据/ FY/FY4A/

视频路径

百度云盘地址下/PIE视频教程/07图层渲染/12.栅格过滤控制.avi

示例代码

 方法(一)
//前置过滤本示例以定标为例
//风云4A数据为例
IRasterLayer rasterLayer = mapControlMain.ActiveView.CurrentLayer as IRasterLayer;
IRasterRender rasterRender = RenderFactory.ImportFromFile(@"C:\Users\zhangyiwei\Desktop\TestData\ICV-BD.xml"); //实例化定标函数
CaliCommon common = new CaliCommon();
string hdfpath = (rasterLayer as ILayer).DataSourcePath;
common.Initialize(hdfpath, "NOMChannel13"); //添加前置过滤
PIE.Carto.ICustomerPreRasterFilter preFilter = new PIE.Carto.CustomerPreRasterFilter();
preFilter.SetPreFilterFun(common.CaliFunCallBack); IRasterClassifyColorRampRender classRender = rasterRender as IRasterClassifyColorRampRender;
(classRender as IRasterFilterProps).AddPreRasterFilter(preFilter as IPreRasterFilter); //地图刷新
rasterLayer.Render = rasterRender;
mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
方法(二)
/// <summary>
/// 定标方法接口
/// </summary>
public interface ICaliFunction
{
/// <summary>
/// 定标回调函数
/// </summary>
PreFilterFunCallback CaliFunCallBack
{
get;
} /// <summary>
/// 数据定标
/// </summary>
/// <param name="dataNeedCali">原始数据</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <param name="bandCount">波段</param>
/// <returns>定标后数据</returns>
float[] Cali<T>(T[] dataNeedCali, int width, int height, int bandCount); /// <summary>
/// 定标算法函数
/// </summary>
unsafe bool CaliFilter(IntPtr valuesA, IntPtr valuesB);
} /// <summary>
/// 风云4A数据的定标方法
/// </summary>
public class CaliCommon : ICaliFunction
{
/// <summary>
/// 定标数据
/// </summary>
private float[] m_DBDatas = null; /// <summary>
/// 定标数据长度
/// </summary>
private int m_Count = ; /// <summary>
/// 定标回调函数
/// </summary>
private PreFilterFunCallback m_CaliFunCallBack = null; /// <summary>
/// 构造函数
/// </summary>
public CaliCommon()
{
} /// <summary>
/// 定标回调函数
/// </summary>
public PreFilterFunCallback CaliFunCallBack
{
get
{
return m_CaliFunCallBack;
}
} /// <summary>
/// 初始化定标方法
/// </summary>
/// <param name="strFilePath_HDF">hdf文件路径</param>
/// <param name="chanelName">通道名称</param>
/// <returns></returns>
public bool Initialize(string strFilePath_HDF, string chanelName)
{
string calName = chanelName.Replace("NOM", "CAL");
string calFilePath = System.IO.Path.GetDirectoryName(strFilePath_HDF) + "\\" + calName+".tiff";
IRasterDataset rasterDataset = PIE.DataSource.DatasetFactory.OpenRasterDataset(calFilePath, OpenMode.ReadOnly); int height = rasterDataset.GetRasterYSize(); m_DBDatas = new float[height];
int[] bandMap = { };
rasterDataset.Read(, , , height, m_DBDatas, , height, PixelDataType.Float32, , bandMap); (rasterDataset as IDisposable).Dispose(); m_Count = m_DBDatas.Length;
m_CaliFunCallBack = new PreFilterFunCallback(CaliFilter);
GC.KeepAlive(m_CaliFunCallBack);
return true;
} /// <summary>
/// 数据定标
/// </summary>
/// <param name="dataNeedCali">原始数据</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <param name="bandCount">波段</param>
/// <returns>定标后数据</returns>
public float[] Cali<T>(T[] dataNeedCali, int width, int height, int bandCount)
{
if (dataNeedCali == null || dataNeedCali.Length < )
{
return null;
} float[] dataCali = new float[width * height * bandCount];
for (int j = ; j < height; j++)
{
for (int i = ; i < width; i++)
{
for (int m = ; m < bandCount; m++)
{
int nIndex = (j * width + i) * bandCount + m;
int value = Convert.ToInt32(dataNeedCali[nIndex]);
if (value < || value >= m_Count)
{
dataCali[nIndex] = ;
}
else
{
dataCali[nIndex] = m_DBDatas[value];
}
}
}
}
return dataCali;
} /// <summary>
/// 定标算法
/// </summary>
/// <param name="valuesA">定标前</param>
/// <param name="valuesB">定标后</param>
/// <returns></returns>
public unsafe bool CaliFilter(IntPtr valuesA, IntPtr valuesB)
{
if (m_DBDatas == null)
{
return false;
}
IPixelBuffer pixelBuffer = PIE.DataSource.DatasetFactory.ConstructCLRPixelBuffer(valuesA.ToPointer());
int width = pixelBuffer.Width;
int height = pixelBuffer.Height;
int bandCount = pixelBuffer.BandMap.Length; float[] valuesData = new float[width * height * bandCount]; short* byteValues = (short*)(pixelBuffer.GetData_Ref().ToPointer());
for (int j = ; j < height; j++)
{
for (int i = ; i < width; i++)
{
for (int m = ; m < bandCount; m++)
{
int nIndex = (j * width + i) * bandCount + m;
int value = *(byteValues + nIndex);
if (value < || value >= m_Count)
{
valuesData[nIndex] = ;
}
else
{
valuesData[nIndex] = m_DBDatas[value];
}
}
}
}
pixelBuffer.SetData(PixelDataType.Float32, valuesData);
return true;
}
}

2.4  示例截图

(一)   前置过滤

(二)   后置过滤

PIE SDK过滤控制的更多相关文章

  1. PIE SDK过滤

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

  2. PIE SDK栅格增强控制

    1. 功能简介 亮度是指发光体(反光体)表面发光(反光)强弱的物理量:对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量:透明度是描述光线透过的程度 栅格数据增强控制主要是通过对亮 ...

  3. 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 ...

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

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

  5. PIE SDK创建掩膜

      1.算法功能简介 图像掩膜(Mask)用选定的图像.图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程.掩膜是一种图像滤镜的模板,实用掩膜经常处理的是遥感图像.当提取道 ...

  6. PIE SDK地图范围设置

    1.功能简介 地图范围设置主要就是对图层的地图浏览控制,例如地图的放大.缩小.漫游.全图显示.1:1视图.比例尺等功能,能更好的与地图有一个互动的地图浏览体验.PIE SDK对地图范围设置主要利用IC ...

  7. PIE SDK地图图层渲染方案管理

    1. 功能简介 在数据种类较多.渲染规则复杂的情况下,逐个设置其渲染方式是一件繁琐的工作.PIE SDK提供了一种省力省心的办法, PIE SDK提供栅格和矢量数据渲染方案的打开与保存.能够将配色方案 ...

  8. PIE SDK专题制图下地图的的操作

    1.    功能简介 制图模式和地图模式下用的地图是同一份地图,那么在制图模式下如果需要对地图进行操作(例如地图的拉框放大,缩小),那么该如何操作呢,地图范围视图变化在制图模式下该如何监听呢,下面主要 ...

  9. PIE SDK与Matlab结合说明文档

    1.功能简介 Matlab是三大数学软件之一,它在数学类科技应用软件中在数值计算方面首屈一指.Matlab可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程语言的程序等,主要应用于 ...

随机推荐

  1. javascript总结3:javaScript的 Math 对象

    Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). Math 常用的方法 var n1=1234; v ...

  2. (转)基于 WPF + Modern UI 的 公司OA小助手 开发总结

    原文地址:http://www.cnblogs.com/rainlam163/p/3365181.html 前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个 ...

  3. delphi json用法

    用法:uses Superobject, Sperjsondelphi里有json单元. procedure TForm2.SuperObjectClick(Sender: TObject); var ...

  4. jQuery事件(持续更新中)

    方法 描述 bind() 向匹配元素附加一个或更多事件处理器 blur() 触发.或将函数绑定到指定元素的 blur 事件 change() 触发.或将函数绑定到指定元素的 change 事件 cli ...

  5. 定制JMeter取样器

    JMeter运行你区定义自己的取样器sampler,方法很简单,只需继承类org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClie ...

  6. Js杂谈-插件包读后感

    最近有幸得到了一份项目上的前端封装的插件库代码,花了一个下午时间,仔细地研读了一下.对于我很想做自己的类库,搞自己的组件包很有启蒙意义. 相比较我之前阅过的框架或是类库,这份比较简单. 项目是jQue ...

  7. asp.net 类,接口

    ASP.NET抽象类和接口的比较 相同点 ●都不能被直接实例化,都可以通过继承实现其抽象方法. ●都是面向抽象编程的技术基础,实现了诸多的设计模式. 不同点 ●接口支持多继承:抽象类不能实现多继承.  ...

  8. 搜索引擎Hoot的源码阅读(提供源码)

    开门见山,最近阅读了一下一款开源引擎的源码,受益良多(学到了一些套路).外加好久没有写博客了(沉迷吃鸡,沉迷想念姑娘),特别开一篇.Hoot 的源码地址, 原理介绍地址.外加我看过之后的注释版本,当然 ...

  9. C# 接口(3)

    这么半天说了如何使用,实现接口.相信也都发现了接口和抽象类很多相似的地方. 但是! 这两个根本就是不一样的. 抽象类 :                                         ...

  10. React进阶篇(2) -- Redux

    前言 如果还不知道为什么要使用Redux,说明你暂时还不需要它. 三大原则 单一数据源 整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一 ...