650 likes | 845 Views
可视化的 IDL 工具 Interactive Data Language 中科院计算机网络信息中心 超级计算中心 谢茂金 Email: xiemaojin@sccas.cn 2010.9. IDL 概况 IDL 是什么? IDL 的特点 IDL 能干什么? IDL 支持的文件格式 IDL 图像处理简介 IDL 程序导读与语法解析 变量、数组、过程、函数、输入输出、循环、分支、判断等语法基础。. 可视化的 IDL IDL 图形系统 IDL 坐标系统 数据可视化:绘制线 Plot ,等值线,面,体绘制 智能工具 iTools 并行 IDL 简介
E N D
可视化的IDL工具 Interactive Data Language 中科院计算机网络信息中心 超级计算中心 谢茂金 Email: xiemaojin@sccas.cn 2010.9
IDL概况 IDL是什么? IDL的特点 IDL能干什么? IDL支持的文件格式 IDL图像处理简介 IDL程序导读与语法解析 变量、数组、过程、函数、输入输出、循环、分支、判断等语法基础。 可视化的IDL IDL图形系统 IDL坐标系统 数据可视化:绘制线Plot,等值线,面,体绘制 智能工具iTools 并行IDL简介 进一步学习IDL 内容提要
IDL是什么 • IDL(Interactive Data Language,交互式数据语言)是美国ittvis公司的旗舰产品,它既是对数据进行可视化表现、分析及应用开发的软件,又是面向矩阵、语法简单的第四代可视化计算机语言。是进行数据分析、可视化表达与跨平台应用开发的理想工具。 • IDL用户涵盖NASA、ESA、NOAA、Siemens、GE Medical、Army Corps of Engineers、MacDonald Dettwiler 等。 • NASA选用IDL进行飞越火星航空器的研究,JPL科学家利用IDL对“勇气号”和“机遇号”的数据进行数据分析和处理。
IDL的特点 • IDL=VC 菜单的定制、消息传递 • IDL=VB 可视化界面的设计、语言通俗易懂、编程入门容易 • IDL=JAVA具有良好的跨平台能力,方便移植,面向对象特性 • IDL=FORTRAN+C语言风格绝大部分继承自Fortran,少量来源于C。面向矩阵,执行效率高,代码量比C和Fortran少得多,简洁而不失灵活性。 • IDL=MATLAB提供了大量封装和参数化了的数学函数及各种信号处理的方法,使用方法也非常类似。 • IDL=OPENGL 提供了丰富的二维、三维图形图像操作类,能高效快速地对数据进行可视化。
IDL支持的文件格式 • 文本格式:Readf, Read_ascii, Printf • 二进制格式:Readu, Read_binary, Writeu • 科学数据格式: • CDF:begin with the prefix "CDF_" • HDF4: begin with the prefix "HDF_" • HDF5:begin with the prefix "H5_" or "H5*_" • HDF-EOS:begin with the prefix "EOS_" • NetCDF:begin with the prefix "NCDF_".
原图 SMOOTH(image, [1, 1, 21]) SMOOTH(image, [1, 21, 1]) SMOOTH(image, [1, 5, 5]) 图像处理 • IDL提供了具有强大的图像处理能力。 • 支持多种文件格式,只要用Read(Write)_Image两个函数,即可读写IDL支持的任何图像文件。也可以用Dialog_Read(Write)_Image交互读取。TV函数即可显示图像。 • 提供了方便的傅里叶变化,小波变换,Hough变换,Radon变换等,各种图像增强滤波操作,形态学操作,图像分割、识别等丰富的图像处理和分析函数。 • 图像也是数组,所以各种可以处理数组的函数也可以用于图像数据的处理。
原图 SMOOTH(image, [1, 1, 21]) SMOOTH(image, [1, 21, 1]) SMOOTH(image, [1, 5, 5]) 图像处理例子 • file = FILEPATH('rose.jpg', SUBDIRECTORY = ['examples', 'data']) • image = READ_IMAGE(file) • imageSize = SIZE(image, /DIMENSIONS) • DEVICE, DECOMPOSED = 1 ;Decomposed={0|1}伪彩色/真彩彩色 • WINDOW, 0, XSIZE = imageSize[1], YSIZE = imageSize[2], $ TITLE = ‘Original Rose Image’ • TV, image, TRUE = 1 ;True={1|2|3} 对应 (3,m,n),(m,3,n), (m,n,3) • WINDOW, 1, XSIZE = 3*imageSize[1], YSIZE = imageSize[2], $ TITLE = 'Vertically Smoothed (left), Horizontally ' + $ 'Smoothed (middle), and Both (right)‘ • smoothed = SMOOTH(image, [1, 1, 21]) • TV, smoothed, 0, TRUE = 1 • smoothed = SMOOTH(image, [1, 21, 1]) • TV, smoothed, 1, TRUE = 1 • smoothed = SMOOTH(image, [1, 5, 5]) • TV, smoothed, 2, TRUE = 1 ; Display the results. RGBRGBRGB…….RGB RRRRRRRRRR….RRR GGGGGGGGG….GGG BBBBBBBBBB…...BBB …………………………… RRRRRRRRRR….RRR GGGGGGGGG….GGG BBBBBBBBBB….BBB TVScl 函数、过程、参数、关键字、返回值; 函数和过程统称为例程 routines
IDL程序导读与语法解析 编译和 执行 在shell下: [scxiemj@v3904 ~]$ idlde 即可打开IDE 控制台显示输出结果 显示用户变量和系统变量 在此输入命令
直接敲入idl,运行命令行形式的IDL 分号后面的为注释 Indgen(3,4)生成3列4行的二维数组,每个元素的值依次递增,注意是按列存储。
程序导读与语法解析 • IDL程序的几种运行方式 • 命令行程序:命令行下:.RUN>-代码>END。.GO运行 • 批处理文件:在文本文件中输入代码,保存为.pro文件。@FileName运行 • 日志文件:命令行下: JOURNAL>代码>JOURNAL。@FileName运行。 • 包含文件:包含一系列IDL命令的文本文件,默认扩展名为.INC。在其他文件中用@FileName.inc的方式调用。 • 主程序文件:命令序列,以END结束,保存为.pro,<F5>, .GO, .RUN或.RNEW命令运行,不能在命令行直接输入文件名运行。 • 过程、函数、过程文件的编写和执行
大小写不敏感 弱类型,赋值和类型提升 矩阵:列优先 常用功能符号 注释 ; 续行 $ 断句 & IDL程序设计基础
一个简单程序 • 该程序读入一小一大两个整形数给变量a和b,将a和b之间的奇数存储到一个数组中,并统计数组元素的总和
过程:以保留字Pro开头,End结尾,其基本格式如下:过程:以保留字Pro开头,End结尾,其基本格式如下: Pro过程名,[参数1,…,参数n],[关键字1,…,关键字n] 命令序列…. End 3B 128L 16384LL 3.14159D 7U 4UL 100ULL BytArr IntArr LonArr FltArr DblArr ComplexArr 分支、循环 数组函数:求和
过程文件 1)过程文件用来存放多个IDL过程和函数,其扩展名为.pro 2)主文件名可以与某个过程名相同,也可以不同,若相同,则该过程必须放在过程文件的最后 3)过程文件编译(CTRL+F8)后,可以按照过程和函数的调用方法任意调用过程文件中的过程和函数。
过程文件的编译(CTRL+F8)和调用 过程文件的编译及过程调用
基本数据类型 • 数据类型 【十进制后缀】(占用字节) • Byte【nB】(1字节) 4B, 12B; • Int【n或nS】 及 无符号整形【nU或nUS】(2字节) -6, 8S; • Long Int【nL】及无符号长整型nUL(4字节)。 -128L,4UL • 64位长整型nLL及64位无符号长整型nULL。(8字节) 94LL, 12ULL。 • Float【n.或.nF或n.n或nE或nEsx】(4字节)3.14, 0., 3.14E12 • Double 【n.或nd或n.n或nE或nDsx】(8字节)3.14D, 3.14D • Complex 【无】(单精度8字节,双精度16字节)complex(1.7,1.44),complex(1.44D, 4.7D) • String 【无】’hello IDL’ “I’m a string!”
数据类型代码表 • 代码 名称 数据类型 • 0 Underfined Undefined • 1 Byte Byte • 2 Int Integer • 3 Long Longword integer • 4 Float Floating point • 5 Double Double_precision floating • 6 Complex Complex floating • 7 String string • 8 Struct Structure • 9 DComplex Double_precision complex • 10 Pointer Pointer • 11 ObjRef Object reference • 12 UInt Unsigned integer • 13 ULong Unsigned Longword integer • 14 Long64 Longword 64-bit integer • 15 ULong64 Unsigned 64-bit integer
常量 • 字符型常量:又称为字符串,用“”或‘’界定“IDL7.1”, “12-47”, “I’m OK”, ‘2010/09/13’ • 数值型常量: 1.414,3.14159265D, 0L,COMPLEX(1.4, 2.03) • 逻辑型常量:真和假,判断为真的情况如下: • 字节型、整形和长整型的奇数;如43B, 5, 1L 为真。44B, 0, 4L等为假 • 非零的浮点型、双精度、和复数类型;如5.4f,complex(4.1, 0) • 非空的字符串。如‘abc’,而空字符串 ”” 为假
系统变量 • 系统变量:以感叹号!开头。如!PI (π) • 内部系统变量:由系统自动提供、自动生成和维护的一组特殊变量。 • 自定义系统变量:用户根据需要自定义,用于描述系统运行中的状态或用于某种特殊用途。 • DEFSYSV, ‘var1’, expression[,Read_Only] • DEFSYSV, ‘var1’, EXISTS = var2
系统变量 带锁,表示只读不写 !DTOR 0.017453292 !PATH D:\\Program File... 可用AddPath命令增加搜索路径 !PI 3.1415927 !PROMPT IDL>
内存变量 • 临时存储于内 存中的变量,例: IDL> a=4.0D IDL> b=2.4L b=2.4L ^ % Syntax error. IDL> c=1.4 IDL> p=ptr_new(c)
查看变量 • print[,exp1,exp2,…,expn][,FORMAT=format] • a=3.0D & b=4L • print,a, a+b, a/2, FORMAT=(‘I4, I4, I4’) • help, exp1, exp2, …, expn[,NAMES=“通配符”] [,OUTPUT=var] [,/SYSTEM_VARIABLES][,/STRUCTURES] • help, a, output = myVar ;把变量a的信息存入myVar中 • help, NAME = ‘a*’ ;显示所有以a开头的变量信息 • help, !D, /STRUCTURES ;显示系统变量!D的结构信息
变量的存储、释放与恢复 • 保存:将有价值的内存变量[和编译程序及函数]保存到文件中,以备下次继续使用。 • SAVE[,var1,…,varn] [,/ALL] [,/COMM,/VARIBLES] [,COMPRESS][,FILENAME=‘文件名’] [,/ROUTINES] [,/SYSTEM_VARIBLES] • 释放:关闭所有文件,释放所有用户定义的变量、指针、对象等,初始化IDL环境 • .RESET_SESSION • .FULL_RESET_SESSION ;+卸载所有动态库 • 恢复:将之前保存在文件中的内存变量[和编译程序及函数]恢复到内存中继续使用。 • RESTORE[[,”文件名”] | [,FILENAME=“文件名”]] 【注】若不写文件名的话,save时将保存到idlsave.dat中,restore时将从idlsave.dat中恢复
数组 • 按列存储,允许使用1~8维数组 • 数组创建 1)直接创建(能创建1~3维)数组名=[表达式表] • myArray = [21, 10, 6, 6, 4, 9] • myArray = [[21, 10, 6], [6, 4, 9]] ;2行3列 • myArray = [ [[1, 2, 3], [4, 5, 6]] , [[7, 8, 9], [10, 11, 12]]] ; 3列2行2层,下标顺序为 [列,行,层] myArray[0,0,0]=1 myArray[1,0,0]=2 myArray[2,0,0]=3 myArray[0,1,0]=4 myArray[1,1,0]=5 myArray[2,1,0]=6 myArray[0,0,1]=7 myArray[1,0,1]=8 myArray[2,0,1]=9 myArray[0,1,1]=10 myArray[1,1,1]=11 myArray[2,1,1]=12
数组 • 数组创建 2)用函数创建(1~8维)数组初值为0的函数 • myArray = fltArr(d1[,…,d8][,/NOZERO]) • myArray = fltArr(3,4) ;创建一个3列4行的浮点数组 • /NOZERO创建数组的初值为不确定值 【注:】像fltArr这样的函数还有BytArr(), IntArr(), uIntArr(), LonArr(), uLonArr(), Lon64Arr(), uLon64Arr(), DblArr(), ComplexArr(), DComplexArr(), StrArr()用于创建各种类型的数组
数组 • 数组创建 3)用函数创建(1~8维)数组初值为索引号的函数 • IndGen(d1[,…,d8][,/*]|[TYPE=value]) ;*代表某个数据类型,可以是Byte,complex,dcomplex, double, float, L64, Long, String, Uint, UL64, Ulong.这种方法通过关键字来确定数组类型,value取[0,15]表示16种类型 • 像FIndGen的方法还有BIndGen,UIndGen, LIndGen, ULIndGen, L64IndGen, DIndGen, CIndGen, DCIndGen, SIndGen 4)Replicate(exp, d1[,…,d8])用来创建一个所有数组值均是表达式的值的一维或多维数组
数组 • 赋值和引用
小心:二维下标数组的方式可能会让你感到失望!二维下标数组会被IDL拆解成一维下标数组小心:二维下标数组的方式可能会让你感到失望!二维下标数组会被IDL拆解成一维下标数组 ? 用二维的下标数组可以吗 数组 • 赋值和引用
数组操作 常用的函数 • 求和total(myArray[*:10, 10*4]) • 求最大/最小值 Max(myArray, MIN=myMin) • 元素个数N_Elements(myArray) • 数组尺寸Size;维数、列数、行数、类型、元素个数 • Mean平均值、Variance方差、StdDev标准偏差 • Monent计算数组的平均值、方差、倾斜度、峰值、平均绝对偏差、标准偏差 • Where返回满足指定条件的数组元素下标所组成的一维数组 • Reform在不改变数组元素的前提下重新生成新的维数的数组
常用运算符 • 数值运算:()圆括号 +加 ++自加 –减 --自减 MOD模 *乘 /除 ^乘方 [ ]数组或下标 <求最小 >求最大 #矩阵列乘 ##矩阵行乘 • 关系运算符:EQ等于 LT小于 GT大于 NE不等于 LE小于等于 GE大于等于 • 逻辑运算: ~逻辑非 &&逻辑与 ||逻辑或 NOT按位非 AND按位与 OR按位或 XOR按位异或 • 赋运算: = ##= *= += -= /= AND= EQ= GE= GT= LE= LT= MOD= NE= OR= XOR= <= >=
常用控制语句 • Begin – End • If – Then – Else • For – Do • While – Do • Repeat – Until • Case X of – else – endcase • Expr? Expr1:expr2 (条件判断语句)
可视化的IDL • IDL图形系统 • 直接图形系统和对象图形系统 • 坐标系统 • 窗口系统 • 数据可视化
IDL的图形系统 之直接图形法和对象图形法 • 直接图形法: 创建2D图形时常用,如:plot, mapping, contours。简单、快速,但需反复重画,依赖于当前图形设备; • 对象图形法: 加速3D系统显示,灵活,交互性强,充分控制对象,对象驻留内存,不需反复重画。 • 对象管理:生成Obj_New,销毁Obj_Destroy,有效性查询Obj_Valid • 对象属性:获取GetProperty,设置SetProperty
Graphics Atom Graphics Atom Model Model View View Scene 对象图形系统的类和对象 • 显示:*Window (*代表前缀IDLgr) • 容器:*Scene, *View, *ViewGroup。 • 模型:*Model,是容器对象的子对象,起承上启下作用 • 图元:*Image, *Surface, *Axis, *Countoure,*Polyline, *Ploygon, *Light, *Volume • 属性:*Clipboard,*Font,等无法直接显示的属性 • 利用容器和模型对象的add方法构造右图所示的结构,利用 *Window对象的draw方法绘制容器对象的内容。 对象图形系统 组成结构和调用
图形系统之坐标系统 • IDL提供了三种独立的坐标系统: • 数据坐标系统:通常与数据范围相同,可以是线性、对数或半对数的,系统默认的坐标系统 • 设备坐标系统:选定设备的实际坐标系统 • 归一化坐标系统:将数据坐标系统或设备坐标系统中行列数据范围归一化到[0,1]范围。 • 坐标系统之间的互相转换 • 数据坐标系统、设备坐标系统、归一化坐标系统间:CONVERT_Coord(x[,y [,Z]], [,/Data|,/Device, /Normal], [,/Double][,/To_Data| ,/To_Device,|/ To_Normal]) • 笛卡尔坐标、极坐标、柱面坐标和球坐标系统间:CV_Coord([,/Degrees][,Double][,From_Cylin=cyl_coords| ,From_Polar=pol_coords| ,From_Rect=rect_coords| , From_Sphere=sph_coords] [,/To_Cylin|,/To_Polar|,/To_Rect, /To_Sphere]
窗口系统 • 建立:myWin = OBJ_NEW(‘IDLgrWindow’,[关键字=属性] …) • 绘制:*Draw[,IDLgrView | IDLgrViewGroup | IDLgrScene对象] (*代表myWin->[IDLgrWindow::]) • 清除:*Erase [,color= index | [R,G,B]] • 显示/隐藏:*Show, 0 | 1 • 最小化/还原:*Iconify, 1 | 0 • 删除:*Clean,OBJ_Destroy • 窗口对象的下一级对象是IDLgrView,可以设置IDLgrView对象的属性来修改view的大小和位置、投影方式、裁剪平面和裁剪方式、进行几何变换
数据可视化 • 绘制线Plot,多线oPlot, 无坐标轴多线Plots • 绘制等值轮廓线Countour • 绘制网格面Surface,阴影曲面Shade_Surf • 绘制投影曲线Plot_3DBox • 体绘制IDLgrVolume,xVolume • 绘制坐标轴Axis • 绘制文本XYOUTS • 绘制条形图Bar_Plot • 交互文本标注Annotate • 交互控制trackball
线的绘制 • 绘制线Plot • Plot,[X]Y[,关键字] • X | Y: 绘制线的 X | Y 轴坐标组成的数组。在绘图时X和Y被转换成Double数组 IDL> x=Findgen(101)*(0.01*2.0*!PI) IDL> y = Sin(x) Plot, x, y Plot, y Plot, x, y Plot, y
线的绘制 • Plot有几十个关键字用于控制绘制的属性,包括线的虚实粗细,图形符号,颜色,位置,裁剪;标题文字及相应字体;坐标轴及其刻度的粗细长短宽窄朝向;所用的坐标系统及其缩放等每一个细节。
线的绘制 • Plot部分关键字和使用方法 • /ISOTROPIC:强制把X轴和Y轴转换成等比例 • /Polar:绘制极坐标下的线。这时格式为 Plot, r, theta, /Polar • /THICK=value:设定绘制线的粗细,默认为1 • /XLog,/YLog:用于创建对数X|Y数轴 • Max|Min_Value=value:绘制数据的最大|最小值 • nSum=value:每个value个值绘制一个点 • Background | Color=value:设定背景|前景色 • PSYM=integer{-10~10}:按指定图形符号绘制数据点 • LineStyle=integer{0~5}:0实线,1点,2虚线,3点虚线,4点点虚线,5长虚线
IDL> r=findgen(100)*0.01 IDL> t=4.0*!Pi*rIDL> Plot, r, t, /polar pSym=-2 pSym=5
OPlot绘制多线 • OPlot使用方法与Plot的用法基本相同,区别在于连续使用OPlot时,可以在同一个坐标系中绘制多条直线或者曲线,而不擦除原有内容。相当于Plot加了/NoErase关键字。 • x=findgen(101)*(0.01*2.0*!PI) • Plot, x, sin(x) • OPlot, x, cos(x), pSym=-2 • OPlot, x, sin(x)*cos(x), $ • linestyle=5, Thick=4
Plots绘制无坐标多线 • Plots使用方法与Plot的用法基本相同,区别在于连续使用Plots时,可以在多个坐标系中绘制任意多条没有坐标轴的直线或者曲线,而不擦除原有内容。 • 除了与Plot相同的关键字外,Plots还有一个关键字/Continue,在最后一次的绘制点处继续连续绘制 x=[0, 10, 20, 30, 40] & y=[0, 0.8, 1, 0.6, 0] u=[50, 60, 70, 80] & v=[-0.3, -0.5, -0.3, 0] plots, x/2, y/2+0.5, pSym=-2 plots, u/2, v/2+0.5, pSym=-2, /continue plots, x/2, y/2+0.3, pSym=-6 plots, u/2, v/2+0.3, pSym=-6
Contour绘制等值轮廓线 TVScl, DIST(100) • Contour用于绘制坐标系中任意的等值轮廓线。 • Contour的用法跟Plot的用法基本相同,也提供了许多关键字用于设置线、标注、坐标轴等元素的每一个细节。关键字/OverPlot的效果与Plot中/NO_ERASE具有相同的效果。 • 关键字Levels=vector用于设置每层对应的数值。
Surface Shade_Surf绘制网格面 • Surface用于在坐标系中绘制任意的三维网格。与Plot的用法基本相同。AX|AZ = degree关键字用于设置网格面绕X|Z轴旋转的角度。/Lower_ONLY|Upper_ONLY设置只绘制底|顶面。 Shade=array指定一个二维数组作为表面纹理。 • Shade_Surf与Surface用法基本相同,但能绘出带阴影的三维曲面。