波段运算(bandmath)工具中数据类型及转换函数
分享
波段运算的强大功能是由IDL的功能、速度和灵活性所提供的。但是要熟练使用波段运算功能,并不需要成为一个熟悉IDL编程的专家。下面的知识可以帮助熟练使用波段运算功能并避免一些经常出现的问题。
1. 注意数据类型
IDL中的数学运算与简单的使用计算器进行运算是有一定差别的。要重视输入波段的数据类型和表达式中所应用的常数。每种数据类型——尤其是非浮点型的整型数据都包含一个有限的数据范围。例如:8-bit字节型数据表示的值仅为0-255,如果对16-bit整型数据波段求和(b1 + b2)并且其值大于255,那么得到的结果将与期望值不等。当一个值大于某个数据类型所能容纳的值的范围时,该值将会溢出(overflow)并从头开始计算,例如:将8-bit字节型数据250和10求和,结果为4。
类似的情况经常会在波段运算中遇到,因为遥感图像通常会被存储为8-bit字节型或16-bit整型。要避免数据溢出,可以使用IDL中的一种数据类型转换功能(参见表15.1)对输入波段的数据类型进行转换。例如:在对8-bit字节型整型图像波段求和时(结果有大于255),如果使用IDL函数fix()将数据类型转换为整型,就可以得到正确的结果。
fix(b1)+ b2
比如我们用BandMath工具合成一个SPOT5的蓝色波段,用于真彩色影像底图的制作。蓝色波段的表达式为:
G:(XS1+ XS2+ XS3)/3
如果band math表达式为:(b1+b2+b3)/3,结果将会溢出(先计算(b1+b2+b3))。
正确的band math表达式:byte((fix(b1)+b2+b3)/3)
你可能会有这样的想法:既然浮点型数据可以表示所有的数据值,为什么不在所有的计算中都使用浮点型数据呢?这是因为一个数据所能表现的动态数据范围越大,它占用的磁盘空间越多。例如:字节型数据的一个像元仅占用1个字节;整型数据的一个像元占用2个字节;浮点型数据的一个像元占用4个字节。浮点型结果将比整型结果多占用一倍的磁盘空间。关于IDL数据类型的占用磁盘空间和数据范围的详细介绍,参考表15.1。
表15.1数据类型及说明
2. IDL数据类型的动态变换
一些数字可以使用几种不同的数据类型表达出来,IDL制定了一些默认规则对这些数据进行解译。因此IDL的数据类型是可以进行动态变换的,也就是说IDL能够将表达式中的数据类型提升为它在表达式中所遇到的最高数据类型。例如:不包含小数点的整型数字,即使它在8-bit字节型的动态范围,也常被解译为16-bit整型数据。如果想为一幅8-bit字节型数据图像加5,并且使用如下的波段运算表达式:
B1 + 5
数据5将被解译为16-bit整型数据,因此波段运算结果将被提升为16-bit整型数据图像(占用8-bit字节型图像的两倍磁盘空间)。如果想保持结果为字节型图像,可以使用数据类型计算函数byte():
b1 + byte(5)
或使用IDL中将16-bit整型数据转换为8-bit字节型数据的缩写:
b1 + 5B
在数据后紧跟一个字母B表示将该数据解译为字节型数据。如果在波段运算表达式中经常使用常数,这些类似的缩写是很有用的。
文章来源:http://blog.sina.com.cn/s/blog_764b1e9d0100ziy9.html
1. 注意数据类型
IDL中的数学运算与简单的使用计算器进行运算是有一定差别的。要重视输入波段的数据类型和表达式中所应用的常数。每种数据类型——尤其是非浮点型的整型数据都包含一个有限的数据范围。例如:8-bit字节型数据表示的值仅为0-255,如果对16-bit整型数据波段求和(b1 + b2)并且其值大于255,那么得到的结果将与期望值不等。当一个值大于某个数据类型所能容纳的值的范围时,该值将会溢出(overflow)并从头开始计算,例如:将8-bit字节型数据250和10求和,结果为4。
类似的情况经常会在波段运算中遇到,因为遥感图像通常会被存储为8-bit字节型或16-bit整型。要避免数据溢出,可以使用IDL中的一种数据类型转换功能(参见表15.1)对输入波段的数据类型进行转换。例如:在对8-bit字节型整型图像波段求和时(结果有大于255),如果使用IDL函数fix()将数据类型转换为整型,就可以得到正确的结果。
fix(b1)+ b2
比如我们用BandMath工具合成一个SPOT5的蓝色波段,用于真彩色影像底图的制作。蓝色波段的表达式为:
G:(XS1+ XS2+ XS3)/3
如果band math表达式为:(b1+b2+b3)/3,结果将会溢出(先计算(b1+b2+b3))。
正确的band math表达式:byte((fix(b1)+b2+b3)/3)
你可能会有这样的想法:既然浮点型数据可以表示所有的数据值,为什么不在所有的计算中都使用浮点型数据呢?这是因为一个数据所能表现的动态数据范围越大,它占用的磁盘空间越多。例如:字节型数据的一个像元仅占用1个字节;整型数据的一个像元占用2个字节;浮点型数据的一个像元占用4个字节。浮点型结果将比整型结果多占用一倍的磁盘空间。关于IDL数据类型的占用磁盘空间和数据范围的详细介绍,参考表15.1。
表15.1数据类型及说明
2. IDL数据类型的动态变换
一些数字可以使用几种不同的数据类型表达出来,IDL制定了一些默认规则对这些数据进行解译。因此IDL的数据类型是可以进行动态变换的,也就是说IDL能够将表达式中的数据类型提升为它在表达式中所遇到的最高数据类型。例如:不包含小数点的整型数字,即使它在8-bit字节型的动态范围,也常被解译为16-bit整型数据。如果想为一幅8-bit字节型数据图像加5,并且使用如下的波段运算表达式:
B1 + 5
数据5将被解译为16-bit整型数据,因此波段运算结果将被提升为16-bit整型数据图像(占用8-bit字节型图像的两倍磁盘空间)。如果想保持结果为字节型图像,可以使用数据类型计算函数byte():
b1 + byte(5)
或使用IDL中将16-bit整型数据转换为8-bit字节型数据的缩写:
b1 + 5B
在数据后紧跟一个字母B表示将该数据解译为字节型数据。如果在波段运算表达式中经常使用常数,这些类似的缩写是很有用的。
文章来源:http://blog.sina.com.cn/s/blog_764b1e9d0100ziy9.html
0 个评论
相关问题
- 作为Desktop用户对数据的获取比较乏力,可能缺了哪些知识?
- 有谁知道哪里可以免费获取各省市地图数据呢,包括详细的shape文件数据
- 用ArcMap输入7参数,从wgs84坐标系转西安80坐标系,转后误差较大,4米左右,请问这是正常的吗?如何能提高转换精度?
- 有栅格数据a(大数据),小数据b,怎么从a中扣掉b,得到a数据剩下的部分?栅格能裁剪取反吗?
- 在windows server2008 R2 64位中安装了portal 10.5 设置好托管arcgis server站点,并用data store为托管数据库,发布数据出错
- cityengine怎么导入arcgis的shp数据,对shp数据有什么要求
- ArcEngine 复制镶嵌数据集
- 相同投影带有/无带号的栅格转换,“平移”与“重投影”是不是等效的?
- 基于ArcGIS的CAD数据向GIS数据转换方法
- 网络分析中用路构建网络数据集的问题
- 市区择房分析时,需要添加字段并将其赋值1或者-1,怎么做? 在开始编辑的时候,总是出现空间参考与数据框不匹配提示,原因是什么?会影响下面的赋值吗?