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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

7、sCou ntx/param波段數(shù)/vparamname=iTypev/param基本數(shù)據(jù)類型代碼/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 )/獲取像素列數(shù)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 )/獲取像素行數(shù)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 ) /獲取波段個數(shù)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 )/獲取數(shù)據(jù)種類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 )/獲取數(shù)據(jù)解譯方式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();/關(guān)閉文件流,釋放內(nèi)存retur nbln Success;2讀取數(shù)據(jù)文件進(jìn)行轉(zhuǎn)換存儲/bip轉(zhuǎn)換為bsq/源文件名稱

14、與路徑/目標(biāo)文件名稱與路徑/像素行數(shù)/像素列數(shù)/ 波段數(shù)/基本數(shù)據(jù)類型代碼/v/retur ns是否轉(zhuǎn)換成功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; /計算輸入文件總字節(jié)數(shù)if (totalsize!=in putF.Le ngth)return false ;byte bts = new byte totalsize;int num = 0, bt;while (bt = in putF.ReadByte() -1)/讀取出全部字節(jié)數(shù)據(jù),存儲在數(shù)組中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 /讀取數(shù)據(jù)

17、基本單元類型輸入數(shù)據(jù)outputF.WriteByte(btsstartposoutputF.Flush();/保存緩存文件outputF.Close();/關(guān)閉撤銷變量文件outputF.Dispose();Ope n);e.CreateNew);in putF.CIose();in putF.Dispose(); retur nbln Success;/bsq轉(zhuǎn)換為bil/源文件名稱與路徑/目標(biāo)文件名稱與路徑/像素行數(shù)/像素列數(shù)/ 波段數(shù)/基本數(shù)據(jù)類型代碼/v/retur ns是否轉(zhuǎn)換成功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; /計算輸入文件總字節(jié)數(shù)if (totalsize!=inpu

19、tF.Length)return false ;byte bts = new byte totalsize;int num = 0,bt;while (bt=inputF.ReadByte()-1)/讀取出全部字節(jié)數(shù)據(jù),存儲在數(shù)組中btsnum =(byte )bt;n um+;for (introw =0; rowpixLineCounts; row+)/按行寫入數(shù)據(jù)for(intbandnum=0; bandnum bands;bandnum+)/按波段寫入數(shù)據(jù)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+)/寫入沒一列數(shù)據(jù)for (int type num =0; type num type;type num+)/按數(shù)據(jù)基本單元類型輸入數(shù)據(jù)outputF.WriteByte(btsstartpos+ colum num*type+type num);outputF.Flush();/保存緩存文件outputF.Close();/關(guān)閉撤銷變量文件outputF.Dispose();in putF.Close();in putF.Dis

21、pose();retur nbln Success;Ope n);e.CreateNew);/bil轉(zhuǎn)換為bip/源文件名稱與路徑/目標(biāo)文件名稱與路徑/像素行數(shù)/像素列數(shù)/ 波段數(shù)/基本數(shù)據(jù)類型代碼/v/retur ns是否轉(zhuǎn)換成功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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論