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

来源:互联网 发布:linux安装xwindows 编辑:程序博客网 时间:2024/05/18 02:21

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


 

0 0
原创粉丝点击