IDL將ENVI ROI生成的TXT轉爲CSV

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章