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