ENVI二次開(kāi)發(fā)技術(shù)黑幕_第1頁(yè)
ENVI二次開(kāi)發(fā)技術(shù)黑幕_第2頁(yè)
ENVI二次開(kāi)發(fā)技術(shù)黑幕_第3頁(yè)
ENVI二次開(kāi)發(fā)技術(shù)黑幕_第4頁(yè)
ENVI二次開(kāi)發(fā)技術(shù)黑幕_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1前言envi (the environment for visualizing images) 遙感影像處置軟件是美國(guó)itt公司推出的基于交互式數(shù)據(jù)語(yǔ)言idl 開(kāi)發(fā)的一套功能壯大的遙感影像處置系統(tǒng),envi 能夠輕松的讀取、 顯示、分析各類(lèi)類(lèi)型的遙感數(shù)據(jù)并提供了從影像預(yù)處置、信息提取到與地理信息系統(tǒng)整合的完整處置流程。但對(duì)一些特殊需求, 如添加未知格式數(shù)據(jù)支持、 處置流程定制等可能都需要二次開(kāi)發(fā)的模式。 envi 比較方便的進(jìn)行二次開(kāi)發(fā),這是由于其底層壯大的idl語(yǔ)言支持,多種開(kāi)發(fā)方式支持及200多個(gè)功能函數(shù)接口等因素決定的。2envi 二次開(kāi)發(fā)的層次envi 的二次開(kāi)發(fā)包括三個(gè)層次,env

2、i 的功能擴(kuò)展、獨(dú)立系統(tǒng)開(kāi)發(fā)和其他語(yǔ)言集成開(kāi)發(fā)。envi 的功能擴(kuò)展是利用envi 的現(xiàn)有功能及底層idl 語(yǔ)言壯大的運(yùn)算能力實(shí)現(xiàn)的功能模塊的定制開(kāi)發(fā),在現(xiàn)有 envi 的主框架上擴(kuò)展功能模塊, 添加自系統(tǒng)功能補(bǔ)丁等方式。獨(dú)立系統(tǒng)開(kāi)發(fā)是在非交互式envi 環(huán)境下 (如 idl 構(gòu)建系統(tǒng)框架), 利用 envi提供的函數(shù)接話(huà)柄現(xiàn)數(shù)據(jù)處置功能。其他語(yǔ)言集成開(kāi)發(fā)指的是在其他語(yǔ)言如vc+、 visual 下挪用 envi 的功能。2.1 功能擴(kuò)展2.1.1 波段、波譜運(yùn)算與自概念功能擴(kuò)展 envi 的功能最簡(jiǎn)單的方式確實(shí)是利用波段和波譜運(yùn)算功能,通過(guò)該方式用戶(hù)能夠在波段和波譜運(yùn)算表達(dá)式對(duì)話(huà)框輸入運(yùn)算函

3、數(shù)進(jìn)行交互運(yùn)算。波段、波譜運(yùn)算功能的實(shí)現(xiàn)有兩種方式:數(shù)學(xué)表達(dá)式和波段、 波譜運(yùn)算函數(shù)。數(shù)學(xué)表達(dá)式:該方式充分利用idl 的數(shù)組處置能力,通過(guò)簡(jiǎn)單表達(dá)式輸入方式實(shí)現(xiàn)復(fù)雜的功能。實(shí)例:兩圖像的波段b1 和 b2,波段 b1 中的云部份(以為象元值大于200為云)用波段 b2 的部份替代。實(shí)現(xiàn)的步驟1) 在 envi 主菜單下,選擇basic toolsband math, 在彈出的 bandmath界面中,在 enter an expresion里面輸入表達(dá)式2) 點(diǎn)擊 add to list 按鈕,然后在 previous band math expressions里面選擇輸入的表達(dá)式點(diǎn)擊ok。

4、3) 在彈出的界面當(dāng)選擇表達(dá)式中變量賦需要計(jì)算的波段。波段、波譜運(yùn)算函數(shù)編寫(xiě)波段運(yùn)算函數(shù)跟數(shù)學(xué)表達(dá)式相較,在操作上更靈活, 函數(shù)中能夠添加更多的操縱,如運(yùn)算中的錯(cuò)誤檢測(cè)等。函數(shù)的編寫(xiě)超級(jí)簡(jiǎn)單,同意輸入波段,處置數(shù)據(jù),并返回結(jié)果。實(shí)例:以編寫(xiě)( b1+b2)/ (b1-b2)功能為例,步驟如下1) 編寫(xiě)函數(shù)并保留; 函數(shù)定義為兩個(gè)輸入波段b1和b2以及一個(gè) check 關(guān)鍵字functionbm_ratio ,b1,b2,check=check ; 計(jì)算差值 den= float (b1)-b2 ; 如設(shè)置 check 關(guān)鍵字,檢查被0除問(wèn)題if (keyword_set(check) then

5、 ptr=where (den eq 0. ,count) $ else count= 0if (count gt 0) then den ptr= ; 繼續(xù)計(jì)算比率結(jié)果 result=(float (b1)+b2)/den if (count gt 0) then resultptr= ; 返回結(jié)果return ,result end2) 加載函數(shù)加載函數(shù)的方式有兩種。注意的是不同的文件需要注意下利用環(huán)境,假設(shè)是 sav文件,啟動(dòng) envi 或 envi+idl都可,但假設(shè)是 pro 文件,必需要啟動(dòng) envi+idl 。(1)直接編譯文件,在envi 的主菜單下,選擇 file compi

6、le idl module,選擇 pro 或 sav文件進(jìn)行編譯;(2)把或 sav文件放入 envi 安裝目錄下的 . envi46save_add下,重啟 envi 。3) 執(zhí)行函數(shù)在 envi 主菜單下,選擇 basic toolsband math,在彈出的 bandmath界面中,在 enter an expresion里面輸入函數(shù)挪用點(diǎn)擊 ok 執(zhí)行。2.1.2 用戶(hù)自概念功能用戶(hù)自概念功能許諾用戶(hù)為envi 添加新功能并通過(guò)envi 菜單進(jìn)行訪問(wèn)。當(dāng)用戶(hù)通過(guò)菜單項(xiàng)選擇擇該函數(shù)對(duì)應(yīng)的菜單項(xiàng)時(shí),將會(huì)執(zhí)行這些函數(shù),就猶如envi 本身自帶的功能一樣。 分為兩個(gè)步驟, 一是編寫(xiě)功能代碼,

7、 二是修改菜單。1) 編寫(xiě)功能代碼用戶(hù)函數(shù)能夠是pro 或 sav,如是 pro 那么與一般的 idl 程序無(wú)任何區(qū)別, 用戶(hù)函數(shù)必需放入到envi 安裝目錄下的 save_add目錄中, 在 envi啟動(dòng)時(shí)用戶(hù)函數(shù)能夠被自動(dòng)編譯或恢復(fù)。用戶(hù)函數(shù)pro 代碼能夠隨時(shí)進(jìn)行修改, envi 只需從頭編譯函數(shù)而不需要重啟。2) menu 文件修改envi 的菜單文件在系統(tǒng)中途徑為ittidlxxproductsenvixxmenu ,利用記事本就能夠打開(kāi)。文件頂部有些介紹的注釋文本,然后確實(shí)是文件的結(jié)構(gòu):前面以 ;開(kāi)頭的是注釋文本,后面是菜單概念。菜單概念每一行開(kāi)始的數(shù)據(jù)概念了菜單項(xiàng)的層次。0 表示

8、最頂層, 1 表示一級(jí)子菜單, 2 表示二級(jí)子菜單,如此類(lèi)推。以 1級(jí)菜單為例說(shuō)下內(nèi)容概念:open image file概念了顯示在菜單上的內(nèi)容。open envi file 概念了為菜單項(xiàng)所賦給的用戶(hù)值,在處置多個(gè)菜單項(xiàng)時(shí)有效。envi_menu_event概念了菜單項(xiàng)事件處置程序的名稱(chēng)。修改保留該文件然后重啟envi 即可。3) 函數(shù)修改envi 提供函數(shù) envi_define_menu_button來(lái)實(shí)現(xiàn)菜單的程序添加。用法如下:功能函數(shù)名稱(chēng)為my_function,event,成立一進(jìn)程pro my_function_define_buttons, buttoninfo,添加工作在

9、那個(gè)進(jìn)程中完成。envi_define_menu_button的挪用格式如下:envi_define_menu_button, buttoninfo , /, = string, /, =string, =long integer or string , = long integer , = variable , =string , =0 | 1 | -1 , /, =string關(guān)鍵字說(shuō)明:display-是創(chuàng)建在主菜單仍是顯示菜單;value - 菜單的顯示信息;uvalue 菜單的 uvalue event_pro-程序事件名稱(chēng);menu- 是不是為菜單ref_index- 若 ref_

10、value 不唯一那么可用此來(lái)設(shè)置;ref_value - 已存在菜單名;sibling - 是不是創(chuàng)建同級(jí)菜單。4) 實(shí)例編寫(xiě) landsat-7 etm+的單影像去條帶補(bǔ)丁背景: 由于 landsat-7 etm+機(jī)載掃描行校正器 (slc) 故障致使 2003 年 5 月 31 日以后獲取的圖像顯現(xiàn)了數(shù)據(jù)條帶丟失,見(jiàn)以下圖。嚴(yán)峻阻礙了landsat etm 遙感影像的利用。針對(duì)該現(xiàn)象,實(shí)現(xiàn)一個(gè)對(duì)該傳感器進(jìn)行去條帶的補(bǔ)丁。分析:由于數(shù)據(jù)中包括有同名的掩膜文件,該掩膜文件可將條帶完全覆蓋。基于此那么程序?qū)崿F(xiàn)的時(shí)候只需依照掩膜文件進(jìn)行判定即可,而無(wú)需再依照數(shù)據(jù)值進(jìn)行。條帶部份數(shù)據(jù)的填充方式采取

11、條帶兩邊數(shù)據(jù)線性插值,盡管有些地址數(shù)據(jù)有些失真,該方式是速度比較快的容易實(shí)現(xiàn)方式。代碼編寫(xiě):依照前面的分析,代碼函數(shù)名及功能如下。tm_destripe:主函數(shù),數(shù)據(jù)的讀取、挪用條帶去除功能及存儲(chǔ);tm_destripe_define_buttons :創(chuàng)建 envi 主菜單按鈕;stripfill :條帶數(shù)據(jù)的賦值填充;pro tm_destripe, event ;讀取掩膜數(shù)據(jù)maskdata= float(envi_get_data(fid= m_fid,dims= dims,pos = 0) ;波段循環(huán)for bandidx =0,n_elements(pos)-1 do begin

12、;讀取原數(shù)據(jù)oridata = float(envi_get_data(fid= fid,dims= dims,pos = posbandidx) resdata = oridata ;列循環(huán)for i=0, ns-1 do begin envi_report_sta t, reportbase, bandidx*(ns+1)+i, n_elements(pos)*(ns+1), cancel=cancel if cancel eq 1 then break ;獲取 0 索引部分zeroidx = where(maskdatai,* eq 0) ;處理resdatai,* = stripfil

13、l (oridatai,*, zeroidx,ns) endfor ;進(jìn)度條end;添加菜單pro tm_destripe_define_buttons, buttoninfo envi_define_menu_button, buttoninfo, value = landsat-7 etm+ destripe, $ uvalue=landsat-7 etm+ destripe(改進(jìn) ), event_pro=tm_destripe, $ ref_value = destripe, $ position = after endfunction stripfill,data, zeroidx,

14、nlength num = n_elements(zeroidx) ;返回結(jié)果數(shù)據(jù)rdata = data startidx = 0 for i=0,num-2 do begin ;當(dāng)不等于1 的時(shí)候if (zeroidxi+1 - zeroidxi) gt 1 then begin endidx = i if startidx ne 0 then begin ;兩方向存在數(shù)據(jù)if zeroidxendidx ne nlength-1 then begin sdata = datazeroidxstartidx-1*1. edata = datazeroidxendidx+1*1. index

15、 = findgen(zeroidxendidx+1-zeroidxstartidx+1+1)0)/(zeroidxendidx+1-zeroidxstartidx+1+1)0 ;格網(wǎng)式插值并平滑rdatazeroidxstartidx-1:zeroidxendidx+1 =smooth(interpolate(sdata,edata,index, /grid),2) endif endif startidx =i+1 endif endfor return,rdata end程序運(yùn)行將 pro或生成的 sav放在save_add 目錄下, 重啟 envi+idl 或envi , 在basic

16、 toolspreprocessing general purpose utilities 下會(huì)自顯現(xiàn) landsat-7 etm+ destripe 功能菜單,如圖。處置后結(jié)果對(duì)條帶數(shù)據(jù)進(jìn)行處置后,關(guān)聯(lián)顯示后可發(fā)覺(jué),條帶去除成效很明顯。2.2系統(tǒng)開(kāi)發(fā)系統(tǒng)開(kāi)發(fā)模式是離開(kāi)envi 主界面的程序運(yùn)行方式, 充分利用了 idl 語(yǔ)言的快速、簡(jiǎn)單等特點(diǎn),能夠輕松、方便的實(shí)現(xiàn)批處置數(shù)據(jù)轉(zhuǎn)換等功能。系統(tǒng)開(kāi)發(fā)模式與 envi 下的利用不同,需要進(jìn)行該模式的初始化,在系統(tǒng)關(guān)閉時(shí)需要對(duì)模式進(jìn)行關(guān)閉。 實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單, 初始化和關(guān)閉就下面函數(shù)中的幾行代碼。;初始化 envi 系統(tǒng)開(kāi)發(fā)模式envi,/restor

17、e_base_save_files envi_batch_init,log_file= ;關(guān)閉 envi 批處理模式envi_batch_exit實(shí)例:批量將多個(gè)多波段數(shù)據(jù)的3、二、 1 波段存為三通道的tif 文件,假設(shè)數(shù)據(jù)波段少于三那么全數(shù)存儲(chǔ)。分析:實(shí)現(xiàn)如此的功能批處置模式最符合要求,因需求中波段固定3、二、1,故讀取數(shù)據(jù)和存儲(chǔ)tif 文件函數(shù)都可挪用envi 的函數(shù)來(lái)實(shí)現(xiàn)。代碼編寫(xiě):分兩部份,一是界面構(gòu)建與交互處置,二是數(shù)據(jù)的存儲(chǔ)功能。界臉部份:tlb = widget_base(mbar= mbar, $ /column , $ title = 批處理轉(zhuǎn)換為tiff, $ space

18、 = 0 , xpad = 0, ypad = 0 , $ /tlb_kill_request_events, $ tlb_frame_attr = 1, map = 0) ;創(chuàng)建菜單fmenu = widget_button(mbar, value =文件 ,/menu) fexit = widget_button(fmenu, value = 退出 , $ uname = exit,/sep) hmenu = widget_button(mbar, value =幫助 ,/menu) hhelp = widget_button(hmenu, value = 關(guān)于 , $ uname = a

19、bout,/sep) ;上面的輸入base winputbase = widget_base(tlb, $ xsize =sz0, /column) ;下面的輸出base woutputbase = widget_base(tlb, $ /row,xsize =sz0) ;中間的參數(shù)base wsetbase = widget_base(tlb, $ xsize =sz0, /row) wbutton = widget_button(winputbase,value =打開(kāi)數(shù)據(jù)文件, $ uname = open) wlist = widget_list(winputbase, $ ysize

20、 = sz1/(2*15),$ xsize = sz0/8) ; values = 源文件路徑 , $ 另選擇路徑 bgroup = cw_bgroup(woutputbase, values, $ /row, /exclusive, $ ;label_top= 輸出路徑 , $ /no_release, set_value=1, $ uname = filepathsele, $ /frame) outpath = widget_text(woutputbase, $ value = , $ xsize =35, $ /editable, $ uname = outroot) wsele =

21、 widget_button(woutputbase, $ value =選擇路徑 , $ uname =selepath) wbutton = widget_button(wsetbase,$ value =存為 tiff, $ uname = tiff)功能部份代碼;文件信息envi_file_query , fid, dims=dims, nb=nb,bnames = bnames ; 如果波段小于3 個(gè)if nb le 3 then begin bandlist = indgen(nb) endif else begin bandlist = 3,2,1 ; endelse ;存儲(chǔ) t

22、iff 文件envi_output_to_external_format,fid = fid,$ dims = dims, out_name=out_name,pos = bandlist, $ out_bname=bnamesbandlist,/tiff運(yùn)行主界面2.3 集成開(kāi)發(fā)集成開(kāi)發(fā)指的是在其他語(yǔ)言如vc+、visual 下挪用 envi 的功能。這種開(kāi)發(fā)實(shí)現(xiàn)的方式跟idl 的集成開(kāi)發(fā)一致, 只是在功能方式編寫(xiě)的時(shí)候采納的envi的系統(tǒng)開(kāi)發(fā)的形式,能夠通過(guò)下面幾種方式進(jìn)行。callable 技術(shù)envi/idl函數(shù)能夠作為動(dòng)態(tài)鏈接庫(kù)被外部程序挪用啟動(dòng),稱(chēng)之為callable idl 技術(shù)

23、。利用 callable idl 技術(shù),外部程序能夠像在idl 環(huán)境中一樣執(zhí)行idl 的代碼。下面以 visual c+ 為例,實(shí)現(xiàn)挪用envi 或 idl 函數(shù)的要緊步驟:1.成立 vc 的 mfc 工程,添加 ittidl70externalinclude的頭文件;2.工程 設(shè)置 連接中的對(duì)象/庫(kù)模塊中添加;3.工具 選項(xiàng) 目錄中的library files 添加 idl 的安裝途徑;4.我的電腦右鍵屬性 高級(jí) 環(huán)境變量系統(tǒng)變量path 中添加idl的安裝途徑;5.idl 初始化執(zhí)行代碼“ idl_win32init(0,handle,null,0)”;6.執(zhí)行 idl 的命令語(yǔ)句用“ i

24、dl_executestr(“ * ” ) ”;7.退出時(shí)清除idl 挪用命令: “ idl_cleanup(true)”。idldrawwidget 跟 callable 技術(shù)類(lèi)似, idldrawwidget技術(shù),能夠?qū)nvi/idl函數(shù)作為com 組件被外部程序挪用啟動(dòng)。以c#為例,該方式挪用envi/idl函數(shù)的步驟:1.成立一個(gè)windows 應(yīng)用程序;2.在工具箱上右鍵選擇項(xiàng) com 組件選中 idldrawwidget control 并拖動(dòng)控件到窗體上;3.設(shè)定 idl 庫(kù)文件目錄;4.初始化 idl 控件: n = (int) ;5. ( “ * ”);執(zhí)行 idl 命令。

25、對(duì)象導(dǎo)出利用對(duì)象導(dǎo)出向?qū)軌驅(qū)nvi 或 idl 的功能添加到其他應(yīng)用軟件中,該種模式能夠很容易地將envi 或 idl 對(duì)象輸出到j(luò)ava 和 com 環(huán)境,進(jìn)而直接縮短接口開(kāi)發(fā)時(shí)刻。能夠?qū)С?envi 或 idl 的 pro 文件或 sav 文件, java 和 com 的實(shí)現(xiàn)步驟大體類(lèi)似。導(dǎo)出 java 對(duì)象1在導(dǎo)出對(duì)象概念的進(jìn)程后加_ define(以類(lèi)的形式 );2在 idl 命令行中輸入idlexbr_assistant 回車(chē)打開(kāi)對(duì)象輸出向?qū)В?file new project java選擇要輸出的* 或*文件加載進(jìn)輸出向?qū)В?設(shè)置對(duì)象要輸出的進(jìn)程、函數(shù)及其參數(shù);5保留工程fil

26、e save project;6編譯輸出對(duì)象build build object ;7生成 *.java 和*.class 文件。導(dǎo)出 com 組件1在導(dǎo)出對(duì)象概念的進(jìn)程后加_ define(以類(lèi)的形式 );2我 的電腦右鍵屬性 高級(jí) 環(huán)境變量 系統(tǒng) 變量path 中 添加: c:program filesmicrosoft visual studio 8common7ide;3在 idl 命令行中輸入idlexbr_assistant 回車(chē)打開(kāi)對(duì)象輸出助手;4file new project com 選擇要輸出的*或*文件加載進(jìn)輸出向?qū)В?設(shè)置對(duì)象要輸出的進(jìn)程、函數(shù)及其參數(shù);6保留工程fil

27、e save project;7編譯輸出對(duì)象build build object ;8生成 *.dll 和*.tlb 文件 (或*.ocx 和*.tlb) ;9在運(yùn)行頂用regsvr32 對(duì) dll(ocx)注冊(cè)。實(shí)例:以 com 組件的方式實(shí)現(xiàn) 2005 下 envi 非監(jiān)督分類(lèi)方式的功能挪用。第一編寫(xiě) idl 代碼實(shí)現(xiàn)非監(jiān)督分類(lèi)的方式代碼; iso mean 分類(lèi)算法function usingenvi:iso, inputfile,out_name compile_opt idl2 envi_open_file , inputfile, r_fid=fid if (fid eq - 1)

28、 thenbegin self-quitreturn , 0endifenvi_file_query , fid, dims=dims, nb=nb pos = lindgen (nb) envi_doit, class_doit , $ dims=dims, $ fid=fid, $ method= 4, $ ;| isodata (unsupervised) out_name=out_name, $ pos=pos, $ ; iterations=1, $ ; 迭代次數(shù) change_thresh=, $ ; iso_merge_dist= 5, $ iso_merge_pairs= 2,

29、 $ iso_min_pixels=1, $ iso_split_std=iso_split_std, $ ; 此參數(shù)不必須 min_classes= 5, $ num_classes=10return , 1end; k-meanfunction usingenvi:kmean, inputfile,out_name compile_opt idl2 envi_open_file , inputfile, r_fid=fidif (fid eq - 1) thenbegin self-quitreturn , 0endif; get the spatial dimensions and #

30、of bands; for the input file.;envi_file_query , fid, dims=dims, nb=nb ; set the pos to classify all; data (spectrally) in the file. ; pos = lindgen (nb) envi_doit, class_doit , $ dims=dims, $ fid=fid, $ method= 7, $ ;| k-means (unsupervised) out_name=out_name, $ pos=pos, $ ; iterations=1, $ ; 迭代次數(shù) change_thresh=, $ ; num_classes=5return , 1end; initialize envi and send all errorsfunction usingenvi:startenvi envi, /restore_base_save_files ;envi_batch_init, log_file=return , 1end; exit envi

溫馨提示

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

評(píng)論

0/150

提交評(píng)論