《2022年IDL入门教程三 .pdf》由会员分享,可在线阅读,更多相关《2022年IDL入门教程三 .pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章图像数据处理本章概要IDL 最开始是一种处理图像的语言。正因为此,世界各地的许多科学家和工程师仍在用 IDL 语言。这章阐述了图像处理的基本工作。将从中学到以下几点1.怎样读取和显示图像数据2.怎样缩放图像数据3.怎样在显示窗口中定位图像4.怎样改变图像的大小5.怎样从显示设备中读取图像6.怎样完成基本的图像处理任务7.怎样建立简单的图像滤波器图像处理事实上, 任何类型的二维数据集都可认为是一幅图像。但是要在一个8 位的显示设备上显示图像数据,就必须将图像数据调整为 0 255 之间的字节型数值。 (在一个 24-bit的显示设备上, 24 位图像的RGB值必须调整成字节型数值。)因为图
2、像总是以字节型数值显示,所以图像总是以字节型数组来存储。但是无论图像是怎样存储的,图像总是由两个显示图像的 IDL 命令: TV和 TVScl 以字节型数值来显示。要了解是怎样工作的,需要有一些图像数据用于处理。用命令 LoadData 来打开图像数据集 Ali and Dave。将要处理这两幅图像数据中的第二幅图像。键入 IDLimage=LoadData(10) IDLimage=image*,*,1 显示图像可用 TV和 TVScl 两个 IDL 命令中的任一个来显示图像。这两个命令几乎在各个方面都是一样的,包括能与之一起使用的关键字。仅仅在一个方面不同:TVScl 将图像数据调整为与
3、IDL 运行时所用颜色数目相适应的字节型数值。例如:如果在使用IDL 时用 220 种颜色,则在图像显示之前TVScl 将图像数据调整为0219 之间的字节型数值。另一方面, TV命令取图像数据本身的值,仅仅将其作为字节型数值传送到显示设备上。如果有必要, 图像数据将被截断以符合字节型数值。如果图像数据不被调整到0255 之间,图像将很可能显示不正确。注意,与Plot ,Surface和 Contour 命令不同, TV和 TVScl 命令在显示图像之前不删除已显示的内容。一般情况下这个问题不大,但有时候也会产生一些麻烦。如果想要一个干净的显示窗口来显示图像数据,无论当前窗口上的显示内容是什么
4、,都可用一个简单的命令Erase 来删除。 IDLErase 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 13 页 - - - - - - - - - 这里有一个实例。刚才读取的IDL 的图像数据集已经调整在0255 之间。可以键入如下内容来查看: IDLPrint,Max(image),Min(image) 但是,如果在一个8 位显示设备上工作,可能没有全部使用在显示器上可用的256 种颜色。如果需要了解正在使用多少种颜色,可键入: IDLPrint,!D.Tabl
5、e_Size 在一个8 位显示器 ( 这里指颜色表的大小) 上, 运行IDL 时所用颜色的数目通常是在210240 之间,显然可用的颜色太少了。在一个24 位的显示器上,可以获得1670000 种颜色,但颜色表大小仍然是256。以后将会学到IDL 是怎样选择它所用的颜色数目。打开一个显示窗口,装上灰度颜色表, 用 TV命令显示图像 : IDLWindow,0,XSize=192,YSize=192 IDLLoadCT,0 IDLTV,image 所得图像应如图30 所示。图 30:IDL 和 Research Systems公司的创始人-David Stern的图像。 People.dat数据
6、集中的另外一幅图像是Ali Bahrami , Research Systems 公司的第一为员工。他们两个依然致力于IDL 的开发。因为是用 TV命令,所以数据没有经过调整就被传送到显示器中。尽管看不出来,但图像上所有大于IDL 运行时的颜色数目的像素值都被设为同样的值。也就是说,比!D.Table_Size-1值大的像素被以相同的颜色显示。(在这种情况下,看到的颜色是灰色明暗图。 )如果用 TVScl 命令显示图像, 也许能看出差别。 打开另一个窗口并将其移到第一个窗口的旁边。用TVScl 命令显示图像: IDLwindow,1,XSize=192,YSize=192 IDLTVScl,i
7、mage 可看到两个图像的明暗程度不同。因为这幅图像数据最大值为238,所以差别是很微弱的。如果看不出差别,可先在0255 之间对数据进行调整:IDLwest,0 IDLimage=Bytscl(image) IDLtv,image IDLwest,1 IDLtvscl,image 如果仍不能看到差别,可装入颜色表。Red Temperature颜色表可能起作用。键入:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - IDLLo
8、adCT,3 如果要了解TVScl 作了些什么,可调整数据并用TV命令显示: IDLWindow,2,XSize=192,YSize=192 IDLscaled=Bytscl(image,Top=!D.Table_Size-1) IDLTV,scaled 在窗口 2 中看到的图像应与窗口1 中的图像一样。这就是所说的,TVScl 将数据调整为与 IDL 运行时所用颜色数目相适应的字节型数值。注意:如果在显示窗口的图像不是用red_temperature颜色表显示的话, 则可能是在一个 16 位或 24 位彩显上使用IDL。在这种情况下,为了下面的练习,确保关闭颜色分解器。键入如下命令:IDLD
9、evice,Decomposed=0 IDLTV,scaled 如果用的是一个16 位或 24 位显示器, 为了看到新的颜色生效,在改变颜色表后,需要重新运行每个图形命令。在一个 16 位或 24 位显示器上, 颜色表中的颜色没有直接被索引或连接到显示器上的色彩表。何况颜色表是图像用来查找每个像素该使用哪种颜色的一种方法。而像素的颜色是直接表示的。一般来说, 如果不知道数据是否被调整过,很可能想用TVScl 命令, 因为这将给图像像素值以最大可能的对比度。但是如果颜色对来说是重要的话(并且它几乎总是这样),那么可能从来不想用TVScl 命令。相反,将愿意自己缩放图像数据,然后用TV命令来显示。
10、调整图像数据假设正在测量大气压,并将测量数据在一色棒旁边以图像显示。可能想比较这个星期收集的图像数据和上个星期收集的图像数据。换句话说,想确定一种特定的颜色,比如红色,在这套数据中的红色和上个星期的数据中的红色表示相同的压力。如果用 TVScl 命令显示这个星期和上个星期的图像数据,绝对不能保证特定的红色在两个数据组中能代表同一事情。这些出入来自两个原因。第一,可能今天使用IDL 时的颜色数目和上个星期使用IDL时不同。 因为 TVScl 将图像数据调整到IDL 运行时的颜色数目内,这可能会引起错误。 第二,不能确保两组数据组间具有相同的数据范围。因而,用TVScl 调整可能再次引起错误。为解
11、决这些问题,可用 BytScl命令调整数据, 并用 TV命令显示。 为确保 IDL 运行时所用的颜色数目不引起错误,可将数据调整到相同的颜色值内。并且, 为确保数据集中数据的范围不引起错误,可以将数据调整到同样的数据范围。可通过 BytScl命令, 应用关键字Top,Min 和 Max实现上述要求。例如,假设总是想以100 种不同的灰度深浅或颜色深浅来显示数据,并且假设在任何数据集中希望最小数据值为15,而最大的有效值为245。可用如下BytScl命令实现:IDLscaledImage=BytScl(image,Min=15,Max=245,Top=99) 这个例子中,数据调整之前在数据集中小
12、于15 的数值将设定为15。类似地,在数据调整之前, 在数据集中任何大于245 的数值将被设定为245。一旦数据被调整了,就可用 TV命令显示。IDLTV,scaledImage 如果总是这样调整数据集(并且在IDL 运行时总是有至少100 个灰色级别或颜色数) ,那么上个星期的数据集就能直接与这个星期的数据集比较。一个特定的颜色, 红色将总是表示一个特定的数据范围或压力。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 13 页 - - - - - - - - - 可能在
13、显示器上开了许多图像窗口。可用一个简单的命令删除所有开着的窗口。键入:IDLWHILE !D.Window NE-1 DO WDelete, !D.Window 将图像调整到颜色表的不同部位需要知道如何调整图像数据的另一个理由,是要能在使用8 位显示器时, 将数据调整到颜色表的不同部位。这使图像能用不同颜色显示出来,或者能将颜色表的特定色段用于特别的目的。例如,也许想将颜色表的一部分保留作为画图用的颜色。注意:用 24 位彩显的一个很大的好处是能随时使用一个没有限制的颜色表。24 位彩显的缺点是,在改变颜色表之后,为了看到新颜色生效,不得不重新运行图形命令(例如:TV命令) 。在本书后面将看到
14、如何编写程序,使得当一个新的颜色表装入后,能自动重新运行图形命令。在大多数 8 位显示器上仅仅有一个物理颜色表,并且所有的IDL 图形窗口都用它。 但是通过操作颜色表可以让它看上去象是同时装入几个不同的颜色表。可以通过将不同的颜色表装入到一个物理颜色表的不同部位来实现这一点。也许实现这点的最简单的方式是在LoadCT或 XLoadCT命令中用 NColors 和 Bottom 关键字。例如,假设想用两个看上去不同的颜色表来显示同一幅图像。在用 IDL 打开一个图形窗口后,能通过测试系统变量!D.Table_Size的值知道在IDL 运行时颜色表中有多少种颜色。如果将这个数目一分为二,就知道每个
15、图像该用多少种颜色:IDLhalf=!D.Table_Size/2 为了在同一窗口用看上去不同的两个颜色表显示图像数据image,必须将图像数据调整为适应两个颜色空间范围的值。首先,用BytScl命令调整图像数据为适应第一个部分颜色表的值,生成一个新的图像image1:IDLimage1=BytScl(image,Top=half-1) 现在,按如下做法将图像数据调整为适应第二个部分颜色表的值,生成第二个图像image2:IDLimage2=BytScl(image,TOP=half-1)+Byte(half) 按如下做法将两个已调整的图像肩并肩地放在同一个窗口。注意,在使用TV命令。明白这是
16、为什么吗? IDLWindow,XSize=192*2,YSize=192 IDLTV,image1 IDLTV,image2,192,0 现在需要用一个灰度颜色表( 颜色表索引号为0) 将左边的图像显示出来。必须将那些灰度级颜色装入颜色表中被第一个图像数据占用的部分。键入:IDLLoadCT,0,NColors=half,Bottom=0 如果用 XLoadCT命令将颜色装入颜色表的第二部分,就能为右边的图像交互式地选择想要的任何颜色表。如下:IDLXLoadCT,NColors=half,Bottom=half 为了继续本章后面的例子,要恢复一个正常的颜色表,键入:IDLLoadCT,0
17、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - - - - - - - 在 24 位显示器上用不同的颜色表显示图像当在 16位或 24位显示器上运行时, 使用不同的颜色表和装入颜色并显示图像一样简单。例如,如果正在一个16 位或 24 位的显示器上运行时,可以试一试:IDLworld=LoadData(7) IDLWindow,1,Title=Gray Scale ImageIDLLoadCT,0 IDLTV,world IDLWindow,2,Ti
18、tle=Color Image IDLLoadCT,5 IDLTV,world 显示 24 位图像真彩色(或24 位)图像也能用TV命令显示。 24 位图像总是由一个3 维数据集构成,它的 3 个维数中的一个值设为3。例如,数据集可以是一个m*n*3 的数组,这种情况下,图像被认为是隔波段扫描(band-interleaved) ;如果图像是m*3*n 则被认为是隔行扫描(row-interleaved) ;如果是3*m*n 则被认为是隔像素扫描(pixel-interleaved) 。装载一幅 24 位图像,键入如下命令:IDLrose=LoadData(16) 这个数据组是一个按像素扫描的
19、图像。通过键入如下命令可知道这点:IDLHelp,rose ROSE BYTE =Array3,227,149 要在一个 8 位显示器上显示一幅24 位的图像, 仅仅需要用关键字True 来说明其用的是哪种扫描方式。True=1 为隔像素扫描;True=2 为隔行扫描; True=3 为隔波段扫描。IDLWindow,XSize=227,YSize=149 IDLTV,rose,True=1 ;Pixel-interleaved 注意, 24 位图像在8 位显示器上显示将表现为灰度级。要在这样的显示器上看到真彩色的图像,需要创建一幅2 维图像以及伴随该24 位图像或3 维图像数据的红色、绿色、
20、蓝色颜色表。 这在 IDL 中可用命令Color_Quan 来实现。 如果使用 8 位显示器, 键入如下命令:IDLimage2d=Color_Quan(image24,1,r,g,b) IDLTVLCT,r,g,b IDLTV,image2d 现在可看到彩色图像了。在 24 位显示器上显示24 位图像如果使用的是一台24 位显示器, 情形稍微复杂一点。为了正确显示一幅24 位图像, 必须打开颜色分解器。这在大多数真彩模式下的工作站上自动实现的,但在真彩模式Windows下, IDL5.2 版本却不能自动实现。为确保以正确的图像颜色显示24 位图像,应该在24 位显示器上键入如下命令:IDLD
21、evice,Decomposed=1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 13 页 - - - - - - - - - IDLTV,image24 注意,下载的本书配套的程序TVImage 自动设置正确的颜色分解器,这取决于要显示的图像是 24 位还是 8 位。在 24 位显示器上显示8 位图像在一台 24 位显示器上, 8 位图像在显示时遍历了整个颜色表。换句话说,一个8 位图像的像素值被作为一个索引号,该索引号为给定的像素查找特定的红色,绿色和蓝色。 这意
22、味着如果在使用IDL 时改变了颜色表,必须重新显示该2 维图像来看新的颜色是否生效。这是因为在24 位显示器上颜色是在图像被显示时决定的,同时也因为正在用RGB颜色模式。并且特别要注意必须关上颜色分解器,否则将忽视颜色表矢量,并总是用灰度色彩来显示8位图像。如果用的是一个24 位显示器,键入如下命令:IDLworld=LoadData(7) IDLWindow,XSize=360,YSize=360 IDLLoadCT,5 IDLDevice,Decomposed=0 IDLTV,world 为了以另一种颜色表显示图像,装入该颜色并重新运行TV命令,使图像像素值遍历整个颜色表矢量。注意当只运行
23、LoadCT命令时,图像颜色不变。IDLLoadCT,3 IDLTV,world 控制图像显示顺序通常, 当 IDL 显示一幅图像时,习惯上图像的第0 列和第 0 行为图像的左下角。有些人喜欢将图像的第0 列和第 0 行作为图像的左上角。如果喜欢第二种习惯方式,可以通过设置系统变量! Order 让 IDL 使用习惯。在缺省时, !Order 设为 0。如果希望将所有图像的左上角都显示在第0 列和第 0 行,可设置!Order=1 。如果只是希望用第二种方式显示某幅图像,可在使用TV 或 TVScl 命令时,用关键字Order 设置。例如,可以同时观看两种显示方式,键入:IDLWindow,X
24、Size=192*2,YSize=192 IDLTVScl,image,Order=0 IDLTVScl,image,Order=1,192,0 可能从别人那儿得到一个图像数据文件,显示时倒过来了。这大多是因为创建数据文件的人在排放第0 列和第 0 行时用了不同的习惯。将关键字Order 的值反过来, 看是否纠正了错误 . 改变图像尺寸IDL 提供了两个改变图像大小的命令:Rebin 和 Congrid 。Rebin 的限制为新建图像的尺寸必须是原始图像尺寸的整数倍或整数比例。例如,变量image 可以在 X方向或 Y方向上变化为192/2 和 192*3 个元素。 但不应该是300 或 50
25、0 个元名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 13 页 - - - - - - - - - 素。图像大小也可以在一个方向减小,另一个方向增大。例如,可将变量image 重新变化为384 列和 96 行,键入如下命令。 IDLWindow,XSize=384,YSize=96 IDLnew=Rebin(image,384,96) IDLTVScl,new 输出图像应与图31 类似。图 31:用 Rebin 命令缩放的图像其大小必须与原始图像大小有整数倍关系。在缺省
26、情况下, 当放大一幅图像时Rebin 采用双线性插值,当缩小一幅图像时则采用最邻近平均法。如果关键字Sample 被设定后,在两个方向上都可用最邻近采样法。双线性插值更为精确,但需要更多的计算时间。 IDLWindow,XSize=192/2,YSize=192/2 IDLnew=Rebin(image,96,96,/Sample) IDLTVScl,new 除了下面两个方面外,Congrid 与 Rebin 是相似的。第一,在新图像中的列数和行数可以设为任意值。第二,在缺省情况下,用的是最邻近采样法。如果想用双线性插值,必须设置关键字Interp: IDLWindow,XSize=600,Y
27、Size=400 IDLnew=Congrid(image,600,400,/Interp) IDLTVScl,new 在 PostScript设备上改变图像大小象 PostScript这种设备, 其像素是可调节的(相对于固定像素的显示器来说),在调节图像尺寸时有所不同。 (详细信息参考185 页的“显示器与PostScript设备的差别” ) 。特别是,可不用Rebin 或 Congrid 命令来改变图像的大小,而是用TV或 TVScl 命令通过关键字XSize 和 Ysize 来改变图像的大小。例如,当将图像输出到一个PostScript文件时 , 如果想将图像的显示比例定为6:4 的话,
28、也许愿意用如下代码,而不是上面的用Congrid 命令将图像放大为600*400 。 IDLthisDevice=!D.Name IDLSet_Plot,PS IDLDevice,XSize=6,YSize=4,/Inches IDLTVScl,image,XSize=6,YSize=4,/Inches IDLSet_Plot,this Device 如果图像大小和位置是用下面的归一化坐标来表示的,可以写出真正的独立于显示设备的图像显示代码。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
29、 第 7 页,共 13 页 - - - - - - - - - 在显示窗口中定位图像通常显示一幅图像时,IDL 将图像的左下角放在窗口的左下角。但是可通过TV或 TVScl命令的附加参数来将图像移动到显示窗口中的其它位置。例如, 如果给出第二个参数,它则被视为图像在窗口中的位置。图像位置由显示窗口的尺寸和图像的尺寸计算出来的。详细算法可参阅TV命令的在线帮助。键入: IDL? TV 位置可从显示器的左上角开始,一直到显示器的右下角。例如,在384384 的显示窗口内,从显示器的左上角开始,对于192192 的图像来说有四种位置。键入: IDLWindow,XSize=384,YSize=384
30、 IDLTVScl,image,0 IDLTVScl,image,1 IDLTVScl,image,2 IDLTVScl,image,3 通过显式地指定图像左下角的象素位置来定位一幅图像是可以的。TV或 TVScl 命令中在图像数据名后给定两个附加参数即可以实现这点。例如,将一幅192192 名为 image 的图像定位于刚刚创建的显示窗口中间。可键入: IDLErase,Color=!D.Table_Size-1 IDLTVScl,image,96,96 这样,将图像的左下角放在像素点(96,96 )处。当希望为附加图留下空间时,如色棒或其它的注释,这种定位图像的方法是很重要的。例如, 键入
31、如下命令来在窗口的左边显示一个色棒,在窗口的右边显示图像。显示窗口将如图 32 所示。IDLWindow,XSize=320,YSize=320 图 32:此图像用颜色棒来显示其颜色梯度 IDLncolors=!D.Table_Size 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 13 页 - - - - - - - - - IDLTvLCT,255,255,0,ncolors-1 IDLErase,color=ncolors-1 IDLcolorbar=Replic
32、ate(1B,20)#BIndGen(256) IDLTV,BytScl(colorbar,Top=ncolors-2),32,36 IDLTV,BytScl(image,Top=ncolors-2),92,64 用归一化的坐标来定位图像用归一化的坐标系来定位图像和确定图像大小是很方便的。这与其它IDL 图 象命令使用关键字Position的用法相似。(详细信息参考185 页的“显示器与PostScript设备的差别” ) 。 如果要在可变尺寸的窗口内显示图像,或者要在同一显示窗口内与其它IDL 的图形程序共同使用图像,或者希望所编写的将图像传送到一个PostScript文件的 IDL 程序不
33、遇到麻烦, 在这些情况下, 用归一化坐标定位图像和确定图像大小是非常方便的,特别是对最后一种情况。 例如, 刚才键入的命令是放一个色棒在图像旁。尽管这些命令在显示窗口内可以很好地工作, 但如果想在PostScript设备上输出中得到类似的结果,上述命令是不可能的。(若有问题,参考185 页的“显示器与PostScript设备的差别” ) 。假设可以用关键字Position在窗口中确定图像的大小和位置,那么结果将如何呢?设想将图像放入一个任意的窗口内,并占满其比如80% 的空间。相对于归一化坐标来说,可将图像在窗口的位置表达为:position=0.1,0.1,0.9,0.9 但这是怎样被翻译成
34、图像通常使用的设备坐标的呢?这自然要取决于显示窗口的大 小 。 但 能 够 知 道 显 示 窗 口 中 可 视 部 分 的 大 小 。 这 是 由 系 统 变 量 ! D.X_VSize和!D.Y_Vsize以设备或像素单元来给定的。通过像素坐标,可以按如下方法计算出图像所需的尺寸和在输出窗口起始的位置:xsize=(position2-position0)*!D.X_VSize ysize=(position3-position1)*!D.Y_VSize xstart=position0*!D.X_VSize ystart=position1*!D.Y_VSize 将图像输出到显示设备和输出
35、到PostScript文件的唯一区别是如何确定图像的尺寸。可以编写如下代码来显示图像: IF !D.Name EQ PS THEN $ TV, image, XSize=xsize, YSize=ysize, xstart, ystart $ ELSE $ TV, Congrid(image, xsize, ysize), xstart, ystart 无论是将图像输出到显示器还是输出到PostScript文件中 , 上述代码都起作用。但这样做时图像的横纵比例不能得到保证。事实上, 可以让图像适合窗口的形状。这对一些应用程序来说工作的很好,但对另一些却不是这样。无论在什么情况下该问题很容易解决
36、,因为如果想保留图像的横纵比例时,只需固定好图像的一边,并以适当的方式调整图像另一边的坐标即可。实现该项功能的代码已经写好,放在下载的程序TVImage中。无论是在显示终端,还是在 PostScript文件中, TVImage 都用关键字Position来定位图像和确定图像大小,。如果希望 TVImage程序能完好地保持显示图像的横纵比例,可以使用关键字Keep_Aspect_Ratio 。可以用 TVImage 重新生成色棒位于图像左边的上述图像:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
37、 - - 第 9 页,共 13 页 - - - - - - - - - IDLErase,color=ncolors-1 IDLbarPosition=32,32,52,292/320.0 IDLimagePosition=92, 64, 284, 256/320.0 IDLcolorbar=Replicate(1B, 20)#BIndGen(256) IDLTVImage,BytScl (colorbar,Top=ncolors-2),$ Position=barPosition IDLTVImage,BytScl (image,Top=ncolors-2),$ Position=image
38、Position 这样做的好处,不但因为图像可以在任何尺寸的窗口或PostScript文件中以及显示器上显示, 而且因为它使得在显示窗口中轻易增加其它图形成为可能。例如,可以非常容易地在色棒和图像周围放置外框或标记。键入:IDLTvLCT,255,255,255,ncolors-1 IDLPlot,0,!D.Table_Size,YRange=0,!D.Table_Size,$ /NoData,Color=0,Position=barPosition,XTicks=1,$ /NoErase, XStyle=1, YStyle=1, XTickFormat=(A1)?$ YTick=4 IDLP
39、lot, IndGen(192), IndGen(192), /NoData, $ Position=imagePosition, /NoErase, $ XStyle=1, YStyle=1, Color=0 输出结果应如图33 所示。图 33: 用命令TVImage不仅允许使用独立于设备的方法定位图像而且容易使用其它图形命令从显示器中读取图像有时花许多时间,运行许多命令, 才得到了喜欢的图形显示。将图形显示读到一个图像名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共
40、13 页 - - - - - - - - - 变量中以便处理甚至硬拷贝输出是很方便的。因此,现在需要知道如何得到IDL 图形窗口的拷屏。可以用TVRD命令将 IDL 图形窗口的内容读到一个2 维 IDL 字节型数组中。要在一个 8 位显示器上读取整个图形窗口,可键入如下命令:IDLWindow,XSize=250,YSize=250 IDLTVScl,image IDLnew_image=TVRD() IDLHelp,new_image 注意,新创建的变量现在是一个250*250 字节的数组。在 24 位显示器上截屏如果在 16 位或 24 位显示器上运行IDL,不能象上面那样使用TVRD命令
41、。 16 位或 24位 显示器有 3 个颜色通道。 如果象上面不用任何参数来使用TVRD 命令, 那么得到的2 维数组的每个像素值为该像素三个通道中的最大像素值。除非装载一个灰度色彩表(这样, 每个通道有同样的值) ,否则就不是所期望的。要想在24 位显示器上截屏,只需在命令TVRD中设置关键字True 即可。如果用的是16 位或 24 位显示器则键入如下命令:IDLnew_image=TVRD(True=1) 但是注意,得到的是一个24 位图像,而不是一个2 维 8 位图像。当显示该图像时就要用带关键字True 的 TV命令:IDLHelp,new_image IDLErase IDLTV,
42、new_image,True=1 读取显示图像的一部分如果只想读显示窗口的某一部分,可指定想要的部分窗口的左下角的像素坐标和要读取的列和行的数目。换句话说,能指定矩形区域。例如,如果只想捕获上述头像的脸部,可键入:IDLnew_image=TVRD(40,30,110,130) 在 IDL 中, 从显示器读取的2 维数组可以象处理其它图像那样进行处理。如果需要显示,可键入:IDLErase IDLTV,new_image IDL 中基本的图像处理IDL 原是作为一种图像处理的工具,所以它有很强的图像处理能力。这节中描述的是一些 IDL 中基本的图像处理工具。名师资料总结 - - -精品资料欢迎
43、下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 13 页 - - - - - - - - - 直方图均衡化如果观察图像中的像素值分布,往往会发现分布趋向集中在一个狭窄的数值范围内。实际上, 图像有一个非常窄的动态颜色范围。如果像素分布开,以致使像素值的每个子范围都与这些像素值一样拥有数目大约相同的像素,则该图像的信息内容就有可能增加。将像素分布到整个颜色范围的过程叫做直方图均衡化。例如,用 LoadData 命令打开数据集CT Scan Thoracic Cavity 。这是一幅CT扫描图像,该图像具有一
44、个狭窄的动态颜色范围。IDLscan=LoadData(5) 要看变量 scan 的像素值分布的柱状图,键入如下命令。显示图像窗口应如图34 所示。图 34:正常图像具有狭窄的像素值分布。这里的像素值集中在50-10 之间。IDLLoadCT,0 IDLWindow,0,XSize=600,YSize=250 IDLTV,scan IDLPlot,Histogram(scan),/NoErase,Max_Value=5000,$ Position=0.5,0.15,0.95, 0.95 可以看到大多数像素值落在50100 之间。将像素分布至整个颜色范围内,使得每种颜色值都有大致相同的像素个数,
45、键入:IDLequalized=Hist_Equal(scan) 为查看新的像素分布柱状图和 HISTOGRAM-EQUALIZED 图像,键入:IDLWindow, 1, XSize=600, YSize=250 IDLTV, equalized IDLPlot, Histogram(equalized), Max_Value=5000, $ Position=0.5, 0.15, 0.95, 0.95, /NoErase 直方图均衡化后的图像应如图35 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 13 页 - - - - - - - - - 图 35:一幅直方图均衡化后的图像。象素分布扩展到了整个颜色范围。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 13 页 - - - - - - - - -
限制150内