編程實現BIP、BSQ、BIL三種格式轉換詳解_第1頁
編程實現BIP、BSQ、BIL三種格式轉換詳解_第2頁
編程實現BIP、BSQ、BIL三種格式轉換詳解_第3頁
編程實現BIP、BSQ、BIL三種格式轉換詳解_第4頁
編程實現BIP、BSQ、BIL三種格式轉換詳解_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、編程實現BIP、BSQ、BIL三種格式轉換一、實驗目的理解遙感圖像BIP、BIL、BSQ三種格式數據的組織方式,以及它們互相轉換原理 和方法。二、實驗原理ENVI柵格圖像文件,是以字節數據為單位,再按照指定順序組織、排列而成,具 體有如下三種方式:1. BIP(像元波段交叉式):以一對像元為基本單位進行記錄;2. BIL(波段按行交叉格式):按照掃描行為單位各波段同一掃描行數據依次記錄 圖像按順序第一個像元所有的波段,接著是第二個像元的所有波段,然后是第三個像 元的所有波段,等等,直到像元總數為止;3. BSQ(波段順序格式):以波段為單位,每波段所有掃描行依次記錄,每行數據后 面緊接著同一波

2、譜波段的下一行數據。所以實現三種格式的轉換,實際上是對圖像字節進行重新排序。三、實驗思路獲取圖像相關信息(可通過讀取頭文件)V根據圖像格式讀取字節數據對獲取的字節數據按照目標文件格式順序寫入、保存四、實驗步驟1. 新建項目文件:本實驗選用的語言是 C#,開發工具是 VisualStudio2010 ,通 過“文件一新建一項目一 C#Windows窗體應用程序”,命名“格式轉換”即 可;2. 編寫代碼:通過實驗思路的流程圖,我們確定代碼也應該分這三個功能來寫, 對應可以組織為三個大方法,再細分,調用即可。(1).編寫讀取頭文件代碼:ENVI中柵格圖像被分為兩個文件存儲,一個“.HDR ”頭文件和

3、一個數據文件,頭文件存儲了圖像描述信息,它是一個文本文件,我們可以用 System.lO.SreamReader字符讀取流按行讀取,再用字符串匹配方法,以讀取字段的方式獲取圖像的行數、列數、波段數、基本數據類 型,即可,具體代碼可見后文代碼附錄;(2) .編寫數據讀取數據文件代碼:圖像數據組織方式有 BIP、BIL、BSQ三種,那么對應的也應該有三個方法按照行、列、波段交叉順序對圖像字節數據進行讀取,具體代碼見后文;(3) .編寫字節數據重排列存儲代碼:在讀取了圖像數據文件后,可以通過FileStream類按照目標類型格式文件組織順序,把字節數據寫入到文件中保存 即可,具體代碼見后文。3. 編

4、譯與調試:通過用預先知道內部字節數據的實驗文件,進行測試,輔助斷 點調試,可排除一般問題,接著編譯生成目標程序;4. 運行程序查看結果:通過對多種格式、多種基本數據類型、多種像素大小的文件進行多種方式轉換,再利用ENVI打開兩個圖像查看是否一樣,再輔以“Link ”功能看同一像素點值是否相同,這樣可以深層確定轉換的正確性。五、結果與分析1.結果回圖像數據基本 類型代碼, 如:”1”為1字 節 byte, ”2” 為 2字節short等程序運行界面轉換2息EinhaME Tools Windowe叫梧式塔換=回源格式(BSQ)(BIL)轉換后結杲分析總結(1) 讀取頭文件時,不能通過各字段的現有

5、位,按位讀取,應該按行讀取, 再利用字符串匹配方式,找到指定字段,這樣避免字段位變化時讀取出錯誤信(2).再讀取數據文件和寫入存儲時,應該要以基本數據類型長度個字節為 單位進行,不能單純的以一個字節操作,不然會不具有普遍性,遇到以“int、float ”為基本類型的文件時,就會出錯;(3) 要想節省代碼,可先將各種格式數據讀取存儲為一種格式字節數組中, 再從這個格式往其他格式進行轉換,這樣可以節省不少工作量,但是引入了中 間數組,耗費了內存。目標格式LinK確定相同位置數據一致2 TM Band 1:TMB$Q=!TMBandlTMBJLFie Ovday Enbante Tools Wind

6、ow輸入頭文件D: EN VIIDLIDL80p rod u ct5en vi48data 選擇輸入數據文件 D: EN VIIDLIDL80p rod u ct5en vi48data 蘇文件信息像素列數640波段個數&數據種類1像素行數400數據格式bsq解譯格式 b=q六、源代碼附錄1讀取頭文件信息/III讀取頭文件信息/vparamn ame=strFileNamex/param頭文件路徑和名稱/vparamn ame=iColu mn sCou ntx/param像素列數/vparamn ame=iL in esCou ntx/param像素行數/vparamn ame=iBa nd

7、sCou ntx/param波段數/vparamname=iTypev/param基本數據類型代碼/vparamn ame=strI nterLeavex/param文件組織格式/vretur nsv/retur ns返回是否讀取成功publicstaticboolReadHDRStri ngstrFileName, outiLin esCou nt,out intiBandsCount, outint iType, outout intStr ingstrI nterLeint iColu mn sCou nt.ave)boolbln Successfalse ;iColum nsCou n

8、t-1;iLin esCou nt-1;iBan dsCou nt-1;iType-1;strl nterLeaveIII!/初始化各個變量StreamReader hdrfile= null ;tryhdrfile = new StreamReader (strFileName); string content=;while (hdrfile.EndOfStream!=true )/獲取像素列數exOf( = )+1,exOf( = )+1,content = hdrfile.ReadLi ne();if (content.Contains(samples)String samples =

9、conten t.Substr in g(c onten t.I nd content.Length-content.IndexOf(= )-1).Trim();iColu mn sCou nt= Con vert .ToI nt32(samples);System. Con sole .WriteLi ne(samples);break ;while(hdrfile.EndOfStream!= true )/獲取像素行數content = hdrfile.ReadL in e();exOf( = )+1,ifconten t.Le ngth(conten t.C ontains(li nes

10、)Stri ng lines = conten t.Substr in g(c onten t. Ind -content.IndexOf(= )-1).Trim();iLin esCou nt = Con vert .ToI nt32(li nes);System. Con sole .WriteL in e(l in es);break ;while(hdrfile.EndOfStream!= true ) /獲取波段個數content = hdrfile.ReadLi ne();if(content.Contains(bands)Stri ng bands = conten t.Subs

11、tr in g(c onten t. Ind content.Length- content.IndexOf(= )-1).Trim();iBa ndsCou nt = Con vert .ToI nt32(ba nds);System. Con sole .WriteL in e(ba nds);break ;while(hdrfile.EndOfStream!= true )/獲取數據種類content = hdrfile.ReadLi ne();if(content.Contains(data type)dexOf( =)+1,conten t.Le ngthString type =

12、conten t.Substri ng(c onten t.I n -content.dexOf(=)-1).Trim();iType = Con vert .ToI nt32(type);System. Con sole .WriteLi ne(type);break ;while (hdrfile.EndOfStream!= true )/獲取數據解譯方式content = hdrfile.ReadLi ne();if(conten t.C ontains(in terleave)String in terleve = conten t.Substri ng(c onten t.I nde

13、xOf(=)+ 1,content.Lengthcontent.IndexOf(= )-1).Trim();strI nterLeave= in terleve;System. Con sole .WriteLi ne(i nterleve); bln Success= true ;break ;catch/讀取失敗hdrfile.Close();hdrfile.Dispose();return false ;hdrfile.Close();hdrfile.Dispose();/關閉文件流,釋放內存retur nbln Success;2讀取數據文件進行轉換存儲/bip轉換為bsq/源文件名稱

14、與路徑/目標文件名稱與路徑/像素行數/像素列數/ 波段數/基本數據類型代碼/v/retur ns是否轉換成功public staticle, intpixComCounts, intstrOutputFibool BipToBsq( string strlnputFile, string pixL in eCou nts, int ban ds, int type)boolbln Success= true ;FileStream inputF = new FileStream (strInputFile,FileMode .Ope n);FileStream outputF = new Fi

15、leStream (strOutputFile,FileMode.CreateNew);int totalsize = pixComCou nts *pixL in eCou nts* bands *type; /計算輸入文件總字節數if (totalsize!=in putF.Le ngth)return false ;byte bts = new byte totalsize;int num = 0, bt;while (bt = in putF.ReadByte() -1)/讀取出全部字節數據,存儲在數組中btsnum= (byte )bt;n um+;ban ds;bandn um+)

16、pixL in eCou nts;row+)for (intbandnum = 0;bandnum /讀取波段寫入for (introw = 0; row/按行寫入forCoun ts; colu mn um+) /* bands * row+ colum num *typetype;type num+)+type num);(int colu mnum =0; colum num pixCom讀取列寫入int startpos = pixComCou nts * type* bands + bandnum * type;for (int type num =0; type num /讀取數據

17、基本單元類型輸入數據outputF.WriteByte(btsstartposoutputF.Flush();/保存緩存文件outputF.Close();/關閉撤銷變量文件outputF.Dispose();Ope n);e.CreateNew);in putF.CIose();in putF.Dispose(); retur nbln Success;/bsq轉換為bil/源文件名稱與路徑/目標文件名稱與路徑/像素行數/像素列數/ 波段數/基本數據類型代碼/v/retur ns是否轉換成功publicstaticbool BsqToBil( stringstrInputFile,stri

18、ngpixComCou pixL in eCou nts,intban ds, inttype)File, intboolbln Success= true ;FileStreaminputF= new FileStream (strInputFile,FileStream outputF = new FileStream (strOutputFile,int totalsize=pixComCou nts * pixL in eCou ntsstrOutputFileMode .FileModbands *type; /計算輸入文件總字節數if (totalsize!=inpu

19、tF.Length)return false ;byte bts = new byte totalsize;int num = 0,bt;while (bt=inputF.ReadByte()-1)/讀取出全部字節數據,存儲在數組中btsnum =(byte )bt;n um+;for (introw =0; rowpixLineCounts; row+)/按行寫入數據for(intbandnum=0; bandnum bands;bandnum+)/按波段寫入數據int startpos = pixComCou nts * pixL in eCou nts * type * bandn um

20、+row*pixComCou nts*type;for (intcolu mnum = 0; colum num pixComCoun ts;colu mn um+)/寫入沒一列數據for (int type num =0; type num type;type num+)/按數據基本單元類型輸入數據outputF.WriteByte(btsstartpos+ colum num*type+type num);outputF.Flush();/保存緩存文件outputF.Close();/關閉撤銷變量文件outputF.Dispose();in putF.Close();in putF.Dis

21、pose();retur nbln Success;Ope n);e.CreateNew);/bil轉換為bip/源文件名稱與路徑/目標文件名稱與路徑/像素行數/像素列數/ 波段數/基本數據類型代碼/v/retur ns是否轉換成功publicstaticbool BilToBip( stri ngstrI nputFile,stri ngpixComCou pixL in eCou nts,intban ds, inttype)File, intboolbln SuccessFileStreamFileStreamint totalsizetrue ;in putFoutputFnewnewFileStream (strInputFile,FileStream (strOutputFile,pixComCou nts *pixL in eCou ntss

溫馨提示

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

評論

0/150

提交評論