venerdì 24 aprile 2026

Convertire USGS Spectral LIbrary in formato Envi

 

 


import os
import pandas as pd
import numpy as np
import spectral.io.envi as envi

def create_envi_library(input_folder, output_filename):
spectra_data = []
names = []
wavelengths = None

files = sorted([f for f in os.listdir(input_folder) if f.endswith('.txt')])

if not files:
print("No .txt files found in the directory!")
return

for file in files:
file_path = os.path.join(input_folder, file)
try:
df = pd.read_csv(file_path, sep=r'\s+', comment='#', header=None, engine='python')
# Clean up: ensure we only have numeric rows
df = df[pd.to_numeric(df[0], errors='coerce').notnull()]
df = df.astype(float)
if wavelengths is None:
wavelengths = df[0].values
spectra_data.append(df[1].values)
names.append(os.path.splitext(file)[0])
print(f"Processed: {file}")
except Exception as e:
print(f"Skipping {file}: {e}")


lib_array = np.array(spectra_data).astype(np.float32)
lib_array = lib_array.reshape((lib_array.shape[0], 1, lib_array.shape[1]))
lib_array[lib_array < -100] = 0
metadata = {
'file type': 'ENVI Spectral Library',
'wavelength': list(wavelengths.astype(str)),
'wavelength units': 'Micrometers',
'spectra names': names,
'data type': 4, # Float32
'interleave': 'bsq'
}


output_path = output_filename if output_filename.endswith('.sli') else output_filename + '.sli'
envi.save_image(output_path + '.hdr', lib_array, metadata=metadata, force=True)
print(f"\nSuccess! Created {output_path} and associated header.")

# Usage
input_dir = '/home/luca/Downloads/ASCIIdata/ASCIIdata_splib07b_cvASD/ChapterM_Minerals'
output_name = 'USGS_splib07b_ASD_Library'
create_envi_library(input_dir, output_name)



Nessun commento:

Posta un commento

Mappa frane da news on line

Correva l'anno 2008 ed il mio direttore di Dipartimento mi aveva chiesto di lavorare sui Big Data per estrarre dati di geolocalizzazione...