编程实现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

提交评论