IDL入門教程三(上)_第1頁
IDL入門教程三(上)_第2頁
IDL入門教程三(上)_第3頁
IDL入門教程三(上)_第4頁
IDL入門教程三(上)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第三章圖像數(shù)據(jù)處理本章概要IDL最開始是一種處理圖像的語言。正因?yàn)榇?,世界各地的許多科學(xué)家和工程師仍在用IDL語言。這章闡述了圖像處理的基本工作。將從中學(xué)到以下幾點(diǎn)怎樣讀取和顯示圖像數(shù)據(jù)怎樣縮放圖像數(shù)據(jù)怎樣在顯示窗口中定位圖像怎樣改變圖像的大小怎樣從顯示設(shè)備中讀取圖像怎樣完成基本的圖像處理任務(wù)怎樣建立簡單的圖像濾波器圖像處理事實(shí)上,任何類型的二維數(shù)據(jù)集都可認(rèn)為是一幅圖像。但是要在一個(gè)8位的顯示設(shè)備上顯示圖像數(shù)據(jù),就必須將圖像數(shù)據(jù)調(diào)整為0~255之間的字節(jié)型數(shù)值。(在一個(gè)24-bit的顯示設(shè)備上,24位圖像的RGB值必須調(diào)整成字節(jié)型數(shù)值。)因?yàn)閳D像總是以字節(jié)型數(shù)值顯示,所以圖像總是以字節(jié)型數(shù)組來存儲(chǔ)。但是無論圖像是怎樣存儲(chǔ)的,圖像總是由兩個(gè)顯示圖像的IDL命令:TV和TVScl以字節(jié)型數(shù)值來顯示。要了解是怎樣工作的,需要有一些圖像數(shù)據(jù)用于處理。用命令LoadData來打開圖像數(shù)據(jù)集AliandDave。將要處理這兩幅圖像數(shù)據(jù)中的第二幅圖像。鍵入IDL>image=LoadData(10)IDL>image=image[*,*,1]顯示圖像可用TV和TVScl兩個(gè)IDL命令中的任一個(gè)來顯示圖像。這兩個(gè)命令幾乎在各個(gè)方面都是一樣的,包括能與之一起使用的關(guān)鍵字。僅僅在一個(gè)方面不同:TVScl將圖像數(shù)據(jù)調(diào)整為與IDL運(yùn)行時(shí)所用顏色數(shù)目相適應(yīng)的字節(jié)型數(shù)值。例如:如果在使用IDL時(shí)用220種顏色,則在圖像顯示之前TVScl將圖像數(shù)據(jù)調(diào)整為0~219之間的字節(jié)型數(shù)值。另一方面,TV命令取圖像數(shù)據(jù)本身的值,僅僅將其作為字節(jié)型數(shù)值傳送到顯示設(shè)備上。如果有必要,圖像數(shù)據(jù)將被截?cái)嘁苑献止?jié)型數(shù)值。如果圖像數(shù)據(jù)不被調(diào)整到0~255之間,圖像將很可能顯示不正確。注意,與Plot,Surface和Contour命令不同,TV和TVScl命令在顯示圖像之前不刪除已顯示的內(nèi)容。一般情況下這個(gè)問題不大,但有時(shí)候也會(huì)產(chǎn)生一些麻煩。如果想要一個(gè)干凈的顯示窗口來顯示圖像數(shù)據(jù),無論當(dāng)前窗口上的顯示內(nèi)容是什么,都可用一個(gè)簡單的命令Erase來刪除。IDL>Erase這里有一個(gè)實(shí)例。剛才讀取的IDL的圖像數(shù)據(jù)集已經(jīng)調(diào)整在0~255之間。可以鍵入如下內(nèi)容來查看:IDL>Print,Max(image),Min(image)但是,如果在一個(gè)8位顯示設(shè)備上工作,可能沒有全部使用在顯示器上可用的256種顏色。如果需要了解正在使用多少種顏色,可鍵入:IDL>Print,!D.Table_Size在一個(gè)8位顯示器(這里指顏色表的大小)上,運(yùn)行IDL時(shí)所用顏色的數(shù)目通常是在210~240之間,顯然可用的顏色太少了。在一個(gè)24位的顯示器上,可以獲得1670000種顏色,但顏色表大小仍然是256。以后將會(huì)學(xué)到IDL是怎樣選擇它所用的顏色數(shù)目。打開一個(gè)顯示窗口,裝上灰度顏色表,用TV命令顯示圖像:IDL>Window,0,XSize=192,YSize=192IDL>LoadCT,0IDL>TV,image所得圖像應(yīng)如圖30所示。圖30:IDL和ResearchSystems公司的創(chuàng)始人--DavidStern的圖像。People.dat數(shù)據(jù)集中的另外一幅圖像是AliBahrami,ResearchSystems公司的第一為員工。他們兩個(gè)依然致力于IDL的開發(fā)。 因?yàn)槭怯肨V命令,所以數(shù)據(jù)沒有經(jīng)過調(diào)整就被傳送到顯示器中。盡管看不出來,但圖像上所有大于IDL運(yùn)行時(shí)的顏色數(shù)目的像素值都被設(shè)為同樣的值。也就是說,比!D.Table_Size-1值大的像素被以相同的顏色顯示。(在這種情況下,看到的顏色是灰色明暗圖。)如果用TVScl命令顯示圖像,也許能看出差別。打開另一個(gè)窗口并將其移到第一個(gè)窗口的旁邊。用TVScl命令顯示圖像:IDL>window,1,XSize=192,YSize=192IDL>TVScl,image可看到兩個(gè)圖像的明暗程度不同。因?yàn)檫@幅圖像數(shù)據(jù)最大值為238,所以差別是很微弱的。如果看不出差別,可先在0~255之間對(duì)數(shù)據(jù)進(jìn)行調(diào)整:IDL>west,0IDL>image=Bytscl(image)IDL>tv,imageIDL>west,1IDL>tvscl,image如果仍不能看到差別,可裝入顏色表。RedTemperature顏色表可能起作用。鍵入:IDL>LoadCT,3如果要了解TVScl作了些什么,可調(diào)整數(shù)據(jù)并用TV命令顯示:IDL>Window,2,XSize=192,YSize=192IDL>scaled=Bytscl(image,Top=!D.Table_Size-1)IDL>TV,scaled在窗口2中看到的圖像應(yīng)與窗口1中的圖像一樣。這就是所說的,TVScl將數(shù)據(jù)調(diào)整為與IDL運(yùn)行時(shí)所用顏色數(shù)目相適應(yīng)的字節(jié)型數(shù)值。注意:如果在顯示窗口的圖像不是用red_temperature顏色表顯示的話,則可能是在一個(gè)16位或24位彩顯上使用IDL。在這種情況下,為了下面的練習(xí),確保關(guān)閉顏色分解器。鍵入如下命令:IDL>Device,Decomposed=0IDL>TV,scaled如果用的是一個(gè)16位或24位顯示器,為了看到新的顏色生效,在改變顏色表后,需要重新運(yùn)行每個(gè)圖形命令。在一個(gè)16位或24位顯示器上,顏色表中的顏色沒有直接被索引或連接到顯示器上的色彩表。何況顏色表是圖像用來查找每個(gè)像素該使用哪種顏色的一種方法。而像素的顏色是直接表示的。一般來說,如果不知道數(shù)據(jù)是否被調(diào)整過,很可能想用TVScl命令,因?yàn)檫@將給圖像像素值以最大可能的對(duì)比度。但是如果顏色對(duì)來說是重要的話(并且它幾乎總是這樣),那么可能從來不想用TVScl命令。相反,將愿意自己縮放圖像數(shù)據(jù),然后用TV命令來顯示。調(diào)整圖像數(shù)據(jù)假設(shè)正在測(cè)量大氣壓,并將測(cè)量數(shù)據(jù)在一色棒旁邊以圖像顯示??赡芟氡容^這個(gè)星期收集的圖像數(shù)據(jù)和上個(gè)星期收集的圖像數(shù)據(jù)。換句話說,想確定一種特定的顏色,比如紅色,在這套數(shù)據(jù)中的紅色和上個(gè)星期的數(shù)據(jù)中的紅色表示相同的壓力。如果用TVScl命令顯示這個(gè)星期和上個(gè)星期的圖像數(shù)據(jù),絕對(duì)不能保證特定的紅色在兩個(gè)數(shù)據(jù)組中能代表同一事情。這些出入來自兩個(gè)原因。第一,可能今天使用IDL時(shí)的顏色數(shù)目和上個(gè)星期使用IDL時(shí)不同。因?yàn)門VScl將圖像數(shù)據(jù)調(diào)整到IDL運(yùn)行時(shí)的顏色數(shù)目內(nèi),這可能會(huì)引起錯(cuò)誤。第二,不能確保兩組數(shù)據(jù)組間具有相同的數(shù)據(jù)范圍。因而,用TVScl調(diào)整可能再次引起錯(cuò)誤。為解決這些問題,可用BytScl命令調(diào)整數(shù)據(jù),并用TV命令顯示。為確保IDL運(yùn)行時(shí)所用的顏色數(shù)目不引起錯(cuò)誤,可將數(shù)據(jù)調(diào)整到相同的顏色值內(nèi)。并且,為確保數(shù)據(jù)集中數(shù)據(jù)的范圍不引起錯(cuò)誤,可以將數(shù)據(jù)調(diào)整到同樣的數(shù)據(jù)范圍。可通過BytScl命令,應(yīng)用關(guān)鍵字Top,Min和Max實(shí)現(xiàn)上述要求。例如,假設(shè)總是想以100種不同的灰度深淺或顏色深淺來顯示數(shù)據(jù),并且假設(shè)在任何數(shù)據(jù)集中希望最小數(shù)據(jù)值為15,而最大的有效值為245??捎萌缦翨ytScl命令實(shí)現(xiàn):IDL>scaledImage=BytScl(image,Min=15,Max=245,Top=99)這個(gè)例子中,數(shù)據(jù)調(diào)整之前在數(shù)據(jù)集中小于15的數(shù)值將設(shè)定為15。類似地,在數(shù)據(jù)調(diào)整之前,在數(shù)據(jù)集中任何大于245的數(shù)值將被設(shè)定為245。一旦數(shù)據(jù)被調(diào)整了,就可用TV命令顯示。IDL>TV,scaledImage如果總是這樣調(diào)整數(shù)據(jù)集(并且在IDL運(yùn)行時(shí)總是有至少100個(gè)灰色級(jí)別或顏色數(shù)),那么上個(gè)星期的數(shù)據(jù)集就能直接與這個(gè)星期的數(shù)據(jù)集比較。一個(gè)特定的顏色,紅色將總是表示一個(gè)特定的數(shù)據(jù)范圍或壓力。可能在顯示器上開了許多圖像窗口。可用一個(gè)簡單的命令刪除所有開著的窗口。鍵入:IDL>WHILE!D.WindowNE-1DOWDelete,!D.Window將圖像調(diào)整到顏色表的不同部位需要知道如何調(diào)整圖像數(shù)據(jù)的另一個(gè)理由,是要能在使用8位顯示器時(shí),將數(shù)據(jù)調(diào)整到顏色表的不同部位。這使圖像能用不同顏色顯示出來,或者能將顏色表的特定色段用于特別的目的。例如,也許想將顏色表的一部分保留作為畫圖用的顏色。注意:用24位彩顯的一個(gè)很大的好處是能隨時(shí)使用一個(gè)沒有限制的顏色表。24位彩顯的缺點(diǎn)是,在改變顏色表之后,為了看到新顏色生效,不得不重新運(yùn)行圖形命令(例如:TV命令)。在本書后面將看到如何編寫程序,使得當(dāng)一個(gè)新的顏色表裝入后,能自動(dòng)重新運(yùn)行圖形命令。在大多數(shù)8位顯示器上僅僅有一個(gè)物理顏色表,并且所有的IDL圖形窗口都用它。但是通過操作顏色表可以讓它看上去象是同時(shí)裝入幾個(gè)不同的顏色表??梢酝ㄟ^將不同的顏色表裝入到一個(gè)物理顏色表的不同部位來實(shí)現(xiàn)這一點(diǎn)。也許實(shí)現(xiàn)這點(diǎn)的最簡單的方式是在LoadCT或XLoadCT命令中用NColors和Bottom關(guān)鍵字。例如,假設(shè)想用兩個(gè)看上去不同的顏色表來顯示同一幅圖像。在用IDL打開一個(gè)圖形窗口后,能通過測(cè)試系統(tǒng)變量!D.Table_Size的值知道在IDL運(yùn)行時(shí)顏色表中有多少種顏色。如果將這個(gè)數(shù)目一分為二,就知道每個(gè)圖像該用多少種顏色:IDL>half=!D.Table_Size/2為了在同一窗口用看上去不同的兩個(gè)顏色表顯示圖像數(shù)據(jù)image,必須將圖像數(shù)據(jù)調(diào)整為適應(yīng)兩個(gè)顏色空間范圍的值。首先,用BytScl命令調(diào)整圖像數(shù)據(jù)為適應(yīng)第一個(gè)部分顏色表的值,生成一個(gè)新的圖像image1:IDL>image1=BytScl(image,Top=half-1)現(xiàn)在,按如下做法將圖像數(shù)據(jù)調(diào)整為適應(yīng)第二個(gè)部分顏色表的值,生成第二個(gè)圖像image2:IDL>image2=BytScl(image,TOP=half-1)+Byte(half)按如下做法將兩個(gè)已調(diào)整的圖像肩并肩地放在同一個(gè)窗口。注意,在使用TV命令。明白這是為什么嗎?IDL>Window,XSize=192*2,YSize=192IDL>TV,image1IDL>TV,image2,192,0現(xiàn)在需要用一個(gè)灰度顏色表(顏色表索引號(hào)為0)將左邊的圖像顯示出來。必須將那些灰度級(jí)顏色裝入顏色表中被第一個(gè)圖像數(shù)據(jù)占用的部分。鍵入:IDL>LoadCT,0,NColors=half,Bottom=0如果用XLoadCT命令將顏色裝入顏色表的第二部分,就能為右邊的圖像交互式地選擇想要的任何顏色表。如下:IDL>XLoadCT,NColors=half,Bottom=half為了繼續(xù)本章后面的例子,要恢復(fù)一個(gè)正常的顏色表,鍵入:IDL>LoadCT,0在24位顯示器上用不同的顏色表顯示圖像當(dāng)在16位或24位顯示器上運(yùn)行時(shí),使用不同的顏色表和裝入顏色并顯示圖像一樣簡單。例如,如果正在一個(gè)16位或24位的顯示器上運(yùn)行時(shí),可以試一試:IDL>world=LoadData(7)IDL>Window,1,Title=‘GrayScaleImage’IDL>LoadCT,0IDL>TV,worldIDL>Window,2,Title=‘ColorImage’IDL>LoadCT,5IDL>TV,world顯示24位圖像真彩色(或24位)圖像也能用TV命令顯示。24位圖像總是由一個(gè)3維數(shù)據(jù)集構(gòu)成,它的3個(gè)維數(shù)中的一個(gè)值設(shè)為3。例如,數(shù)據(jù)集可以是一個(gè)m*n*3的數(shù)組,這種情況下,圖像被認(rèn)為是隔波段掃描(band-interleaved);如果圖像是m*3*n則被認(rèn)為是隔行掃描(row-interleaved);如果是3*m*n則被認(rèn)為是隔像素掃描(pixel-interleaved)。裝載一幅24位圖像,鍵入如下命令:IDL>rose=LoadData(16)這個(gè)數(shù)據(jù)組是一個(gè)按像素掃描的圖像。通過鍵入如下命令可知道這點(diǎn):IDL>Help,roseROSEBYTE=Array[3,227,149]要在一個(gè)8位顯示器上顯示一幅24位的圖像,僅僅需要用關(guān)鍵字True來說明其用的是哪種掃描方式。True=1為隔像素掃描;True=2為隔行掃描;True=3為隔波段掃描。IDL>Window,XSize=227,YSize=149IDL>TV,rose,True=1 ;Pixel-interleaved注意,24位圖像在8位顯示器上顯示將表現(xiàn)為灰度級(jí)。要在這樣的顯示器上看到真彩色的圖像,需要?jiǎng)?chuàng)建一幅2維圖像以及伴隨該24位圖像或3維圖像數(shù)據(jù)的紅色、綠色、藍(lán)色顏色表。這在IDL中可用命令Color_Quan來實(shí)現(xiàn)。如果使用8位顯示器,鍵入如下命令:IDL>image2d=Color_Quan(image24,1,r,g,b)IDL>TVLCT,r,g,bIDL>TV,image2d現(xiàn)在可看到彩色圖像了。在24位顯示器上顯示24位圖像如果使用的是一臺(tái)24位顯示器,情形稍微復(fù)雜一點(diǎn)。為了正確顯示一幅24位圖像,必須打開顏色分解器。這在大多數(shù)真彩模式下的工作站上自動(dòng)實(shí)現(xiàn)的,但在真彩模式Windows下,IDL5.2版本卻不能自動(dòng)實(shí)現(xiàn)。為確保以正確的圖像顏色顯示24位圖像,應(yīng)該在24位顯示器上鍵入如下命令:IDL>Device,Decomposed=1IDL>TV,image24注意,下載的本書配套的程序TVImage自動(dòng)設(shè)置正確的顏色分解器,這取決于要顯示的圖像是24位還是8位。在24位顯示器上顯示8位圖像在一臺(tái)24位顯示器上,8位圖像在顯示時(shí)遍歷了整個(gè)顏色表。換句話說,一個(gè)8位圖像的像素值被作為一個(gè)索引號(hào),該索引號(hào)為給定的像素查找特定的紅色,綠色和藍(lán)色。這意味著如果在使用IDL時(shí)改變了顏色表,必須重新顯示該2維圖像來看新的顏色是否生效。這是因?yàn)樵?4位顯示器上顏色是在圖像被顯示時(shí)決定的,同時(shí)也因?yàn)檎谟肦GB顏色模式。并且特別要注意必須關(guān)上顏色分解器,否則將忽視顏色表矢量,并總是用灰度色彩來顯示8位圖像。如果用的是一個(gè)24位顯示器,鍵入如下命令:IDL>world=LoadData(7)IDL>Window,XSize=360,YSize=360IDL>LoadCT,5IDL>Device,Decomposed=0IDL>TV,world為了以另一種顏色表顯示圖像,裝入該顏色并重新運(yùn)行TV命令,使圖像像素值遍歷整個(gè)顏色表矢量。注意當(dāng)只運(yùn)行LoadCT命令時(shí),圖像顏色不變。IDL>LoadCT,3IDL>TV,world控制圖像顯示順序通常,當(dāng)IDL顯示一幅圖像時(shí),習(xí)慣上圖像的第0列和第0行為圖像的左下角。有些人喜歡將圖像的第0列和第0行作為圖像的左上角。如果喜歡第二種習(xí)慣方式,可以通過設(shè)置系統(tǒng)變量!Order讓IDL使用習(xí)慣。在缺省時(shí),!Order設(shè)為0。如果希望將所有圖像的左上角都顯示在第0列和第0行,可設(shè)置!Order=1。如果只是希望用第二種方式顯示某幅圖像,可在使用TV或TVScl命令時(shí),用關(guān)鍵字Order設(shè)置。例如,可以同時(shí)觀看兩種顯示方式,鍵入:IDL>Window,XSize=192*2,YSize=192IDL>TVScl,image,Order=0IDL>TVScl,image,Order=1,192,0可能從別人那兒得到一個(gè)圖像數(shù)據(jù)文件,顯示時(shí)倒過來了。這大多是因?yàn)閯?chuàng)建數(shù)據(jù)文件的人在排放第0列和第0行時(shí)用了不同的習(xí)慣。將關(guān)鍵字Order的值反過來,看是否糾正了錯(cuò)誤.改變圖像尺寸IDL提供了兩個(gè)改變圖像大小的命令:Rebin和Congrid。Rebin的限制為新建圖像的尺寸必須是原始圖像尺寸的整數(shù)倍或整數(shù)比例。例如,變量image可以在X方向或Y方向上變化為192/2和192*3個(gè)元素。但不應(yīng)該是300或500個(gè)元素。圖像大小也可以在一個(gè)方向減小,另一個(gè)方向增大。例如,可將變量image重新變化為384列和96行,鍵入如下命令。IDL>Window,XSize=384,YSize=96IDL>new=Rebin(image,384,96)IDL>TVScl,new輸出圖像應(yīng)與圖31類似。圖31:用Rebin命令縮放的圖像其大小必須與原始圖像大小有整數(shù)倍關(guān)系。在缺省情況下,當(dāng)放大一幅圖像時(shí)Rebin采用雙線性插值,當(dāng)縮小一幅圖像時(shí)則采用最鄰近平均法。如果關(guān)鍵字Sample被設(shè)定后,在兩個(gè)方向上都可用最鄰近采樣法。雙線性插值更為精確,但需要更多的計(jì)算時(shí)間。IDL>Window,XSize=192/2,YSize=192/2IDL>new=Rebin(image,96,96,/Sample)IDL>TVScl,new除了下面兩個(gè)方面外,Congrid與Rebin是相似的。第一,在新圖像中的列數(shù)和行數(shù)可以設(shè)為任意值。第二,在缺省情況下,用的是最鄰近采樣法。如果想用雙線性插值,必須設(shè)置關(guān)鍵字Interp:IDL>Window,XSize=600,YSize=400IDL>new=Congrid(image,600,400,/Interp)IDL>TVScl,new在PostScript設(shè)備上改變圖像大小象PostScript這種設(shè)備,其像素是可調(diào)節(jié)的(相對(duì)于固定像素的顯示器來說),在調(diào)節(jié)圖像尺寸時(shí)有所不同。(詳細(xì)信息參考185頁的“顯示器與PostScript設(shè)備的差別”)。特別是,可不用Rebin或Congrid命令來改變圖像的大小,而是用TV或TVScl命令通過關(guān)鍵字XSize和Ysize來改變圖像的大小。例如,當(dāng)將圖像輸出到一個(gè)PostScript文件時(shí),如果想將圖像的顯示比例定為6:4的話,也許愿意用如下代碼,而不是上面的用Congrid命令將圖像放大為600*400。IDL>thisDevice=!D.NameIDL>Set_Plot,'PS'IDL>Device,XSize=6,YSize=4,/InchesIDL>TVScl,image,XSize=6,YSize=4,/InchesIDL>Set_Plot,thisDevice如果圖像大小和位置是用下面的歸一化坐標(biāo)來表示的,可以寫出真正的獨(dú)立于顯示設(shè)備的圖像顯示代碼。在顯示窗口中定位圖像通常顯示一幅圖像時(shí),IDL將圖像的左下角放在窗口的左下角。但是可通過TV或TVScl命令的附加參數(shù)來將圖像移動(dòng)到顯示窗口中的其它位置。例如,如果給出第二個(gè)參數(shù),它則被視為圖像在窗口中的位置。圖像位置由顯示窗口的尺寸和圖像的尺寸計(jì)算出來的。詳細(xì)算法可參閱TV命令的在線幫助。鍵入:IDL>?TV位置可從顯示器的左上角開始,一直到顯示器的右下角。例如,在384*384的顯示窗口內(nèi),從顯示器的左上角開始,對(duì)于192*192的圖像來說有四種位置。鍵入:IDL>Window,XSize=384,YSize=384IDL>TVScl,image,0IDL>TVScl,image,1IDL>TVScl,image,2IDL>TVScl,image,3通過顯式地指定圖像左下角的象素位置來定位一幅圖像是可以的。TV或TVScl命令中在圖像數(shù)據(jù)名后給定兩個(gè)附加參數(shù)即可以實(shí)現(xiàn)這點(diǎn)。例如,將一幅192*192名為image的圖像定位于剛剛創(chuàng)建的顯示窗口中間??涉I入:IDL>Erase,Color=!D.Table_Size-1IDL>TVScl,image,96,96這樣,將圖像的左下角放在像素點(diǎn)(96,96)處。當(dāng)希望為附加圖留下空間時(shí),如色棒或其它的注釋,這種定位圖像的方法是很重要的。例如,鍵入如下命令來在窗口的左邊顯示一個(gè)色棒,在窗口的右邊顯示圖像。顯示窗口將如圖32所示。IDL>Window,XSize=320,YSize=320圖32:此圖像用顏色棒來顯示其顏色梯度IDL>ncolors=!D.Table_SizeIDL>TvLCT,255,255,0,ncolors-1IDL>Erase,color=ncolors-1IDL>colorbar=Replicate(1B,20)#BIndGen(256)IDL>TV,BytScl(colorbar,Top=ncolors-2),32,36IDL>TV,BytScl(image,Top=ncolors-2),92,64用歸一化的坐標(biāo)來定位圖像用歸一化的坐標(biāo)系來定位圖像和確定圖像大小是很方便的。這與其它IDL圖象命令使用關(guān)鍵字Position的用法相似。(詳細(xì)信息參考185頁的“顯示器與PostScript設(shè)備的差別”)。如果要在可變尺寸的窗口內(nèi)顯示圖像,或者要在同一顯示窗口內(nèi)與其它IDL的圖形程序共同使用圖像,或者希望所編寫的將圖像傳送到一個(gè)PostScript文件的IDL程序不遇到麻煩,在這些情況下,用歸一化坐標(biāo)定位圖像和確定圖像大小是非常方便的,特別是對(duì)最后一種情況。例如,剛才鍵入的命令是放一個(gè)色棒在圖像旁。盡管這些命令在顯示窗口內(nèi)可以很好地工作,但如果想在PostScript設(shè)備上輸出中得到類似的結(jié)果,上述命令是不可能的。(若有問題,參考185頁的“顯示器與PostScript設(shè)備的差別”)。假設(shè)可以用關(guān)鍵字Position在窗口中確定圖像的大小和位置,那么結(jié)果將如何呢?設(shè)想將圖像放入一個(gè)任意的窗口內(nèi),并占滿其比如80%的空間。相對(duì)于歸一化坐標(biāo)來說,可將圖像在窗口的位置表達(dá)為:position=[0.1,0.1,0.9,0.9]但這是怎樣被翻譯成圖像通常使用的設(shè)備坐標(biāo)的呢?這自然要取決于顯示窗口的大小。但能夠知道顯示窗口中可視部分的大小。這是由系統(tǒng)變量!D.X_VSize和!D.Y_Vsize以設(shè)備或像素單元來給定的。通過像素坐標(biāo),可以按如下方法計(jì)算出圖像所需的尺寸和在輸出窗口起始的位置:xsize=(position[2]-position[0])*!D.X_VSizeysize=(position[3]-position[1])*!D.Y_VSizexstart=position[0]*!D.X_VSizeystart=position[1]*!D.Y_VSize將圖像輸出到顯示設(shè)備和輸出到PostScript文件的唯一區(qū)別是如何確定圖像的尺寸??梢跃帉懭缦麓a來顯示圖像:IF!D.NameEQ'PS'THEN$TV,image,XSize=xsize,YSize=ysize,xstart,ystart$ELSE$TV,Congrid(image,xsize,ysize),xstart,ystart無論是將圖像輸出到顯示器還是輸出到PostScript文件中,上述代碼都起作用。但這樣做時(shí)圖像的橫縱比例不能得到保證。事實(shí)上,可以讓圖像適合窗口的形狀。這對(duì)一些應(yīng)用程序來說工作的很好,但對(duì)另一些卻不是這樣。無論在什么情況下該問題很容易解決,因?yàn)槿绻氡A魣D像的橫縱比例時(shí),只需固定好圖像的一邊,并以適當(dāng)?shù)姆绞秸{(diào)整圖像另一邊的坐標(biāo)即可。實(shí)現(xiàn)該項(xiàng)功能的代碼已經(jīng)寫好,放在下載的程序TVImage中。無論是在顯示終端,還是在PostScript文件中,TVImage都用關(guān)鍵字Position來定位圖像和確定圖像大小,。如果希望TVImage程序能完好地保持顯示圖像的橫縱比例,可以使用關(guān)鍵字Keep_Aspect_Ratio??梢杂肨VImage重新生成色棒位于圖像左邊的上述圖像:IDL>Erase,color=ncolors-1IDL>barPosition=[32,32,52,292]/320.0IDL>imagePosition=[92,64,284,256]/320.0IDL>colorbar=Replicate(1B,20)#BIndGen(256)IDL>TVImage,BytScl(colorbar,Top=ncolors-2),$Position=barPositionIDL>TVImage,BytScl(image,Top=ncolors-2),$Position=imagePosition這樣做的好處,不但因?yàn)閳D像可以在任何尺寸的窗口或PostScript文件中以及顯示器上顯示,而且因?yàn)樗沟迷陲@示窗口中輕易增加其它圖形成為可能。例如,可以非常容易地在色棒和圖像周圍放置外框或標(biāo)記。鍵入:IDL>TvLCT,255,255,255,ncolors-1IDL>Plot,[0,!D.Table_Size,YRange=[0,!D.Table_Size],$/NoData,Color=0,Position=barPosition,XTicks=1,$/NoErase,XStyle=1,YStyle=1,XTickFormat='(A1)'?$YTick=4IDL>Plot,IndGen(192),IndGen(192),/NoData,$Position=imagePosition,/NoErase,$ XStyle=1,YStyle=1,Color=0輸出結(jié)果應(yīng)如圖33所示。圖33:用命令TVImage不僅允許使用獨(dú)立于設(shè)備的方法定位圖像而且容易使用其它圖形命令從顯示器中讀取圖像有時(shí)花許多時(shí)間,運(yùn)行許多命令,才得到了喜歡的圖形顯示。將圖形顯示讀到一個(gè)圖像變量中以便處理甚至硬拷貝輸出是很方便的。因此,現(xiàn)在需要知道如何得到IDL圖形窗口的拷屏??梢杂肨VRD命令將IDL圖形窗口的內(nèi)容讀到一個(gè)2維IDL字節(jié)型數(shù)組中。要在一個(gè)8位顯示器上讀取整個(gè)圖形窗口,可鍵入如下命令:IDL>Window,XSize=250,YSize=250IDL>TVScl,imageIDL>new_image=TVRD()IDL>Help,new_image注意,新創(chuàng)建的變量現(xiàn)在是一個(gè)250*250字節(jié)的數(shù)組。在24位顯示器上截屏如果在16位或24位顯示器上運(yùn)行IDL,不能象上面那樣使用TVRD命令。16位或24位顯示器有3個(gè)顏色通道。如果象上面不用任何參數(shù)來使用TVRD命令,那么得到的2維數(shù)組的每個(gè)像素值為該像素三個(gè)通道中的最大像素值。除非裝載一個(gè)灰度色彩表(這樣,每個(gè)通道有同樣的值),否則就不是所期望的。要想在24位顯示器上截

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論