由于ENVI选取ROI后可以导出一个TXT但是并不是CSV,所以希望生成一个仅有各个特征值和类序号的一个CSV。
参看了之前的一个博客,但是我这个可以自动识别特征值有几个构成的,就是ROI输出的波段有几个。
希望给大家一点参考吧
PRO GETROI
;读取ENVI导出训练区的txt文件
filename = dialog_pickfile(path = 'H:\IceClassification\sentinel\Strait\download\Baseimage\GLCM\txt\',filter = '*txt', /MULTIPLE_FILES)
; if file_test(filename[0]) eq 0 then return
for filen=0,n_elements(filename)-1 do begin
file=filename[filen]
temp = ''
class = 0 ;类数
result=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
; print,class
;颜色存储
clor = make_array(class,3,/long)
classnum = make_array(class,/LONG)
;读取每个样本的像元数大小和颜色值
reslt_n=0 ;数据段个数
for i = 0, class-1 do begin
readf,lun,temp
readf,lun,temp
reslt = strsplit(temp,/extract)
tempr = reslt(n_elements(reslt)-3)
r = long(strmid(tempr,1,strlen(tempr)-2))
tempg = reslt(n_elements(reslt)-2)
g = long(strmid(tempg,0,strlen(tempg)-1))
tempb = reslt(n_elements(reslt)-1)
b = long(strmid(tempb,0,strlen(tempb)-1))
clor[i,0] = r
clor[i,1] = g
clor[i,2] = b
readf,lun,temp
reslt = strsplit(temp,/extract)
classnum[i] = long(reslt[n_elements(reslt)-1])
readf,lun,temp
if i eq class-1 then begin
reslt = strsplit(temp,/extract)
reslt_n=n_elements(reslt)-3 ;减一是因为这一行有;号以及Map X和Map Y分开计数了
endif
endfor
;读取数据段
; data = make_array(4,class)
classmean = make_array(class,4)
for i = 0, class-1 do begin
data = make_array(reslt_n-7+1,classnum[i],value = 0d)
; readf,lun,temp
for j = 0, classnum[i]-1 do begin
readf,lun,temp
reslt = strsplit(temp,/extract)
for z=0, reslt_n-7-1 do begin
data[z,j] = FLOAT(reslt[z+7]);导入数据信息
endfor
; data[0,j] = FLOAT(reslt[n_elements(reslt)-4]);
; data[1,j] = FLOAT(reslt[n_elements(reslt)-3]);
; data[2,j] = FLOAT(reslt[n_elements(reslt)-2]);
; data[3,j] = FLOAT(reslt[n_elements(reslt)-1]);
data[reslt_n-7,j] = i;为类别序号
endfor
if i eq 0 then begin
result=data
endif else begin
result=[[result],[data]]
endelse
;求获取数据的特征值
;1、均值向量求取
for k = 0L , 3 do $
classmean[i,k] = mean(data[k,*])
;2、求得
if (EOF(lun) eq 0) then $
readf,lun,temp
endfor
free_lun,lun
outname='H:\IceClassification\sentinel\Strait\download\Baseimage\GLCM\csv\'+file_basename(file,'.txt')+'.csv'
print,outname
WRITE_CSV,outname,result
;'H:\IceClassification\sentinel\new_year\20180922145343\select_no_m.csv'
;H:\IceClassification\sentinel\new_year\20180107220948\roi\25_25_1_0_32.csv
endfor
END