IDL开发专题-IDL运算符与ENVI波段运算举例
- 格式:doc
- 大小:49.00 KB
- 文档页数:10
146 构。
例如,每一个重复单元可以包含128个字节的文件头,两个100个元素的浮点型矢量和一个100*100的整型数组。
如果是这样,可以建立一个文件关联变量。
键入: OpenR, 10, ‘example.dat’ Info = BytArr (128) xvector = FltArr (100) yvector = FlatArr(100) data = IntArr (100,100) struct = {header: info, x: xvector, y: yvector, image: data} repeatingUnit = Assoc (10, struct) 因为映射到此数据文件相的变量是一个结构变量,因此在它的引用被删除之前,必须对此结构变量进行临时拷贝。
例如,显示文件第三个重复单元的图像部分,可以键入: TempVariable = repearingUnit (2) TvScl, temPvariable.image 按照通常的方式,可以用Free_Lun或Close命令将关联变量和文件之间的联系关闭。
如下: Free_Lun, lun Close, 10文件格式读此类文件的IDL程序写此类文件的IDL程序 BMP Read_BMPWrite_BMP CDF 参考CDF库参考CDF库 DICOM IDLffDICOM对象 IDLffDICOM对象 DXF IDLffDXF对象 IDLffDXF对象 GIF Read_GIF Write_GIF HDF 参考HDF库参考HDF库 HDF-EOS 参考HDF库参考HDF库 Interfile Read_Interfile 无 JPEG Read_JPEG Write_JPEG netCDF 参考netCDF库参考netCDF库 PICT Read_PICT Write_PICT PBM/PPM Read_PPM Write_PPM PNG Read_PNG Write_PNG PostScript无 PS或打印设备 Sun Rasterfiles Read_SRF Write_SRF SYLK Read_SYLKWrite_SYLK TIFF/GeoTIFF Read_TIFF Write_TIFF WAVE Read_WAVE Write_WAVEX11-bitmap Read_X11_Bitmap 无 XWD Read_XWD 无表9:IDL能够读写许多常用的数据文件格式。
ENVI 波段运算的函数和实例波段运算(Band Math)Band MathTM功能允许你处理导致单个波段输出的复杂表达式。
这些数学表达式也可以应用于一个多波段文件中的所有波段,providing “File Math”。
关于使用波段运算的更多信息,请参阅ENVI Programmer’s Guide 第29 页的“Band Math Basics”。
可利用波段运算功能(Available Band Math Functions)Band Math 功能为用户提供一个灵活的图像处理工具,其中许多功能是无法在任何其它的图像处理系统中获得的。
该功能的能力与IDL 语言的能力直接相关。
可用的函数包括但不仅限于表4-2 中列出的数学表达式。
Series andScalar 数学三角函数其它波段运算选项加(+)正弦(sin(x))关系运算符(EQ、NE、LE、LT、GE、GT)减(-)余弦(cos(x))逻辑运算符(AND、OR、XOR、NOT)乘(*)正切(tan(x))类型转换函数(byte,fix,long,float,double,complex)除(/)反正弦(asin(x))IDL 返回数组结果的函数最小运算符(<)反余弦(acos(x))IDL 返回数组结果的程序最大运算符反正切User IDL 函数和程序(>)(atan(x))绝对值(abs(x))双曲正弦(sinh(x))平方根(sqrt(x))双曲余弦(cosh(x))指数(^)双曲正切(tanh(x))自然指数(exp(x))自然对数(alog(x))以10为底的对数(alog10(x))表4-2: 一些可用的波段运算函数。
注意一些有效的IDL 表达式要求整个输入数组存在于内存中,它可以不必与ENVI tiling 操作相兼容。
Band Math 对话框1. 选择Basic Tools > Band Math.将出现Band Math 对话框。
目录Part one:文件读写操作 (1)1、格式化输入与输出(read\print) (1)2、ASCII文件读写 (2)3、二进制文件读写 (5)4、图像格式文件读写 (7)5、科学数据格式读写*** (8)Part two:图形绘制 (11)(一)plot过程绘制 (11)(二)plotg()函数绘制 (12)(三)散点图 (12)(四)柱状图、条形图 (15)(五)绘制颜色条colorbar (17)Part three: ENVI二次开发 (20)1、自定义波段运算函数 (20)2、IDL中常见波段运算 (21)3、ENVI classic 创建自定义菜单 (22)4、ENVI classic+IDL 二次开发................... 错误!未定义书签。
Part one:文件读写操作1、格式化输入与输出(read\print)1)Read:该函数用于从键盘键入数据,默认数据类型为浮点型,若要输入其他类型数据,需要先定义数据类型。
Eg:2)Print:该函数用于将数据输出打印到控制台,这里主要讲格式化控制输出format关键字。
表01 常用格式化控制符2、ASCII文件读写常见ASCII文件:txt、matlab程序文件(*.m)、c程序文件(*.c)、遥感影像头文件(如ENVI格式的头文件*.hdr)1)选择文件:fn = dialog_pickfile(title='选择ASCII文件:',get_path = work_dir)cd,work_dir ;用于跳转到当前工作路径2)查询文件:file_search()函数Eg:查找当前工作路径下所有的txt文件,并返回文件数目*: File_lines(fname)函数用于查询文本文件的行数。
3)打开文件:在IDL中读写ASCII码或者二进制文件,首先需要将文件与一个逻辑设备号关联起来。
语法:openr/openw/openu, lun, fname, /get_lun, width=10,/append4)读写操作:IDL中利用readf函数读取文本文件、利用printf函数写入ASCII文件① Read f, lun, var01, var02….② printf, lun, var01, var02….5)文件关闭:在对文件操作完成之后,需要关闭文件的逻辑设备号,eg: freee_lun,lun EG:*如何获取某个文件你的列数:先读取一行数据,然后利用空格进行字符串拆分;最后利用n_elements()计算元素个数即为ns对于某些遥感数据的头文件前面几行是说明文件,后一部分才是数据的,读取有两种方式:1)定义一个临时变量temp,将说明文字用该变量存储2)直接跳行:skip_lun, lun, 3, /lines ;跳过文件的前三行3、二进制文件读写多数遥感数据的数据文件都是二进制文件。
ENVI+IDL 上机操作一、图像数据的输入与输出(选择、读取、显示、保存)二、辐射定标(波段运算)三、地表温度的反演(单窗算法)一、图像的输入输出1、图像数据的选择与读取(以jpg文件为例)1)jpg文件的选择a、直接获取jpg文件路径语法:Result = FILEPATH( Filename [, ROOT_DIR=string][, SUBDIRECTORY=string/string_array] [, /TERMINAL] [, /TMP] )b、通过对话框打开jpg文件语法:Result = DIALOG_PICKFILE( [,DEFAULT_EXTENSION=string] [, /DIRECTORY] [,DIALOG_PARENT=widget_id] [,DISPLAY_NAME=string] [, FILE=string] [, FILTER=string/string array] [,/FIX_FILTER] [, GET_PATH=variable] [, GROUP=widget_id] [, /MULTIPLE_FILES] [, /MUST_EXIST] [, /OVERWRITE_PROMPT] [, PATH=string] [, /READ | , /WRITE] [, RESOURCE_NAME=string][,TITLE=string] )2)jpg文件的读取(二、三为数组)语法:result=read_image(fname)(借助于前面打开图像操作)语法:Result= DIALOG_READ_IMAGE ( [Filename] [, BLUE=variable][, DIALOG_PARENT=widget_id] [, FILE=variable] [,FILTER_TYPE=string] [, /FIX_FILTER] [, GET_PATH=variable] [, GREEN=variable] [, IMAGE=variable] [, PATH=string][, QUERY=variable] [, RED=variable] [ ,TITLE=string] )(打开读取一步到位)3)jpg文件的显示语法:TV, Image [, Position] [, /CENTIMETERS | , /INCHES] [, /ORDER] [, TRUE={1 | 2 | 3}] [, /WORDS] [, XSIZE=value] [, YSIZE=value]常用代码:window,1,title='彩色图像显示',$xsize=(size(data,/dimension))[2],$ysize=(size(data,/dimension))[2]tv,data,/true或者sz=size(data)ns=sz[2]&nl=sz[2]window,xsize=ns,ysize=nltv,data,true=14)图像文件的保存(写入)主要有两种情况一种是基于ENVI的二次开发envi_enter_data,envi_write_envi_file还有一种是基于IDL语法:WRITE_IMAGE, Filename, Format, Data [, Red, Green, Blue] [, /APPEND]例:IDL>fn=dialog_pickfile(title=’图像文件保存为:’) IDL>write_image,fn,’jpeg’,img二、辐射定标(波段运算)辐射定标公式为:L i=Gain i*DN i+Bias i其中L i为第i波段的辐射亮度;DN i为第i波段的灰度值;Gain i和Bias i 为第i波段定标系数可以使用IDL中的readu命令读入到内存中,然后再调用。
ENVI中利用波段运算计算中值的方法我们经常遇到最大合成的需求,即求取每个像元在各个波段的最大值,生成一个新的波段,即最大合成产品。
波段运算公式很简单,为b1>b2>b3>b4…。
本文解决另外一个类似的需求,即中值合成。
求取每个像元在各个波段的中值,生成一个新的波段。
此时的波段运算公式较为复杂,下面以一个实例来介绍计算方法。
1)以一个Landsat 8 OLI数据为例,计算前6个波段的中值。
首先在ENVI中打开数据;2)在Toolbox中,打开BandMath工具,输入如下公式:fix(median([[[b1]],[[b2]],[[b3]],[[b4]],[[b5]],[[b6]]],dimension=3))注1:fix——将结果转换为与输入数据一致的数据类型,即16位有符号整型。
根据需要可以修改为byte、uint、long、float、double等函数;median——计算中值函数,dimension表示计算维度;[[[b1]],[[b2]],[[b3]],[[b4]],[[b5]],[[b6]]]——将6个二维数组转换为三维数组;注2:当波段数为偶数时,可以设置even关键字,计算中间两个数的均值作为中值,公式变为:fix(median([[[b1]],[[b2]],[[b3]],[[b4]],[[b5]],[[b6]]],dimension=3, /even))3)单击Add to list,点击OK,分别为b1~b6指定波段1~6,设置输出路径;4)查看结果如下图所示。
testMedian2.dat——没有使用even关键字的结果testMedian3.dat——使用了even关键字的结果图:计算结果当前像元6个波段的DN值分别为[595,2100,1138,822,685,709],通过排序可知,两种计算中值方法对应的结果分别为822和765,与上图中ENVI波段运算结果一致。
IDL开发专题-IDL运算符与ENVI波段运算举例运算符是各个语言中必不可少的部分,IDL作为一种基于矩阵运算的语言,实际应用实际应用中运算符操作有很多的技巧。
很多的时候一个语句能实现复杂的功能,这点在波段运算中能够体现出来。
1运算符1.1数学运算符IDL中的数学运算符有加(+)、增运算(++)、减(-)、减运算(--)、乘(*)、除(/)、幂(^)、取余(mod)、取小(<)和取大(>)。
1.1.1增运算和减运算(++、- -)这两个运算跟C里面的是一样的;IDL> var = 20IDL> print,var++20IDL> print,var21IDL> var= indgen(2)IDL> print,var++0 1IDL> print,var1 21.1.2幂运算(^)IDL> var = 2IDL> print,var^416IDL> print,var^532IDL> print,var^24 91.1.3取余运算(mod)IDL> var = 32IDL> print,var mod 4IDL> print,var mod 52IDL> var = [2,3]IDL> print,var mod 20 11.1.4取大和取小运算(> 、<)IDL> var = 32IDL> print,var > 3939IDL> print,var < 3932IDL> var = [20,30]IDL> print,var >2525 301.2逻辑运算符1.2.1&&逻辑的与运算,如果表达式为真或非零则返回1否则返回0。
IDL> PRINT, 5 && 21IDL> PRINT, 5 && 0IDL> PRINT, "sd" && "d"1IDL> PRINT, "sd" && " "1IDL> PRINT, "sd" && ""1.2.2|| 逻辑的或运算I DL> PRINT, 5 || 2IDL> PRINT, 5 || 01IDL> PRINT, 0 || 0IDL> IF ((5 GT 3) || (4 GT 5))THEN PRINT, 'True'1.2.3~逻辑的非运算IDL> print,~3IDL> print,~011.3位运算符IDL中有四个位运算符:AND, NOT, OR, and XOR.。
ENVI/IDL定制和遥感工程化应用实例 本系统是在ENVI的基础上,采用IDL开发的进行塔里木河流域生态监测管理的一个遥感工程系统。
通过使用IDL和ENVI提供的一些API函数,我们能够在很短的时间内开发出一个界面友好,功能强大的生态环境遥感监测子系统。
在此系统中,我们坚持了遥感工程化的理念,将遥感应用与用户的业务流程结合,为用户提供了一个易用、友好的软件环境。
本系统的功能特色简单介绍如下:
1、简洁的系统主界面
在主界面上提供了一些常用的工具软件,所有的功能都做成了下拉条的形式,用户能够很快掌握软件的操作。
2、图形化的数据管理。
通过缩略图用户可以处理、查询本系统管理的所有区域的数据,免去了用户手动查找数据文件的麻烦。
3、向导式的工作流程。
通过对最终用户的业务流程的理解,我们使用IDL构建了用户友好的界面,这些界面将ENVI所提供的一些功能封装起来,使用户在很短的时间内就能够完成他们的工作。
ENVI下实用的波段运算(bandmath)工具ENVI Band Math是一个灵活的图像处理工具,其中许多功能是无法在任何其它的图像处理系统中获得的。
由于每个用户都有独特的需求,利用此工具用户自己定义处理算法,应用到在ENVI打开的波段或整个图像中,用户可以根据需要自定义简单或复杂的处理程序。
例如:可以对图像进行简单加、减、乘、除运算,或使用IDL编写更复杂的处理运算功能。
波段运算实质是对每个像素点对应的像素值进行数学运算。
如图15.1为一个简单波段运算的示意图,运算表达式是三个变量相加,每一个变量对应于一个图像数据,对这三个图像数据求和并输出结果图像。
表达式中的每个变量不仅可以对应于单一波段,也可以是一个多波段的栅格文件。
例如:在表达式b1+b2+b3中,如果b1是一个多波段图像文件,b2、b3为单一波段,则结果为b1所对应的文件的所有波段分别和b2、b3进行求和。
图15.1 波段运算示意图Band Math工具下面以求三个图像数据的和为例介绍Band Math工具的使用。
在使用Band Math之前需要将图像数据打开。
(1)在ENVI主菜单中,选择Basic Tools → Band Math,打开Band Math 对话框(图15.2)。
(2)运算表达式输入框(Enter an expression):b1+b2+b3(3)单击OK按钮,打开Variables to Bands Pairings对话框(图15.3),为运算表达式中各个变量赋图像文件或者图像波段。
(4)在Variables to Bands Pairings对话框中,Variables used in expression列表框中选择变量b1,单击Map variable to Input file按钮,为变量b1指定一个多波段图像文件(注:一旦第一个波段或文件被选中,只有那些具有相同行列数的波段被显示在波段列表中。
)。
ENVI功能扩展本帖最后由 lianyi_dyq 于 2009-4-25 00:06 编辑1ENVI功能扩展ENVI作为功能强大的遥感软件,扩展ENVI的功能包括创建波段和波谱数学函数、自定义数据输入、交互式用户程序和ENVI二次开发等。
ENVI的扩展,包括波段和波谱运算函数,自定义的空间、波谱,或是感兴趣区域(ROI)的处理,用户函数,自定义文件输入程序,批处理,以及其它如报告和绘图工具等。
ENVI提供了一系列工具为程序员使用,能够极大地简化自定义程序的开发,并保持和ENVI一致的外观。
1.1ENVI波段运算和波谱运算对于用户来说,扩展ENVI的功能最简单方法就是使用波段和波谱运算函数。
用户可以交互式通过波段和波谱运算表达式对话框输入大多数的波段和波谱运算函数。
波段运算函数允许用户从任何波段或是文件中输入数据,处理数据,并输出整个波段。
波谱运算函数允许用户从图表或文件中输入波谱数据,处理数据,并输出一个波谱。
这种模式下,所有的数据的输入输出、获取、波段或波谱函数的调用及结果的输出都由ENVI中控制。
因此使用波段或波谱函数进行处理时,用户不需要修改菜单、不必创建参数输入部件,不用执行I/O操作,只需在用户编写的函数中提供数据的计算处理功能。
1.1.1波段运算下图通过三个波段的相加说明了波段运算的处理过程。
表达式中的每一个波段都对应于一个输入的影像波段,对这三个波段求和并输出结果影像。
这个表达式中的每个变量不仅可以对应于单一波段,也可以对应与一个文件。
例如:在表达式b1+b2+b3中,如果b1映射为文件而b2,b3映射为单一波段则结果为b1所对应的文件的所有波段分别和b2、b3进行求和。
波段运算可以方便的进行特定波段的自定义处理,快速高效的使用波段运算需要用户能灵活的应用IDL下的数学运算,编写过程中可参考章节2.2数组和2.7运算符。
波段运算时变量的定义必须以“b”或“B”开头,后面为数字且数字位数不超过5。
ENVI下实用的波段运算(bandmat h)工具ENVI Band Math是一个灵活的图像处理工具,其中许多功能是无法在任何其它的图像处理系统中获得的。
由于每个用户都有独特的需求,利用此工具用户自己定义处理算法,应用到在ENV I打开的波段或整个图像中,用户可以根据需要自定义简单或复杂的处理程序。
例如:可以对图像进行简单加、减、乘、除运算,或使用IDL编写更复杂的处理运算功能。
波段运算实质是对每个像素点对应的像素值进行数学运算。
如图15.1为一个简单波段运算的示意图,运算表达式是三个变量相加,每一个变量对应于一个图像数据,对这三个图像数据求和并输出结果图像。
表达式中的每个变量不仅可以对应于单一波段,也可以是一个多波段的栅格文件。
例如:在表达式b1+b2+b3中,如果b1是一个多波段图像文件,b2、b3为单一波段,则结果为b1所对应的文件的所有波段分别和b2、b3进行求和。
图15.1 波段运算示意图Band Math工具下面以求三个图像数据的和为例介绍Ban d Math工具的使用。
在使用Band Math之前需要将图像数据打开。
(1)在ENVI主菜单中,选择Basic Tools → Band Math,打开BandMath 对话框(图15.2)。
(2)运算表达式输入框(Enter an express ion):b1+b2+b3(3)单击OK按钮,打开Varia bles to Bands Pairing s对话框(图15.3),为运算表达式中各个变量赋图像文件或者图像波段。
(4)在Variab les to Bands Pairing s对话框中,Variabl es used in express ion列表框中选择变量b1,单击Map variabl e to Input file按钮,为变量b1指定一个多波段图像文件(注:一旦第一个波段或文件被选中,只有那些具有相同行列数的波段被显示在波段列表中。
envi-波段运算波段运算实验内容:已知某蚀变矿物在Landsat 7 ETM传感器中的第三波段表现为强反射,第一波段表现为强吸收,请在图像上,增强该矿物的信息,并进行密度分割。
同理提取羟基信息(在第五波段表现为强反射第七波段表现为强吸收)。
步骤:1.先进行波段运算,用b3/b1,值大就表明信息强。
点击主菜单点击basic tools>band math输入运算公式,点击OK出现如图1-1所示对话框,定义如图。
然后进行假彩色密度分割,得到如图1-2所示图像。
经过处理白色部分是矿物分布的区域。
如图所示。
2.进行主成分分析,点击主菜单transform>principal components>forward pc rotation>compute new statistics and rotate选择1345波段进行主成分分析。
出现如图2-1所示对话框,进行设置。
并查看统计数据如图2-2所示.在统计表中的Eigenvector(特征向量表明了各波段对图像贡献的大小)选项中我们观察band3一栏中band2为正band1为负。
这符合我们的要求,强反射正值越大,强吸收负值数值越大,效果越好。
那么就选择band3这一行即波段pc3,对它进行统计分析,点击主菜单basic tools>statistic>compute statistic,找出标准差。
如图2-3所示。
标准差为7.992046(stdev)。
然后对pc3波段进行密度分割,最小值为2倍标准差,即16,最大值保留原有的值。
如图2-4所示。
为输出后图像与密度分割对话框。
图2-4红色区域就是蚀变矿物信息的分布3.提取羟基信息步骤:同上。
先进行波段运算b5/b7,得到如图3-1所示图像然后进行主成分分析用波段1457,统计结果如下,图3-2所示。
我们可以看到PC4符合要求,对其进行统计分析,得到标准差为3.5226如图3-3所示。
科学网-刘杰的博客-[转载]IDL二次开发利用envi入手练习[转载]IDL二次开发利用envi入手练习ENVI/IDL二次开发之遥感影像处理入门练习(转帖水色遥感)1,读取一幅多波段影像的中心点光谱曲线,并plot出来,用中文宋体标示出其经纬度;训练内容:Envi获取影像投影参数,像素点地理位置的方法;熟悉Plot的参数设置;推荐调用函数:envi_pickfile,envi_open_fileEnvi_file_queryEnvi_get_map_infoENVI_PROJ_CREATEENVI_CONVERT_FILE_COORDINATESENVI_CONVERT_PROJECTION_COORDINATESPLotENVI_FILE_MNG源码:pro read01envi_open_file,envi_pickfile(),r_fid=fidenvi_file_query,fid,nb=nb,nl=nl,ns=ns,wl=wlxf=(nl/2)yf=(ns/2)envi_convert_file_coordinates,fid,xf,yf,xmap,ymap,/to_map envi_convert_projection_coordinates,xmap,ymap,envi_get_p rojection(fid=fid),oxmap,oymap,envi_proj_create(/geographic) r = findgen(nb)for i=0,nb-1 do beginr[i]=envi_get_data(/complex,dims=[-1,nl/2,nl/2,ns/2,ns/2],fid=fid,pos=i)print,r[i]endforplot,wl,rprint,nb,oxmap,oymapend2,读取一景TM影像的3、4波段,计算NDVI,用灰度图显示出来,并保存为Envi格式文件;推荐调用函数:envi_pickfile,envi_open_fileEnvi_file_queryEnvi_get_map_infoEnvi_get_dataFloatwindowTvtvsclEnvi_write_envi_fileENVI_FILE_MNG(以上为Envi读写文件常用函数,后文不再详述)源码:pro ndvidemoenvi_open_file,envi_pick_file,r_fid=fidenvi_file_query,fid,nb=nb,nl=nl,ns=nsred=envi_get_data(/complex,dims=[-1,0,ns-1,0,nl-1],fid=fid,pos=2)nir=envi_get_data(/complex,dims=[-1,0,ns-1,0,nl-1],fid=fid,pos=3)ndvi=(float(nir)-float(red))/(float(nir)+float(red)+0.001)envi_write_envi_file,ndvi,out_name='ndvi.img'envi_file_mng,id=fid,/removeend3,读取一景CBERS影像的4个波段,根据LVB变换原理,计算其L、V、B分量并保存;推荐调用函数:envi_pickfile,envi_open_fileEnvi_file_queryEnvi_get_map_infoEnvi_get_dataEnvi_get_sliceFloatPoly_fitEnvi_write_envi_fileENVI_FILE_MNG4,读取2个时相的ETM+影像,去除洪湖湖面范围内的条带(多个波段);推荐调用函数:envi_pickfile,File_searchFile_basenameFile_dirnameenvi_open_fileEnvi_file_queryEnvi_get_map_infoEnvi_get_dataFloatwindowTvtvsclEnvi_write_envi_fileENVI_FILE_MNG5,读取一幅shapefile矢量文件,据此建立一个ROI(Region of Interest),并把边界点输出为csv格式文件,可以选省界shp(细节我也不清);推荐调用函数:IDLffShapeenvi_pickfile,File_searchFile_basenameFile_dirnameenvi_open_fileENVI_DEFINE_ROIENVI_CREATE_ROIENVI_SAVE_ROISOpenwPrintf,(format参数很关键)Envi_file_queryEnvi_get_map_infoFloatENVI_FILE_MNG6,Envi调用MATLAB神经网络工具箱,进行水质反演(暂时不做);附加学习MATLAB,nntool工具箱7,Envi调用6S 大气纠正程序,对ETM+蓝光波段进行大气纠正;推荐调用函数:SpawnOpenrReadfWhileStrposStrmid其他Envi文件读写常用函数,见前面的练习。
基于IDL的遥感影像波段运算1.IDL语言特征在IDL中,矩阵是按照列的方式处理的,即矩阵是以n列、m行的方式表示的,这一点与Fortran语言一样,但与C语言(按m行、n列的维度来标记)表示矩阵的方式不同。
只有熟悉IDL的数据存储、处理的特点,才能方便地进行分析。
以300列、200行的遥感数据band1为例,其数据的记录特征如下:IDL图形坐标band1 DN值坐标图1.IDL中像元坐标与亮度矩阵的对应关系(1)数据按列存储;最先存储的是第一列的数据(图象第一列的像元亮度值),接着是第二列,直至最后一列。
(show:print,data[0,*])(2)采用顺序显示数据的方式。
将第一行的亮度值按顺序从左到右以行的方式显示或存储,不管band1矩阵有多少行、多少列,总是先显示、存储完第一行,然后是下一行。
由于IDL的默认显示宽度是80列,所以在输出窗口中要用几行才能显示完矩阵的第一行亮度值。
然后另起一行显示亮度矩阵的下一行值,直到最后一行。
这一点对于图象显示和分析相当重要。
复习:IDL矩阵的显示方式,data(show:print,data[*,0])(3)默认情况下,图象数组的第一行和第一个元素显示在屏幕的左下角。
后面的行将从下往上显示。
在图形窗口显示图象时,图象的每一个元素在屏幕中显示为一个像素[1]。
在IDL中图象是从下往上画的。
即把band1亮度矩阵的第一行值显示在图象最下端的一行像元中,把band1亮度矩阵的最后一行值显示在图象最上端的一行像元中。
这是图象显示最重要的特征。
区别两幅图象的显示效果:(tvscl,data)与(tvscl,data,300,0,order=1)(4)矩阵转置与图象的关系将矩阵band1转置,(print,(transpose(data))[*,0]),打印转置矩阵的第一行,它在band1中是哪行或哪列?(print,transpose(data)tvscl,data,200,0,order=1结论:按行显示的数据DN,按列显示;按列显示的DN数据,按行显示2.遥感数据的处理与分析31通用的栅格数据存储格式BSQ :波段顺序存储格式。
运算符是各个语言中必不可少的部分,IDL作为一种基于矩阵运算的语言,实际应用实际应用中运算符操作有很多的技巧。
很多的时候一个语句能实现复杂的功能,这点在波段运算中能够体现出来。
1运算符1.1数学运算符IDL中的数学运算符有加(+)、增运算(++)、减(-)、减运算(--)、乘(*)、除(/)、幂(^)、取余(mod)、取小(<)和取大(>)。
1.1.1增运算和减运算(++、- -)这两个运算跟C里面的是一样的;IDL> var = 20IDL> print,var++20IDL> print,var21IDL> var= indgen(2)IDL> print,var++0 1IDL> print,var1 21.1.2幂运算(^)IDL> var = 2IDL> print,var^416IDL> print,var^532IDL> print,var^24 91.1.3取余运算(mod)IDL> var = 32IDL> print,var mod 4IDL> print,var mod 52IDL> var = [2,3]IDL> print,var mod 20 11.1.4取大和取小运算(> 、<)IDL> var = 32IDL> print,var > 3939IDL> print,var < 3932IDL> var = [20,30]IDL> print,var >2525 301.2逻辑运算符1.2.1&&逻辑的与运算,如果表达式为真或非零则返回1否则返回0。
IDL> PRINT, 5 && 21IDL> PRINT, 5 && 0IDL> PRINT, "sd" && "d"1IDL> PRINT, "sd" && " "1IDL> PRINT, "sd" && ""1.2.2|| 逻辑的或运算I DL> PRINT, 5 || 21IDL> PRINT, 5 || 01IDL> PRINT, 0 || 0IDL> IF ((5 GT 3) || (4 GT 5))THEN PRINT, 'True'1.2.3~逻辑的非运算IDL> print,~3IDL> print,~011.3位运算符IDL中有四个位运算符:AND, NOT, OR, and XOR.。
1.3.1位加运算符(AND)IDL> print,5 AND 640110 ← 50111 ← 6————————0110 ← 41.3.2位取反运算符(NOT)IDL> print,not 1-21.3.3位或运算符(OR)IDL> print,5 or 10150101 ← 5————————1111 ← 151.3.4位与或运算符(XOR)IDL> print,3 XOR 560011 ← 30110 ← 5————————0110 ← 61.4关系运算符IDL中的关系运算符包括EQ、NE、GE、GT、LE、LT几个,关系运算符返回的是真―True‖或假―False‖。
1.4.1EQ(Equal to)等运算符,如果运算符两边相同则返回真,否则返回假;IDL> print,2 EQ 2.01IDL> var = [2,3]IDL> print,var eq 21 01.4.2NE(Not Equal to)不等运算符,如果运算符两边不等则返回真,否则返回假;IDL> print,2 NE 2.0IDL> print,2 NE 11IDL> var = [2,3]IDL> print,var ne 20 11.4.3 GE(Greater than or equal to)大于等于运算符,如果运算符两边左边大于等于右边则返回真,否则返回假;IDL> print,2 GE 11IDL> var = [2,3]IDL> print,var ge 21 11.4.4 GT(Greater than)大于运算符,如果运算符两边左边大于右边则返回真,否则返回假;IDL> print,2 GT 11IDL> var = [2,3]IDL> print,var gt 20 11.4.5LE(Less than or equal to)小于等于运算符,如果运算符两边左边小于等于右边则返回真,否则返回假;IDL> print,2 LE 1IDL> print,2 LE 121IDL> var = [2,3]IDL> print,var le 31 11.4.6 LT(Less than)小于运算符,如果运算符两边左边大于右边则返回真,否则返回假;IDL> print,2 LT 1IDL> print,2 LT 121IDL> print,2 LT 2IDL> var = [2,3]IDL> print,var lt 31 01.4.6 数组间运算IDL> a =[2,3,5]IDL> b = [1,4,5]IDL> print,a GE b1 0 1IDL> b = [1,4,5,6]IDL> print,a GE b1 0 1IDL> print,a LE b0 1 11.5数组运算符1.5.1#数组乘(列乘行) IDL> PRINT, array11 2 12 -1 2IDL> PRINT, array21 30 11 1IDL> PRINT, array1#array27 -1 72 -1 23 11.5.2##矩阵乘(行乘列) IDL> PRINT, array11 2 12 -1 2IDL> PRINT, array21 31 1IDL> PRINT, array1##array22 64 71.6其他运算符1.6.1小括号()表达式组合和控制一系列表达式的优先级;IDL> PRINT, 3 + 4 * 2 ^ 2 /211IDL> PRINT, (3 + (4 * 2) ^ 2 / 2)351.6.2中括号[]数组的连接或元素调用;IDL> C = [0, 1, 3]IDL> PRINT, [C, 5]0 1 3 5IDL> PRINT, C[2]31.6.3条件表达式?:该运算符的用法是:value = expr1 ? expr2 : expr3如果expr1是true,那么 value 等于expr2否则value = expr3. IDL> A=6 & B=4IDL> print,(A GT B) ? A : B61.6.4对象方法调用符->oWindow->Draw1.6.5指针引用符*指针调用符为*,调用格式为*指针变量。
IDL> point1 = ptr_New(34)IDL> print,*point1342运算符波段运算举例2.1 数据小于0的赋予0 b1>02.2数据值小于0的赋予-999(b1 LT 0)*-999+(b1 GE 0)*b1(b1 LT28.5)*(-3.27*0.00000001*b1^7+3.4132*0.000001*b1^6-1.348*0.0001*b1^5+2.462*0.001*b1^4-0.0205*b1^3+0.0617*b1^2+0.2749*b1+1.2956)+(b1 GE 28.5)*4+(b1 GE 38.5)*b1(-3.27*0.00000001*b1^7+3.4132*0.000001*b1^6-1.348*0.0001*b1^5+2.462*0.001*b1^4-0.020 5*b1^3+0.0617*b1^2+0.2749*b1+1.2956)2.3 三个波段求平均值,如该波段小于0则不参加运算。
如某点b1:4;b2:6;b3:0;那平均值ave =(b1+b2+b3)/(1+1);( b1>0+b2>0+b3>0)/( ((b1 ge 0) + (b2 ge 0)+(b3 ge 0)) >1)2.4两幅图像,图像1波段b1中的云部分(象元值大于200)用图像2的波段b2代替(b1 GT 200)*b2+(b1 LE 200)*b12.5波段分段赋值,如B1中小于0部分等于0,b1中值在[0,10]之间赋为原数值的100倍,如果b1值大于10则赋为原数值的10倍。
(b1 LE 0)*b1>0 +((b1 ge 0)and (b1 le 10))*b1*100+ (b1 gt 10)*b1*102.6波段运算为图像的选择性更改和来自多幅图像的数据结合提供了简单的方法。
在下面的示例中,把两幅图像结合起来进行处理,从而从图像中消除云的影响。
在图像b1中,像元值大于200的像元被认为是云,希望用图像b2中的相应像元对它们进行替换。
(b1 gt 200)* b2 +(b1 le 200)* b1用类似的运算表达式,可以将一幅图像的黑色背景变成白色背景:(b1 eq 0)*255+(b1 gt 0)*b12.7下面的示例是一个较为复杂的表达式。
该表达式使用几个标准来生成一幅二进制掩膜图像,用于识别主要为云的像元。
该算法可以应用于经过定标的AVHRR日间图像中生成云的掩膜图像。
在该表达式中,b4(热红外波段)值必须为负,或b2(反射波段)值必须大于0.65并且b3和b4(中红外和热红外波段)的差值必须大于15度。
由于关系运算符为真值(关系成立)返回1值,因此生成的掩膜图像在有云处值为1,在其他区域值为0。
(b4 lt 0)or(b2 gt 0.65)AND(b3 – b4)gt 152.8 会做最大/最小合成,最大或者最小合成值通常是指从几个图像中取最大或者最小像元值重新生成一副新的图像,比如几个时相的温度、植被指数或者植被覆盖度的合成。
如下为合成9个波段的最大合成值:b1>b2>b3>b4>b5>b6>b7>b8>b9。