mercoledì 28 febbraio 2018

USGS Spectral Library Convex Hull con Octave

Questo post e' l'inizio di un lavoro sulle reti neurali applicate a dati iperspettrali (il tema della mia tesi di dottorato)

Per usare una rete neurale e' necessario avere una ottima base dati di training ed ho scelto l'archivio USGS Spectral Library scaricabile liberamente e con dati in formato testuale



Il primo lavoro da fare e' quello di normalizzare gli spettri. Quando ero all'Universita' avevo accesso ad una licenza di Matlab ma adesso devo impiegare Octave, la versione Open Source di Matlab.
Questo metodo e' descritto nell'articolo

Two GUIs-based analysis tool for spectroradiometer data pre-processing

----------------------------------------------------------------------------------
close all
clear all

filename = 's07HYPRN_Actinolite_HS22.2B_ASDFRb_AREF.txt';
fid = fopen (filename, "r");
conta = 0;
nr = 2;
dati = [];

#aggiunge uno zero in testa 
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];

#legge tutte le righe del file saltando
#la prima ed inserendo il tutto in array
while (!feof(fid))
  text_line = fgetl(fid);
  #salta la prima riga descrittiva
  if (conta > 0)
    transi = str2num(text_line);
    # salta in valori NULL
    if (transi > 0)
      dati = [dati;transi];
      nr = nr +1;
      endif
  endif
  conta = conta + 1;
endwhile
fclose (fid);

#aggiunge uno zero in coda
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];


x = 1:1:nr;
reshape(x,1,nr);

#calcola la convex hull dello spettro
cx = convhull(x,dati);

#rende continua la convex hull 
#la convex hull viene calcolata di default
#come una spezzata di segmenti
xq = 1:1:nr;
vq1 = interp1(x(cx),dati(cx),xq);

#divide ogni valore di riflettanza per il corrispondente
#valore della convex hull per ottenere valori normalizzati
dati2 = reshape(dati,1,nr);
normalizzato = dati2./vq1;

#plotta i dati 
plot(x(cx),dati(cx),'r-',x,vq1,'b*',x,normalizzato,"g*");

#salvi i dati normalizzati in un file csv
normalizzato = normalizzato(2:nr-1);

#il nome del file normalizzato ha un prefisso "norm_"
filename = ["norm_" filename];
dlmwrite(filename,normalizzato);

Nessun commento:

Posta un commento