遥感图像处理及ENVIIDL操作实践.docx
- 文档编号:30053721
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:32
- 大小:526.95KB
遥感图像处理及ENVIIDL操作实践.docx
《遥感图像处理及ENVIIDL操作实践.docx》由会员分享,可在线阅读,更多相关《遥感图像处理及ENVIIDL操作实践.docx(32页珍藏版)》请在冰豆网上搜索。
遥感图像处理及ENVIIDL操作实践
IDL基本操作介绍
课题名称:
遥感图像处理及ENVIIDL操作实践
任课教师:
一、IDL简介
IDL(InteractiveDataLanguage)交互式数据语言是进行二维及多维数据可视化分析及应用开发的理想软件工具。
作为面向矩阵、语法简单的第四代可视化语言,IDL致力于科学数据的可视化和分析,是跨平台应用开发的最佳选择。
它集可视、交互分析、大型商业开发为一体,为用户提供了完善、灵活、有效的开发环境。
IDL为用户提供了可视化数据分析的解决方案,既可以让科学研究人员交互式浏览和分析数据,又为程序员提供了快速程序原型开发并跨平台发布的高级编程工具。
IDL使科学家无需写大量的传统程序就可直接研究数据。
IDL被广泛应用于地球科学、医学影像、图像处理、软件开发、大学教学、实验室研究、测试技术、天文、信号处理、防御工程、数学分析、统计等诸多领域。
1.Idl特殊符号说明
在IDL程序中,当在命令行中输入命令时,IDL将会识别大量的特殊字符。
下面介绍几种较为重要的特殊符号。
1.1.大写
IDL对字母的大小写并不敏感,但与操作系统打交道的命令(例如:
UNIX操作系统对IDL所打开的文件名的大小写敏感)和执行字符串比较命令时除外。
1.2.注释符
在IDL命令中,分号“;”(英文半角符号)表示注释内容的开始,分号右边的任何文本都被视为是注释,IDL解释器将忽略它。
例如:
protest
;Asimpleprogram
print,"HelloWorld!
",$
"LYT";Thislineprintsamessage
end
1.3.续航符
IDL中的续行符是表示美元的符号“$”。
这表示IDL语句延续到下一语句行(见上例)。
2.IDL语法基础
1
2.
2.1.变量
IDL提供了灵活的数据类型定义方法,在任何时候,IDL都允许用户创建新的变量,或重新定义已有的变量。
变量名必须以字母开头。
它们可以包括其他字母、数字、下划线、美元符号。
一个变量名最长可达255个字符。
变量有两个重要属性:
数据类型和组织结构。
数据类型指出属于数据类型中的哪一种。
IDL提供了非常丰富的数据类型,用户可以实际需求经行选择。
Error!
Referencesourcenotfound.显示了每一种数据类型及其描述,每种类型创建的变量的字节大小、变量创建方式、数据类型之间强制转换的IDL函数名称。
除了数据类型外,每一个变量有一个组织结构。
有效的组织结构有标量(例如单个数值)、矢量(真正的一维数组)、数组(最高可达八维)和IDL结构(能包含各种数据类型的变量和组织结构,结构中独立的组成部分称为字段)。
表1IDL基本数据类型
数字类型变量
数据类型
描述
字节数
创建变量
数据类型函数
byte
字节型
1
Var=0B
thisVar=Byte(variable)
int
16位有符号整型
2
Var=0
thisVar=Fix(variable)
long
32位有符号长整型
4
Var=0L
thisVar=Long(variable)
long64
64位有符号整型
8
Var=0LL
thisVar=Long64(variable)
uint
16位无符号整型
2
Var=0U
thisVar=UInt(variable)
ulong
32位无符号长整型
4
Var=0UL
thisVar=ULong(variable)
ulong64
64位无符号整型
8
Var=0ULL
thisVar=Ulong64(variable)
float
浮点型
4
Var=
thisVar=Float(variable)
double
双精度浮点型
8
Var=
thisVar=Double(variable)
complex
复数
8
Var=Complex,
thisVar=Complex(variable)
dcomplex
双精度复数
16
Var=Dcomplex,00D)
thisVar=DComplex(variable)
非数字类型变量
数据类型
描述
字节数
创建变量
数据类型函数
string
字符串
0-32767
Var=’’或Var=””
thisVar=String(variable)
pointer
指针
4
Var=Ptr_New()
None
objref
对象
4
Var=Obj_New()
None
stuct
结构体
—
—
—
2.2.数组
IDL中可以为任何IDL数据类型创建1—8维的数组。
数组操作的运行速度往往优于循环操作,且语法更为精炼。
在IDL中利用方括号“[]”创建数组。
创建多维数组时可以使用嵌套的方括号。
值的注意的是,IDL中数组元素的存储是按列进行的。
按列存储的方式意味着连续的数组元素也将按顺序被存储,而且数组的第一维(列)变化的最快。
下标的顺序先是列标,后是行标。
IDL的数组下标是从零开始的正值。
数组的下标可以是标量也可以是矢量。
进行下标操作时,如果下标超过了范围,则该下标被转换为在允许范围内的最小或最大的下标值。
例如,创建一维数组vector和多为数组array:
;创建一维数组vector
IDL>vector=[1,2,3]
IDL>help,vector
VECTORINT=Array[3]
IDL>print,vector
;输出IDL输出窗口中将会如下所示:
123
;创建多维数组array
IDL>array=[[1,2,3],[4,5,6]]
IDL>help,array
ARRAYINT=Array[3,2]
IDL>print,array
123
456
IDL的内建函数允许用户按指定的类型创建数组,同时数组中的每个元素都被初始化为灵活索引值(下标值)。
创建和初始化零数组和索引数组的函数见Error!
Referencesourcenotfound.所示。
表2创建和初始化零数组和索引数组的函数
数据类型
零数组
索引数组
byte
bytarr()
bindgen()
int
intarr()
indgen()
long
lonarr()
lindgen()
long64
lon64arr()
l64indgen()
uint
uintarr()
uindgen()
ulong
ulonarr()
ulindgen()
ulong64
ulon64arr()
ul64indgen()
float
fltarr()
findgen()
double
dblarr()
dindgen()
complex
Complexarr()
cindgen()
dcomplex
Dcomplexarr()
dcindgen()
string
strarr()
sindgen()
例如,创建一个七元素的整型零数组和一个六元素的浮点型索引数组:
IDL>zeros=intarr(7);创建一个七元素的整型零数组
IDL>index=findgen(6);创建一个六元素的浮点型索引数组
IDL>print,zeros,index
0000000
3.IDL编程基础
结构化程序设计是在1965年提出的。
它的主要观点是采用自顶向下、逐步求精的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、重复三种基本控制结构构造。
编写IDL程序也需要对IDL中的相关控制语句进行简单介绍。
3.
4.
5.
5.1.定义和编译程序
IDL程序包括过程和函数两种:
(1).过程(pro)
过程一般将几个相关的操作加到一个程序模块中。
过程以pro开头,end结束。
例如:
;过程名test1,参数para1,para2,..
protest1,para1,para2,...
过程语句块
end
(2).函数(function)
函数一般将一个操作加载到一个程序模块中,并返回结果函数以function开头,end结束,并包括一个return语句返回结果。
例如:
;函数名test2,参数para1,para2,..,返回值para1
functiontest2,para1,para2,...
过程语句块
return,para1
end
IDL命令要么是过程,要么是函数。
过程和函数的区别在于:
在过程命令中,参数和关键字仅排列在一个命令行上;在函数命令中,位置参数和关键字参数放在一对圆括号中的。
但是,最重要的区别是IDL函数会返回一个值,等号左边的一个变量用于返回该值。
这是IDL中函数命令和过程命令根本的区别。
函数命令总是返回一个值,这个数值必须赋给一个变量。
函数返回值可能是任何一种IDL变量,包括数值、数组或结构。
5.2.命名和编译源文件
命名一个IDL源文件的标志形式是在过程或函数名称后加上扩展名‘.pro’过程和函数都可以通过“pile”命令进行手动编译或是通过IDLIDE环境进行编译。
当需要时,过程和函数会在运行时自动编译,如果IDL调用的过程或函数之前未被编译过,则IDL会搜索路径下所有的文件夹以搜索源文件的名称。
5.3.程序控制语句
1.
2.
3.
3.1.
3.2.
3.3.
3.3.1.条件语句
(1).IF语句
当特定的条件为真时,if语句执行单个语句或单个语句模块:
•IF条件THEN语句
•IF条件THENBEGIN
语句
ENDIF
•IF条件THEN语句ELSE语句
•IF条件THENBEGIN
语句
ENDIFELSEBEGIN
语句
ENDELSE
在以上的所有行驶中,“条件”是一个标量表达式,其值为真或假。
在前两种形式中,当条件为真时,执行单个语句或语句模块;在后面两种行驶中,当条件为假时,“else”语句将执行单个的语句或语句模块。
(2).CASE语句
CASE语句根据一个标量的表达式来选择某个语句或语句块运行。
CASE表达式OF
情况1:
情况2:
语句
情况3:
BEGIN
语句
END
ELSE:
语句
ENDCASE
当表达式和其中的某个情况匹配,相应的语句被执行,case语句结束,如果没有匹配的情况,那么执行else下的语句,如果没有else语句,将会发生错误,建议在case语句中都加上else。
(3).SWITCH语句
SWITCH跟CASE类似,但与CASE的不同在于它能执行到底。
5.3.1.跳转语句
3.4.
3.5.
3.6.
(1).BREAK
BREAK提供了一个从循环中(FOR,WHILE)或CASE、SWITCH等状态中快速退出的方法。
(2).CONTINUE
CONTINUE提供了一个从循环中(FOR,WHILE,和REPEAT)中进入下一步循环的方法。
以FOR为例,学习下CONTINUE的用法。
1.
2.
3.
3.1.
3.2.
3.3.
3.3.1.
3.3.2.
3.3.3.循环语句
(1).FOR语句
FOR循环运用计数器来多次执行一个或语句块,该循环按特定的步长从初始值上升或下降至结尾值。
•FORI=V1,V2DO语句
•FORI=V1,V2,INCDO语句
•FORI=V1,V2,INCDOBEGIN
语句
ENDFOR
默认条件下增量为1,也可以自定义增量。
(2).WHILE语句
当特定的条件为真,WHILE语句执行单个语句或语句块。
•WHILE条件DO语句
•WHILE条件DOBEGIN
语句
ENDWHILE
二、IDL基本操作介绍
下文以解决一个生态学问题为例,详细讲解IDL基本操作步骤。
4.题目及要求
问题:
现有北美1982-2006年每年的植被返青期数据。
要求:
(1).计算出各像元的线性变化趋势及显著性概率。
(2).统计出各个行政单元(州)内有效物候区中的返青期平均变化趋势。
(3).对线性变化趋势制图输出。
5.解决方案
1
2
2.1数据说明
北美1982-2006年每年的植被返青期数据greenup_1982_2006,共25个波段,每个波段代表每年一景植被返青期数据,影像拍摄时间为每年的第80天或第100天。
影像头文件信息见Error!
Referencesourcenotfound.。
图1北美1982-2006年每年的植被返青期数据
greenup_1982_2006头文件信息
2.2二进制文件读取
4.
5.
5.1.
5.2.
1
2
2.1
2.2
2.2.1文件打开
(1).利用OPEN命令打开二进制文件
IDL中的所有输入和输出都是通过逻辑设备号完成的。
可以把一个逻辑设备设想为一个管道,这个管道连接着IDL和需要进行读写的数据文件。
要从一个文件中读写数据,必须首先把一个逻辑设备号连接到一个特定的文件。
这就是IDL中三个OPEN命令的作用。
OPENR(OPENREAD):
用只读方式打开一个现有的文件。
OPENW(OPENWRITE):
打开一个新文件用于读写。
如果文件已经存在,则其原始文件内容将会被新内容所替代。
OPENU(OPENUPDATE):
打开一个已经存在的文件用于读写。
这三个命令的语法结构是完全相同的。
首先是命令名,后面是一个逻辑设备号和需要与该逻辑设备号相连的文件名。
用法如下:
openr,in_lun,in_filename[,/get_lun]
其中,in_lun代表打开文件的逻辑设备号,可以用户手动赋值,也可以由计算机随机赋值。
in_filename为要打开的文件路径。
/get_lun代表打开文件时,逻辑设备号由计算机随机赋值,而不是用户手动赋值。
当用户打开多个文件时,使用/get_lun可以避免文件号被重复使用而造成的错误。
(2).利用Read_Binary函数打开二进制文件
Read_Binary:
利用已有的模板或者命令行关键字的方式读取二进制文件。
用法如下:
result=read_binary([in_filename]|fileunit, [template=template]|[data_start=value],[data_type=typecodes], [data_dims=array], [endian=string ])
其中,result为读取的数据,in_filename代表输入文件路径,fileunit代表输入文件的文件号,in_filename,fileunit二者选一个输入即可。
template为一个已定义(利用函数创建)的用于描述输入文件类型的模板结构体。
template不可与data_start,data_type,data_dims,endian同时使用。
若使用了template关键字,则Read_Binary函数的返回值为一个与template结构相同的结构体,否则为一个数组。
data_start用于表示数据的起始位置,类似于偏移量。
data_type用于表示数据类型。
data_dims用于表示读入与返回的数据的范围。
endian表示文件字节读取的顺序。
注意:
如果需要打开的文件很大,无法全部读入内存中,则需要根据要求,考虑改变文件的数据排列方式,例如使用BIL、BIP方式。
例如,本例中,目的是获取数据的纵向剖面,因此可以采用BIL、BIP数据排列方式。
由于BIL方式处理数据不需要频繁的读写,因此采取BIL方式更佳。
2.2.2文件读入
利用上述两种方式将文件打开后,利用READU命令可以将文件读入指定的数组中。
READU:
从文件中读取无格式二进制数据到一个IDL变量中。
用法如下:
readu,in_lun,data
其中,in_lun为已经打开的逻辑设备号。
data为已定义的、与打开文件相同数据类型的IDL变量。
2.2.3文件写出
利用WRITEU命令可以将数据写入无格式二进制文件中。
用法如下:
writeu,out_lun,data
其中,out_lun为已经打开的文件逻辑设备号。
data为要写入文件的IDL变量。
2.2.4文件关闭
所有打开的文件,在将数据读入到IDL变量后,都应该及时关闭,释放资源。
以避免不必要的错误出现。
利用FREE_LUN或CLOSE命令可以将打开的文件关闭。
FREE_LUN:
关闭打开的文件,取消分配的逻辑设备号,回收内存资源。
用法如下:
free_lun,in_lun
其中,in_lun为逻辑设备号。
CLOSE:
根据指定参数关闭逻辑设备号。
用法如下:
close,[, unit1,...,unitn][, /][, =variable][, /][, /]
其中,uniti为指定逻辑设备号。
/代表关闭所有打开程序。
代表用已命名的变量variable设置退出状态,不可以和/、/联用。
/代表关闭逻辑设备号为0-99的文件,逻辑设备号大于99的文件将不被影像。
/代表强制关闭文件。
2.2.5IDL程序实现
将数据greenup_1982_2006在IDL中打开的语句如下:
定义输入、输出文件名
greenup_file='E:
\RS_ENVI\chapter04\data\greenup_1982_2006'
out_file='E:
\RS_ENVI\chapter04\data\test\greenup_trend'
;通过查看文件,获取相关信息
;创建输入变量,用来存储greenup_1982_2006的数据
greenup=intarr(400,400,25)
;将greenup_1982_2006文件打开并读入数组greenup中
openr,in_lun,greenup_file,/get_lun
readu,in_lun,greenup
free_lun,in_lun
2.3各像元的线性变化趋势及显著性概率计算
5.3.
1
2
2.1
2.2
2.3
2.3.1计算过程分析
由北美1982-2006年每年的植被返青期数据可知,每个像元都有25个像元值,代表了其每年的返青日期。
因此,用年份(时间)当自变量X,像元值(返青期)当因变量Y,则可以回归出每个像元的返青期线性变化曲线。
曲线的斜率代表了返青期的变化趋势:
斜率小于0代表返青期提前,大于0代表返青期推迟。
对计算结果进行F检验,可以得到每个像元的显著性概率。
2.3.2IDL程序实现
利用IDL程序可以实现上述分析内容,并将计算结果保存的到ENVI文件中。
具体代码如下:
;创建输出变量,用来存储线性趋势和显著性概率数据
;第一波段存储线性趋势,第二波段存储显著性概率,背景值为
trend=make_array(400,400,2,value=;动态创建数组
;创建x数据
x=findgen(25)+
;逐像元计算线性趋势和显著性概率
fori=0,399dobegin
forj=0,399dobegin
y=reform(greenup[i,j,*]);重组
ify[0]eq5000thencontinue;遇到背景值5000跳过
trend[i,j,0]=regress(x,y,ftest=ftest);线性斜率
trend[i,j,1]=(ftest,1,23);显著性概率
endfor
endfor
;输出结果
openw,out_lun,out_file,/get_lun
writeu,out_lun,trend
free_lun,out_lun;结果保存到指定文件中
;输出头文件
zhu_write_envi_header,greenup_file,out_file,bands=2,data_type=4
2.3.3IDL程序分析
上述程序中,主要用到的函数有MAKE_ARRAY、REFORM、REGRESS和F_PDF,命令有OPENW、WRITEU,用户自定义过程ZHU_WRITE_ENVI_HEADER。
下面对它们进行简单介绍,以方便程序理解。
(1).MAKE_ARRAY:
在程序运行时,动态创建数组的函数。
返回值为一个指定类型、维度和初始值的数组。
(2).REFORM:
可以使数组在固定元素个数的前提下,改变下标引用索引的函数。
当指定了返回维数时,函数返回与给定的维度相同的数组,不改变数组总元素个数及元素值。
若没有指定维度,则返回数组的一个副本,当数组中有某一维维度为一时,则将这一维去掉。
(3).REGRESS:
执行多元线性回归的函数,返回归方程的系数组成的列向量。
其参数FTEST代表F-检验的结果值。
(4).F_PDF:
利用FTEST参数进行显著性概率计算的函数。
(5).OPENW:
打开一个新文件用于读写。
如果文件已经存在,则其原始文件内容将会被新内容所替代。
(6).WRITEU:
将数据写入无格式二进制文件中。
(7).ZHU_WRITE_ENVI_HEADER:
用户自定义的一个IDL程序,用于编写一个ENVI头文件。
详细代码见。
2.3.4结果显示
Error!
Referencesourcenotfound.是IDL代码的执行结果,左边为各像元的线性变化趋势,右边为各像元的显著性概率。
图2各像元的线性变化趋势及显著性概率
2.4有效物候区返青期平均变化趋势统计
5.4.
1
2
2.1
2.2
2.3
2.4
2.4.1计算过程分析
本文选取3个示例州如图3所示,计算其内有效物候区中的返青期平均变化趋势。
需要用到的数据有:
(1).各像元的线性变化趋势,文件greenup_trend的第一波段。
(2).物候区文件phenoregion_file,其中每种颜色代表一种物候。
(3).示例州栅格文件state_file,由三个示例州的ROI文件导出得到。
为了计算出示例州内有效物候区中的返青期平均变化趋势,首先需要创建输入变量来存储数据,并将数据读入到变量中(利用上述文件读取方法)。
同时,需要创建变量result存储输出数据。
根据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遥感 图像 处理 ENVIIDL 操作 实践