用IDL编写读取ROI样本点的方法

IDL作为遥感界常用的语言,在图像处理方面相比于Python,Matlab等具有很大的优势。IDL语言在编译的过程中编译器自动将代码进行多线程的编译和执行。因此其对数据的处理速度是Python和Matlab望尘莫及的。

在遥感影像处理方面,经常需要读取ROI样本点,但是ROI每个类别中的样本点数量并不定相等,无法用长度不可变的数组来读取。在这里有两种解决方案,第一种,当用到某一类的ROI样本点时再用硬盘中读取,一个ROI文件分多次读取。第二种就是采用链表的形式,将所有ROI样本点数据全部读入内存。显然,第一种方法由于多次从硬盘读写数据,其速度相当慢;但是节省内存空间。第二种方法由于一次性将所有ROI数据全部读入内存,因此其速度较快,但是耗内存,但是链表的长度和维数是可变的,因此更加灵活多变。但是,一般在遥感图像处理方面,一个ROI文件的大小相对内存的大小,还是可以忽略不计的。因此本文只介绍第二种读取方法。以下为读取代码。

function ReadAllSample
 ;通过样本链表的形式读取样本,以适应不同类别样本量不同的情况
 dataList=List()

 file=‘文件路径和名称'    ;将file作为实参传入


 if file_test(file) eq 0 then retrun

 temp = ''
 class = 0  ;类数

 ;获取文件数据
 openr,lun,file,/get_lun
 readf,lun,temp
 ;读取训练样本的类别数
 readf,lun,temp
 reslt = strsplit(temp,/extract)
 class = long(reslt[n_elements(reslt)-1])
 ;读取两行空
 readf,lun,temp
 readf,lun,temp
 classnum = make_array(class,/LONG)
 ;读取每个样本的像元数大小和颜色值
 for i = 0, class-1 do begin
   readf,lun,temp
   readf,lun,temp
   readf,lun,temp ;读取每一个样区中的样本数量
   reslt = strsplit(temp,/extract)
   classnum[i] = long(reslt[n_elements(reslt)-1])
   readf,lun,temp
 endfor
 
 ;读取数据
 ;data = lindgen(196,50)
 classmean = make_array(class,4)
 for i = 0, class-1 do begin
    data = make_array(196,classnum[i],/Long)
   for j = 0, classnum[i]-1 do begin
     readf,lun,temp
     if temp eq '' then CONTINUE
     reslt = strsplit(temp,/extract)
     strreslt=size(reslt,/N_elements)
     for z=0,strreslt-6 do begin
       data[z,j] = reslt[z+5]
       ;data[1,j,i] = long(reslt[n_elements(reslt)-2])
       ;data[2,j,i] = long(reslt[n_elements(reslt)-1])
     endfor

   endfor
   dataList.Add,data
 endfor

 return,dataList
 

end


 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值