您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > IDL入门教程三(上)
第三章图像数据处理本章概要IDL最开始是一种处理图像的语言。正因为此,世界各地的许多科学家和工程师仍在用IDL语言。这章阐述了图像处理的基本工作。将从中学到以下几点1.怎样读取和显示图像数据2.怎样缩放图像数据3.怎样在显示窗口中定位图像4.怎样改变图像的大小5.怎样从显示设备中读取图像6.怎样完成基本的图像处理任务7.怎样建立简单的图像滤波器图像处理事实上,任何类型的二维数据集都可认为是一幅图像。但是要在一个8位的显示设备上显示图像数据,就必须将图像数据调整为0~255之间的字节型数值。(在一个24-bit的显示设备上,24位图像的RGB值必须调整成字节型数值。)因为图像总是以字节型数值显示,所以图像总是以字节型数组来存储。但是无论图像是怎样存储的,图像总是由两个显示图像的IDL命令:TV和TVScl以字节型数值来显示。要了解是怎样工作的,需要有一些图像数据用于处理。用命令LoadData来打开图像数据集AliandDave。将要处理这两幅图像数据中的第二幅图像。键入IDLimage=LoadData(10)IDLimage=image[*,*,1]显示图像可用TV和TVScl两个IDL命令中的任一个来显示图像。这两个命令几乎在各个方面都是一样的,包括能与之一起使用的关键字。仅仅在一个方面不同:TVScl将图像数据调整为与IDL运行时所用颜色数目相适应的字节型数值。例如:如果在使用IDL时用220种颜色,则在图像显示之前TVScl将图像数据调整为0~219之间的字节型数值。另一方面,TV命令取图像数据本身的值,仅仅将其作为字节型数值传送到显示设备上。如果有必要,图像数据将被截断以符合字节型数值。如果图像数据不被调整到0~255之间,图像将很可能显示不正确。注意,与Plot,Surface和Contour命令不同,TV和TVScl命令在显示图像之前不删除已显示的内容。一般情况下这个问题不大,但有时候也会产生一些麻烦。如果想要一个干净的显示窗口来显示图像数据,无论当前窗口上的显示内容是什么,都可用一个简单的命令Erase来删除。IDLErase这里有一个实例。刚才读取的IDL的图像数据集已经调整在0~255之间。可以键入如下内容来查看:IDLPrint,Max(image),Min(image)但是,如果在一个8位显示设备上工作,可能没有全部使用在显示器上可用的256种颜色。如果需要了解正在使用多少种颜色,可键入:IDLPrint,!D.Table_Size在一个8位显示器(这里指颜色表的大小)上,运行IDL时所用颜色的数目通常是在210~240之间,显然可用的颜色太少了。在一个24位的显示器上,可以获得1670000种颜色,但颜色表大小仍然是256。以后将会学到IDL是怎样选择它所用的颜色数目。打开一个显示窗口,装上灰度颜色表,用TV命令显示图像:IDLWindow,0,XSize=192,YSize=192IDLLoadCT,0IDLTV,image所得图像应如图30所示。图30:IDL和ResearchSystems公司的创始人--DavidStern的图像。People.dat数据集中的另外一幅图像是AliBahrami,ResearchSystems公司的第一为员工。他们两个依然致力于IDL的开发。因为是用TV命令,所以数据没有经过调整就被传送到显示器中。尽管看不出来,但图像上所有大于IDL运行时的颜色数目的像素值都被设为同样的值。也就是说,比!D.Table_Size-1值大的像素被以相同的颜色显示。(在这种情况下,看到的颜色是灰色明暗图。)如果用TVScl命令显示图像,也许能看出差别。打开另一个窗口并将其移到第一个窗口的旁边。用TVScl命令显示图像:IDLwindow,1,XSize=192,YSize=192IDLTVScl,image可看到两个图像的明暗程度不同。因为这幅图像数据最大值为238,所以差别是很微弱的。如果看不出差别,可先在0~255之间对数据进行调整:IDLwest,0IDLimage=Bytscl(image)IDLtv,imageIDLwest,1IDLtvscl,image如果仍不能看到差别,可装入颜色表。RedTemperature颜色表可能起作用。键入:IDLLoadCT,3如果要了解TVScl作了些什么,可调整数据并用TV命令显示:IDLWindow,2,XSize=192,YSize=192IDLscaled=Bytscl(image,Top=!D.Table_Size-1)IDLTV,scaled在窗口2中看到的图像应与窗口1中的图像一样。这就是所说的,TVScl将数据调整为与IDL运行时所用颜色数目相适应的字节型数值。注意:如果在显示窗口的图像不是用red_temperature颜色表显示的话,则可能是在一个16位或24位彩显上使用IDL。在这种情况下,为了下面的练习,确保关闭颜色分解器。键入如下命令:IDLDevice,Decomposed=0IDLTV,scaled如果用的是一个16位或24位显示器,为了看到新的颜色生效,在改变颜色表后,需要重新运行每个图形命令。在一个16位或24位显示器上,颜色表中的颜色没有直接被索引或连接到显示器上的色彩表。何况颜色表是图像用来查找每个像素该使用哪种颜色的一种方法。而像素的颜色是直接表示的。一般来说,如果不知道数据是否被调整过,很可能想用TVScl命令,因为这将给图像像素值以最大可能的对比度。但是如果颜色对来说是重要的话(并且它几乎总是这样),那么可能从来不想用TVScl命令。相反,将愿意自己缩放图像数据,然后用TV命令来显示。调整图像数据假设正在测量大气压,并将测量数据在一色棒旁边以图像显示。可能想比较这个星期收集的图像数据和上个星期收集的图像数据。换句话说,想确定一种特定的颜色,比如红色,在这套数据中的红色和上个星期的数据中的红色表示相同的压力。如果用TVScl命令显示这个星期和上个星期的图像数据,绝对不能保证特定的红色在两个数据组中能代表同一事情。这些出入来自两个原因。第一,可能今天使用IDL时的颜色数目和上个星期使用IDL时不同。因为TVScl将图像数据调整到IDL运行时的颜色数目内,这可能会引起错误。第二,不能确保两组数据组间具有相同的数据范围。因而,用TVScl调整可能再次引起错误。为解决这些问题,可用BytScl命令调整数据,并用TV命令显示。为确保IDL运行时所用的颜色数目不引起错误,可将数据调整到相同的颜色值内。并且,为确保数据集中数据的范围不引起错误,可以将数据调整到同样的数据范围。可通过BytScl命令,应用关键字Top,Min和Max实现上述要求。例如,假设总是想以100种不同的灰度深浅或颜色深浅来显示数据,并且假设在任何数据集中希望最小数据值为15,而最大的有效值为245。可用如下BytScl命令实现:IDLscaledImage=BytScl(image,Min=15,Max=245,Top=99)这个例子中,数据调整之前在数据集中小于15的数值将设定为15。类似地,在数据调整之前,在数据集中任何大于245的数值将被设定为245。一旦数据被调整了,就可用TV命令显示。IDLTV,scaledImage如果总是这样调整数据集(并且在IDL运行时总是有至少100个灰色级别或颜色数),那么上个星期的数据集就能直接与这个星期的数据集比较。一个特定的颜色,红色将总是表示一个特定的数据范围或压力。可能在显示器上开了许多图像窗口。可用一个简单的命令删除所有开着的窗口。键入:IDLWHILE!D.WindowNE-1DOWDelete,!D.Window将图像调整到颜色表的不同部位需要知道如何调整图像数据的另一个理由,是要能在使用8位显示器时,将数据调整到颜色表的不同部位。这使图像能用不同颜色显示出来,或者能将颜色表的特定色段用于特别的目的。例如,也许想将颜色表的一部分保留作为画图用的颜色。注意:用24位彩显的一个很大的好处是能随时使用一个没有限制的颜色表。24位彩显的缺点是,在改变颜色表之后,为了看到新颜色生效,不得不重新运行图形命令(例如:TV命令)。在本书后面将看到如何编写程序,使得当一个新的颜色表装入后,能自动重新运行图形命令。在大多数8位显示器上仅仅有一个物理颜色表,并且所有的IDL图形窗口都用它。但是通过操作颜色表可以让它看上去象是同时装入几个不同的颜色表。可以通过将不同的颜色表装入到一个物理颜色表的不同部位来实现这一点。也许实现这点的最简单的方式是在LoadCT或XLoadCT命令中用NColors和Bottom关键字。例如,假设想用两个看上去不同的颜色表来显示同一幅图像。在用IDL打开一个图形窗口后,能通过测试系统变量!D.Table_Size的值知道在IDL运行时颜色表中有多少种颜色。如果将这个数目一分为二,就知道每个图像该用多少种颜色:IDLhalf=!D.Table_Size/2为了在同一窗口用看上去不同的两个颜色表显示图像数据image,必须将图像数据调整为适应两个颜色空间范围的值。首先,用BytScl命令调整图像数据为适应第一个部分颜色表的值,生成一个新的图像image1:IDLimage1=BytScl(image,Top=half-1)现在,按如下做法将图像数据调整为适应第二个部分颜色表的值,生成第二个图像image2:IDLimage2=BytScl(image,TOP=half-1)+Byte(half)按如下做法将两个已调整的图像肩并肩地放在同一个窗口。注意,在使用TV命令。明白这是为什么吗?IDLWindow,XSize=192*2,YSize=192IDLTV,image1IDLTV,image2,192,0现在需要用一个灰度颜色表(颜色表索引号为0)将左边的图像显示出来。必须将那些灰度级颜色装入颜色表中被第一个图像数据占用的部分。键入:IDLLoadCT,0,NColors=half,Bottom=0如果用XLoadCT命令将颜色装入颜色表的第二部分,就能为右边的图像交互式地选择想要的任何颜色表。如下:IDLXLoadCT,NColors=half,Bottom=half为了继续本章后面的例子,要恢复一个正常的颜色表,键入:IDLLoadCT,0在24位显示器上用不同的颜色表显示图像当在16位或24位显示器上运行时,使用不同的颜色表和装入颜色并显示图像一样简单。例如,如果正在一个16位或24位的显示器上运行时,可以试一试:IDLworld=LoadData(7)IDLWindow,1,Title=‘GrayScaleImage’IDLLoadCT,0IDLTV,worldIDLWindow,2,Title=‘ColorImage’IDLLoadCT,5IDLTV,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)这个数据组是一个按像素扫描的图像。通过键入如下命令可知道这点:IDLHelp,roseROSEBYTE=Array[3,227,149]要在一个8位显示器上显示一幅24位的图像,仅仅需要用关键字True来说明其用的是哪种扫描方式。True=1为隔像素扫描;True=2为隔行扫描;True=3为隔波段扫描。IDLWindow,XSize=227,YSize=149IDLTV,rose,True=1;Pixel-interleaved注意,24位图像在8位显示器上显
本文标题:IDL入门教程三(上)
链接地址:https://www.777doc.com/doc-2877187 .html