IDL程序1 基础语法与数据处理 授课人:李景刚 手机:13810912337 Email:sharp@ires.cn 北京师范大学资源学院 2004年9月20日
提纲 参考资料 什么是IDL IDL主要功能 IDL集成开发环境 IDL应用程序基础 IDL程序开发过程 IDL的图形图像处理
一、参考资料 在线帮助 http://www.rsi.com http://www.supresoft.com.cn http://www.idlworld.com 参考书 闫殿武,IDL可视化工具入门与提高,机械工业出版社,2003。定价:42.00元 刘光,地理信息系统二次开发教程-语言篇,清华大学出版社,2003。定价:35.00元
二、什么是IDL? Interactive Data Language ——交互式数据语言 主要特征:高级图像处理能力、交互式二维和三维图形技术、面向对象的编程方式、OpenGL图形加速、量化可视化表现、集成数学与统计学算法、灵活的数据输入输出方式、跨平台图形用户界面工具包、连接ODBC兼容数据库及多种程序连接工具等。
三、IDL主要功能 IDL是完全面向矩阵的,因此具有快速分析超大规模数据的能力。 具有高级图像处理能力、交互式二维和三维图形技术。 集成了数学分析和统计软件包,提供强大的科学计算模型。 具有完善的信号处理和图像处理软件包。 IDL GUIBuilder能快速进行界面开发。 最优化输出。 IDL新增加了小波变化工具包,信息损失比FFT小的多。
IDL应用领域 地球科学 医学影像 图像处理 软件开发 大学教学 实验室 测试技术 天文 信号处理 防御工程 数学分析 统计
基于IDL的系列产品 IDL - Interactive Data Language ION - IDL On the Net VIP - Visual IDL Programming ENVI - Environment for Visualizing images RiverTools - Analysis for digital terrain and river network modeling NOESYS - Organize, visualize & share HDF data
IDL内带的例子 IDL>demo回车
四、IDL集成开发环境 菜单栏和 工具栏 工程窗口 多文档面板 输出日志窗口 变量查看窗口 状态栏 命令行
五、IDL应用程序基础 宽松的语法检测机制 分隔符为“,”,而非空格 不分大小写 变量无需事先说明 换行符:$ 注释符:;
2.变量 变量无需事先声明; 变量的名必须以字母开头,可以包括其它字母、数字、下划线、美元符号。最长可达255个字符,但变量大小取决于计算机配置和操作系统; 大小写没有区别,名称中不能有空格; IDL中的保留词不能作为变量的名称。
3.基本数据类型 在数据类型的转换中,如果输出变量类型的字节数少于输入变量类型的字节数,将会发生截断现象。
4.数组 IDL是面向矩阵的语言,几乎所有运算都可以在数组上使用。 数组元素的存储是按列进行的,与其它的语言有区别。 数组下标是从零开始的,如果某些下标超出了范围,则该下标将被转换为在允许范围内的最小或最大的下标值。 被整数除时需要谨慎:当一个整形变量被另一个整形变量除时,IDL程序经常会出错,有可能会出现一个零数组
零数组和索引数组的创建函数
矩阵操作 A=bytarr(512,512) 子区处理: A(*,1)表示第2行的所有列 A(*,1:10)表示第2-11行的所以列 列 行 b=tan(a)+10 子区处理: A(*,1)表示第2行的所有列 A(*,1:10)表示第2-11行的所以列
决定数组性质的函数 函数名称 返回值 N_elements() 数组元素的数目 Variance() 数组的方差 Size() 数组大小和类型的信息 Stddev() 数组的标准差 Min() 数组的最小值 Moment() 平均值、方差、倾斜度、峰度 Max() 数组的最大值 标准差、平均绝对偏度 Mean() 数组的平均值 Total() 数组元素的总和
矩阵操作 A#B 表示 A的列乘以B的行 A##B表示 A的行乘以B的列 Transpose 矩阵转置 a[i,j] = a[j,i] ……
WHERE 函数 Indices=where(data gt 0.4 and data lt 0.5) Data[indices]=1.0
5、IDL程序 批处理:由一系列IDL命令组成,以IDL->@batchfile方式运行。批处理文件运行时并不编译,因此使用控制结构时必须大量使用续行符($),给书写、理解造成困难。 主程序:与批处理相似,但以end结束,以IDL->.run profile方式运行。主程序运行时先编译,因此可以正常使用控制结构。 过程:与主程序相似,但以pro proname开始,以end结束。以IDL->proname方式运行(也可以先运行IDL->.compile proname,编译但不运行)。 函数:与过程相似,但以function fnname开始,以end结束,并以return语句返回一个IDL变量。以IDL->ret=fnname(para_list)方式运行。 在IDL系统中,一个过程或函数即为一个新的IDL命令。 变量作用范围:批处理和主程序方式的变量为全局变量,可以在IDL开发环境中使用。过程和函数的变量为局部变量,只在过程和函数运行过程中有效。
关系运算符 Eq equal to Ne not equal to Le less than or equal to Lt less than Ge greater than or equal to Gt greater than
常用控制语句 Begin – End If – Then – Else Case X of – else – endcase For – Do While – Do Repeat – Until Expr? Expr1:expr2 (条件判断语句)
If语句 If 条件 then 语句 If 条件 then begin 语句 Endif If 条件 then 语句 else 语句 Endif else begin endesle 当特定的条 件为真时, If语句执行 单个语句或 一个语句模 块。
Case语句 Case 表达式 of 情况1: 情况2: 语句 情况3: begin 语句 end else: 语句 endcase 根据一个标量表达式来选取 某个语句或语句块运行。当 表达式和一系列情况中的第 一个匹配成立时,相应的语 句或语句块被执行(只有一 种匹配的情况被识别)。当 语句执行完毕,case语句结 束。如果没有发现匹配的, 那将执行else下的语句或语 句块。如果没有else语句, 此时将发生错误,并且中断 运行。建议都加上“else”。 Case 表达式 of 情况1: 情况2: 语句 情况3: begin 语句 end else: 语句 endcase
For语句 For I = v1, v2 do 语句 For I = v1, v2 inc do 语句 For I = v1, v2 inc do begin 语句 endfor For语句循环执行一个语句或一个语句块,该循环安特定的 步长从初始值上升或下降至结尾值。前面两种形式,每次 循环只执行一个语句;而第三种情况执行一个语句块。在 每一次循环中,I的值以步长inc增加或减少,这依赖于inc 的值是正还是负。没有指定inc,循环则以步长1递增。
While语句 While 条件 do 语句 While 条件 do begin 语句 Endwhile
Repeat语句 Repeat 语句 until 条件 Repeat begin 语句 Endrep until 条件
Return语句 Return, 结果 Return
Switch语句 Switch 表达式 情况1: 情况2:语句 情况3:begin 语句 end else: 语句 endswitch
Case和switch语句的区别 Case语句一旦找到第一种匹配的情况,就不会考虑其他的情况,而switch语句将继续转到下一种情况;没有找到匹配相就要执行else语句,如果没有else语句,case语句会出现错误信息,整个运行停止,switch语句则只停止其自身的执行,而其他语句进行执行。
Switch语句中如果不想向下执行的话,可以加入break语句 x=2 SWITCH x OF 1: PRINT, 'one' 2: PRINT,'two' 3: PRINT, 'three' 4: PRINT, 'four' ENDSWITCH IDL prints: two three four x=2 case x OF 1: PRINT, 'one' 2: PRINT,'two' 3: PRINT, 'three' 4: PRINT, 'four' ENDcase IDL prints: two Switch语句中如果不想向下执行的话,可以加入break语句
Goto语句 使用goto语句可以跳动当前程序单元的指定位置。其形式: Goto, 标号 label: 象其他语言一样,程序中要尽量的避免使用goto语句,最多不超过1次。
Break语句 Break语句执行从for、while、repeat等循环语句或case、switch语句中的下一情况。 语法如下:
Continue语句 Continue语句使for、while或repeat循环得以继续执行。 语法为: continue
Expr? Expr1:expr2 Expr? Expr1:expr2 index=(num ge 10)? 2:4
6、文件的读入输出 处理文件的过程和函数 名称 功能 Openr 打开一个存在的文件,并用于之读 Fstat() 返回一个已打开文件的信息 Openw 打开一个用于读写的新文件 Eof() 检测文件末尾 Openu 打开一个存在地文件,并用于读写 Close 关闭文件 Findfile() 返回当前文件夹中文件的名称 /get_lun 获取逻辑设备号,打开文件 Dialog_pickfile() 图形文件选择器 Free_lun 释放逻辑设备号,并关闭文件
文件读写 读取有格式(ASCII)文件 Readf从有格式文件中读取数据 Printf将数据写入到有格式文件中 例如:读取有格式文件 IDL>openr,lun, ‘input.dat’,/get_lun IDL>data=lonarr(10,100) IDL>readf,lun,data,format=‘(10i6)’ IDL>free_lun,lun
例如:写入一个有格式文件 IDL>data=lindgen(10,100) IDL>openw,lun, ‘output.dat’,/get_lun IDL>printf,lun,data,format=‘(10i6)’ IDL>free_lun,lun
读取无格式(二进制)文件 Readu读取无格式文件(单一数据类型) IDL>file=filepath(‘ctscan.dat’,subdir=‘examples/data’) IDL>openr,lun,file,/get_lun IDL>Data=bytarr(256,256) IDL>Readu,lun,data IDL>free_lun,lun IDL>tvscl,data
将二进制数据写入无格式文件 Writeu将二进制数据写入一个打开的无格式文件 IDL>data=dist(256) IDL>openw,lun, ‘dist.dat’,/get_lun IDL>writeu,lun,data IDL>free_lun,lun 写入文件时一般要加入一个文件头,该文件头记录了文件中包含的数据的大小和类型等信息。使用size函数可以实现这一操作。
常用格式(1) ASCII_TEMPLATE Presents a GUI that generates a template defining an ASCII file format ASSOC Associates an array structure with a file BINARY_TEMPLATE Presents a GUI for interactively generating a template structure for use with READ_BINARY CDF Routines Common Data Format routines EOS Routines HDF-EOS (Hierarchical Data Format-Earth Observing System) routines HDF_BROWSER Opens GUI to view contents of HDF, HDF-EOS, or NetCDF file HDF_READ Extracts HDF, HDF-EOS, and NetCDF data and metadata into an output structure IDLffDICOM Contains the data for one or more images embedded in a DICOM part 10 file IDLffDXF Object that contains geometry, connectivity, and attributes for graphics primitives IDLffShape Contains geometry, connectivity and attributes for primitives accessed from ESRI Shape files MPEG_OPEN Opens an MPEG sequence MPEG_SAVE Saves an MPEG sequence to a file NCDF Routines Network Common Data Format routines PRINT/PRINTF Writes formatted output to screen or file READ/READF Reads formatted input from keyboard or file READ_ASCII Reads data from an ASCII file READ_BINARY Reads the contents of a binary file using a passed template or basic command line keywords READ_BMP Reads Microsoft Windows bitmap file (.BMP) READ_DICOM Reads an image from a DICOM file READ_IMAGE Reads the image contents of a file and returns the image in an IDL variable READ_INTERFILE Reads Interfile (v3.3) file READ_JPEG Reads JPEG file READ_PICT Reads Macintosh PICT (version 2) bitmap file READ_PNG Reads Portable Network Graphics (PNG) file READ_PPM Reads PGM (gray scale) or PPM (portable pixmap for color) file READ_SRF Reads Sun Raster Format file
常用格式(2) READ_SYLK Reads Symbolic Link format spreadsheet file READ_TIFF Reads TIFF format file READ_WAV Reads the audio stream from the named .WAV file READ_WAVE Reads Wavefront Advanced Visualizer file READ_X11_BITMAP Reads X11 bitmap file READ_XWD Reads X Windows Dump file READS Reads formatted input from a string variable READU Reads unformatted binary data from a file SOCKET Opens a client-side TCP/IP Internet socket as an IDL file unit TAPRD Reads the next record on a tape TAPWRT Writes data to a tape WRITE_BMP Writes Microsoft Windows Version 3 device independent bitmap file (.BMP) WRITE_IMAGE Writes an image and its color table vectors, if any, to a file of a specified type WRITE_JPEG Writes JPEG file WRITE_NRIF Writes NCAR Raster Interchange Format raster file WRITE_PICT Writes Macintosh PICT (version 2) bitmap file WRITE_PNG Writes Portable Network Graphics (PNG) file WRITE_PPM Writes PPM (TrueColor) or PGM (gray scale) file WRITE_SRF Writes Sun Raster File (SRF) WRITE_SYLK Writes SYLK (Symbolic Link) spreadsheet file WRITE_TIFF Writes TIFF file with 1 to 3 channels WRITE_WAV Writes the audio stream to the named .WAV file WRITE_WAVE Writes Wavefront Advanced Visualizer (.WAV) file WRITEU Writes unformatted binary data to a file
ENVI环境的直接调用 envi, /restore_base_save_files envi_init, /batch_mode 主要函数: envi_open_file envi_file_query envi_get_map_info envi_get_data envi_write_envi_file
ENVI环境的直接调用 数据文件的读入: filters = ['*.*'] city92file = DIALOG_PICKFILE(/READ, FILTER = filters) envi_open_file, city92file,r_fid=fid ;Geting the ID of the file. if (fid eq -1) then begin envi_batch_exit ;There was an erro, when opening the file. return endif envi_file_query, fid, ns=ns, nl=nl, nb=nb Dims=[-1, 0, ns-1, 0, nl-1] map_info = envi_get_map_info(fid=fid) city92_data=envi_get_data(fid=fid,dims=dims,pos=0) envi_file_mng, id=fid, /remove 数据文件的输出: simu96_f= DIALOG_PICKFILE(/WRITE, FILTER = filters) envi_write_envi_file, simu96,out_name=simu96_f,map_info=map_info
六、IDL图形图像处理 读写数据 导入文本数据 用到ASCIITEMP()和READASCII()函数
选取系统所带的例子:plot.txt文件
2、导入二进制图像 用到BINARY_TEMPLATE()和READ_BINARY()函数
选取系统所带的例子:surface.dat文件
3、保存模板 如果需要读入许多具有同样格式的文本文件或二进制文件,则可以将模板保存起来再利用。 然后调用如下语句恢复模板:
4、读取图像文件 IDL提供了许多读写图像文件的函数,例如read_bmp、read_gif、read_jpeg、read_tiff、read_png、 write_bmp、 write_gif、 write_jpeg、 write_tiff、 write_png等函数。
5、二维坐标图的绘制 Plot函数 x =2*!PI/100*findgen(100) Plot,sin(x)
6、图像增强处理 读入和显示图像 Myimage = read_tiff(filepath('image.tif', $ subdir= ['examples', 'data'])) Tv,myimage;图像源源本本的显示出来,不进行拉伸处理 Tvscl,myimage;显示之前将图像进行拉伸,也就是将图像的颜色值进行拉伸,以充分利用这个地颜色表。
对比增强处理 阈值化 利用EQ、NE、GE、GT、LE和LT,产生二值(黑白)图像。 Tvscl,Myimage GT 140 颜色大于140的显示为白色 Tvscl,myimage LT 140 颜色小于140地显示为白色
拉伸象素值 将局部范围内的象素值拉伸到占据整个显示亮度的范围。 Tvscl,Myimage > 100 大于100的象素 Tvscl,myimage < 140 小于140的象素 Tvscl,myimage >140<200 140~200之间的象素
直方图均衡化 在许多图像中,象素的颜色值只占据整个颜色表的一小部分。将图像转化为在每一颜色上都有相同的象素点数的输出图像,就可以最大化地显示图形信息内容。 TV,Hist_EQUAL(myimage)
平滑图像 Smooth函数可以平滑图像,相当于低通滤波,消除部分的随即噪声。 要确定好计算平均值的模板的大小。 Tvscl,smooth(myimage,7) 用7×7模板平滑图像。
锐化图像 与平滑图像相对,要高亮显示图像中的对象边缘。 方法一:从原始图象中减去该图像的平滑图像。 Tvscl,float(myimage)-smooth(myimage,7) 方法二:IDL提供了微分锐化处理函数,其中最常用的是梯度法。
梯度法中一个是罗伯特梯度法(Robert gradient),对应IDL中的ROBERTS函数。 R=roberts(myimage) Tvscl,R 梯度法中的另一个是索贝尔(Sobel)算子,利用两个核卷积。一个是垂直边缘效应最大,一个是水平边缘效应最大,两个卷积的最大值作为该点的输出值。 So=sobel(myimage) Tvscl,so
Question? Thank you!