可视化的IDL工具InteractiveDataLanguage中科院计算机网络信息中心超级计算中心谢茂金Email:xiemaojin@sccas.cn2010.9内容提要•IDL概况–IDL是什么?–IDL的特点–IDL能干什么?–IDL支持的文件格式–IDL图像处理简介•IDL程序导读与语法解析–变量、数组、过程、函数、输入输出、循环、分支、判断等语法基础。•可视化的IDL–IDL图形系统–IDL坐标系统–数据可视化:绘制线Plot,等值线,面,体绘制–智能工具iTools•并行IDL简介•进一步学习IDLIDL是什么•IDL(InteractiveDataLanguage,交互式数据语言)是美国ittvis公司的旗舰产品,它既是对数据进行可视化表现、分析及应用开发的软件,又是面向矩阵、语法简单的第四代可视化计算机语言。是进行数据分析、可视化表达与跨平台应用开发的理想工具。•IDL用户涵盖NASA、ESA、NOAA、Siemens、GEMedical、ArmyCorpsofEngineers、MacDonaldDettwiler等。•NASA选用IDL进行飞越火星航空器的研究,JPL科学家利用IDL对“勇气号”和“机遇号”的数据进行数据分析和处理。IDL的特点•IDL=VC菜单的定制、消息传递•IDL=VB可视化界面的设计、语言通俗易懂、编程入门容易•IDL=JAVA具有良好的跨平台能力,方便移植,面向对象特性•IDL=FORTRAN+C语言风格绝大部分继承自Fortran,少量来源于C。面向矩阵,执行效率高,代码量比C和Fortran少得多,简洁而不失灵活性。•IDL=MATLAB提供了大量封装和参数化了的数学函数及各种信号处理的方法,使用方法也非常类似。•IDL=OPENGL提供了丰富的二维、三维图形图像操作类,能高效快速地对数据进行可视化。医学影像图像处理与分析信号处理地球科学数据处理与分析天文IDL能做什么?其他…IDL支持的文件格式•文本格式:Readf,Read_ascii,Printf•二进制格式:Readu,Read_binary,Writeu•科学数据格式:–CDF:beginwiththeprefixCDF_–HDF4:beginwiththeprefixHDF_–HDF5:beginwiththeprefixH5_orH5*_–HDF-EOS:beginwiththeprefixEOS_–NetCDF:beginwiththeprefixNCDF_.图像处理•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])原图IDL支持的图像格式IDL支持的图像格式格式描述BMPWindowsBitmapformatDICOMDigitalImagingandCommunicationsinMedicineGeoTIFFTIFFfilewithtagscontaininggeographicdataGIFGraphicsInterchangeFormatInterfileInterfileversion3.3formatJPEGJointPhotographicExpertsGroupformatJPEG2000JPEG2000formatMotionJPEG2000MotionJPEG2000formatIDL支持的图像格式IDL支持的图像格式(续表)FormatDescriptionMPEGMovingPictureExpertsGroupformatMrSIDMulti-resolutionSeamlessImageDatabaseformatNRIFNCARRasterInterchangeFormatPICTMacintoshversion2PICTfiles(bitmaponly)PNGPortableNetworkGraphicsformatPPMPPM/PGMformatSRFSunRasterFileformatTIFF8-bitor24-bitTaggedImageFileformatX11BitmapX11BitmapformatusedforreadingbitmapsforIDLwidgetbuttonlabelsXWDXWindowsDumpformat图像处理例子•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=‘OriginalRoseImage’•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='VerticallySmoothed(left),Horizontally'+$'Smoothed(middle),andBoth(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;Displaytheresults.SMOOTH(image,[1,1,21])SMOOTH(image,[1,21,1])SMOOTH(image,[1,5,5])原图RGBRGBRGB…….RGBRRRRRRRRRR….RRRGGGGGGGGG….GGGBBBBBBBBBB….BBBRRRRRRRRRR….RRRGGGGGGGGG….GGGBBBBBBBBBB…...BBB……………………………函数、过程、参数、关键字、返回值;函数和过程统称为例程routinesTVSclIDL程序导读与语法解析在shell下:[scxiemj@v3904~]$idlde即可打开IDE在此输入命令显示用户变量和系统变量控制台显示输出结果编译和执行Indgen(3,4)生成3列4行的二维数组,每个元素的值依次递增,注意是按列存储。直接敲入idl,运行命令行形式的IDL分号后面的为注释程序导读与语法解析•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过程名,[参数1,…,参数n],[关键字1,…,关键字n]命令序列….End3B128L16384LL3.14159D7U4UL100ULL分支、循环BytArrIntArrLonArrFltArrDblArrComplexArr过程文件1)过程文件用来存放多个IDL过程和函数,其扩展名为.pro3)过程文件编译(CTRL+F8)后,可以按照过程和函数的调用方法任意调用过程文件中的过程和函数。2)主文件名可以与某个过程名相同,也可以不同,若相同,则该过程必须放在过程文件的最后过程文件的编译及过程调用过程文件的编译(CTRL+F8)和调用基本数据类型•数据类型【十进制后缀】(占用字节)–Byte【nB】(1字节)4B,12B;–Int【n或nS】及无符号整形【nU或nUS】(2字节)-6,8S;–LongInt【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【无】’helloIDL’“I’mastring!”数据类型代码表•代码名称数据类型•0UnderfinedUndefined•1ByteByte•2IntInteger•3LongLongwordinteger•4FloatFloatingpoint•5DoubleDouble_precisionfloating•6ComplexComplexfloating•7Stringstring•8StructStructure•9DComplexDouble_precisioncomplex•10PointerPointer•11ObjRefObjectreference•12UIntUnsignedinteger•13ULongUnsignedLongwordinteger•14Long64Longword64-bitinteger•15ULong64Unsigned64-bitinteger常量•字符型常量:又称为字符串,用“”或‘’界定“IDL7.1”,“12-47”,“I’mOK”,‘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系统变量!PI3.1415927!PATHD:\\ProgramFile...可用AddPath命令增加搜索路径!PROMPTIDL!DTOR0.017453292带锁,表示只读不写内存变量•临时存储于内存中的变量,例:IDLa=4.0DIDLb=2.4Lb=2.4L^%Syntaxerror.IDLc=1.4IDLp=ptr_new(c)查看变量•pr