PIE SDK水体指数法
1.算法功能简介
单波段阈值法是通过选择某单一波段为判识参数,这一波段往往是水体特征最明显而其它地物相对不太突出的波段(如近红外波段和中红外波段),然后再划定阈值来确定水体信息。该方法主要是利用水体在近红外和中红外波段的强吸收特性,以及植被和土壤在这两个波段较高的反射特性。
对于GF1、环境星、资源3、资源1-02C,可选近红外波段T4(第四波段)公式为T4<α(阈值);对于TM影像,选择近红外(T4)或短波红外(T5) 。公式为:T4<α或T5<α(阈值)
谱间关系法是通过利用不同地物的感光特性不同,在不同光谱之间建立的一系列组合运算关系来以突出目标地物、剔除非目标地物的算法。其提取水体的基本原理是利用水体在可见光和近红外波段吸收较强而植被、土壤等地物在该波段范围内反射极强的特点所产生的反射率差异来实现的,不同的数据源、不同的地物谱间关系式不同。
对于GF1、环境星、资源3、资源1-02C影像,可用以下公式提取:(T2+T3)-(T1+T4)>α
式中T1、T2、T3、T4为第一、二、三、四波段的像素值,α为阈值;
对于TM影像,可用以下判别公式: (T2+T3)-(T4+T5)>α ;
式中T2、T3、T4、T5为TM影像第二、三、四、五波段的像素值,α为阈值。
水体指数法,目前,对水体指数构建形式有很多,但基本原理都是采用波段比值运算的方法达到突出水体、削弱非水体的目的,对于只有蓝、绿、红、近红波段的高分1号、环境星1A/1B、资源3号、资源1号02C等,可用归一化差异水体指数(NDWI),利用水体在绿波段和近红波段吸收和反射的反差进行水体自动提取,公式如下:
NDWI=(T2–T4)/( T2+T4)
NDWI >α
式中T2、T4为第二、四波段像素值,α为阈值;
对于高分一号数据,还可用高分1号水体指数(GF1_WI),利用蓝波段和近红波段吸收和反射的反差突出水体,计算公式如下:
GF1_WI=(T1–T4)/(T1+T4)
GF1_WI >α
式中T2、T4为高分1号第一、四波段像素值,α为阈值;
对于有中红外波段的TM数据,可用修正的归一化差异水体指数(MNDWI)进行水体提取,用中红外波段代替NDWI中的近红外波段,进一步加大水体与其他地物分类的差距。计算公式如下:
MNDWI=(T2–T5)/( T2+T5)
MNDWI >α
式中T2、T5为TM影像的第二、五波段像素值,α为阈值。
PIE支持这3个算法的执行,下面对算法功能进行介绍。
2.算法功能实现说明
2.1 实现步骤
第一步 |
算法参数设置 |
第二步 |
算法执行 |
第三步 |
结果显示 |
2.2 算法参数
算法名称 |
水体指数法&单波段阈值法&谱间关系法 |
|
C#算法DLL |
PIE.CommonAlgo.dll |
|
C#算法名称 |
PIE.CommonAlgo.ParaInvThresholdAlgo |
|
参数结构体 |
ParaInvThreshold_Exchange_Info |
|
参数说明 |
||
InputFilePath |
String |
输入文件路径 |
ListBands |
IList<int> |
波段集合 单波段阈值法集合是{4} 谱间关系集合{2,3,1,4} 水体指数{2,4} |
OutputFilePath |
string |
输出文件路径 |
Threshold |
double |
阈值 |
Type |
Int |
类型 0:单波段阈值法 1:谱间关系法 2:水体指数法 |
2.3 示例代码
数据路径 |
百度云盘地址下/ PIE示例数据/栅格数据/01.GF1/洞庭湖水体/ IMG_FE233_20171219_636493846049962321.tif SHP_FE233_20171219_636493846049962321.shp |
视频路径 |
百度云盘地址下/PIE视频教程/10.算法调用/实用工具/缓冲区分析算法.avi |
示例代码 |
|
1 /// <summary> 2 /// 水体指数法、谱间关系法、单波段阈值法 3 /// </summary> 4 public void WaterExtract_NDWI() 5 { 6 PIE.CommonAlgo.ParaInvThreshold_Exchange_Info info = new ParaInvThreshold_Exchange_Info(); 7 info.InputFilePath = @"D:\MapData\Raster\水体提取数据\WR_20171219_A0303_636493863981864520\IMG_FE233_20171219_636493846049962321.tif"; 8 info.OutputFilePath = @"D:\MapData\Raster\水体提取数据\temp\水体指数-阈值法.shp";//输出文件路径 9 info.ListBands = new List<int> {4};//单波段阈值法集合是{4} 谱间关系集合{2,3,1,4} 水体指数{2,4} 10 info.Threshold = 150;//阈值 根据实际算法结果来设置 水体指数法一般在0左右徘徊 11 info.Type = 0;//提取算法类型 0、单波段阈值法 1、谱间关系法 2、水体指数法 12 13 PIE.SystemAlgo.ISystemAlgo algo = PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.ParaInvThresholdAlgo"); 14 if (algo == null) return; 15 16 algo.Name = "单波段阈值法"; 17 algo.Params = info; 18 19 bool result = PIE.SystemAlgo.AlgoFactory.Instance().ExecuteAlgo(algo); 20 if (result) 21 { 22 MessageBox.Show("水体指数法执行成功"); 23 ILayer layer = LayerFactory.CreateDefaultLayer(info.OutputFilePath); 24 if (layer == null) return; 25 m_HookHelper.ActiveView.FocusMap.AddLayer(layer); 26 m_HookHelper.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 27 } 28 }
|
2.4 示例截图
图1:单波段阈值法结果
图2:谱间关系法图
图3:水体指数法(阈值为0.5的情况)