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