由於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