In tanti anni ho visto qualche kernel panic, ma in questo formato non mi era mai successo
la cosa curiosa che al riavvio successivo nessun problema
In tanti anni ho visto qualche kernel panic, ma in questo formato non mi era mai successo
Per processare le immagini Emit ed ottenere il prodotto L2B e' stato utilizzato il software di spectral unmixing SpectralUnmixing.jl
Il software usa il linguaggio Julia che si installa tramite
curl -fsSL https://install.julialang.org | shDopo si clona il repository
git clone https://github.com/emit-sds/SpectralUnmixing.jl
julia
si preme il tasto parentesi quadrata chiusa il prompt si modifica da julia in pkg
addSpectralUnmixing
si esce con CTRL+C
using SpectralUnmixingsi esce con CTRL+D
Nella cartella data sono presenti dati di test per il software
nel file csv ci sono le firme spettrali degli endmeber (nome classe e riflettanza), ed una immagine in formato Envi
Per lanciare l'unmixing si usa
cd data
julia --project=/home/luca/SpectralUnmixing.jl /home/luca/.julia/bin/unmix.jl emit20250324t221005_jpl_unmix_ex basic_endmember_library.csv Class output_test --mode sma-best --n_mc 30
n_mc indica il numero di boostraping con il metodo Montecarlo
gli endmember sono Soil, PV (vegetazione fotosintetica),NPV (vegetazione non fotosintetica)
Questo l'output
┌ Info: Unmixing was processed on: HW27747
└ @ Main /home/luca/.julia/bin/unmix.jl:177
┌ Info: Reflectance file processed: emit20250324t221005_jpl_unmix_ex
└ @ Main /home/luca/.julia/bin/unmix.jl:178
┌ Info: Arguments: Dict{String, Any}("optimizer" => "bvls", "write_complete_fractions" => true, "mode" => "sma-best", "reflectance_uncertainty_file" => "", "combination_type" => "class-even", "log_file" => nothing, "normalization" => "none", "spectral_starting_column" => 2, "endmember_file" => "basic_endmember_library.csv", "truncate_end_columns" => 0, "refl_scale" => 1.0, "reflectance_file" => "emit20250324t221005_jpl_unmix_ex", "endmember_class_header" => "Class", "n_mc" => 30, "endmember_classes" => [""], "refl_nodata" => -9999.0, "output_file_base" => "output_test", "num_endmembers" => [3], "start_line" => 1, "end_line" => -1, "wavelength_ignore_regions" => [0.0, 440.0, 1310.0, 1490.0, 1770.0, 2050.0, 2440.0, 2880.0], "max_combinations" => -1)
└ @ Main /home/luca/.julia/bin/unmix.jl:179
┌ Info: Ignoring wavelength regions: Any[[0.0, 440.0], [1310.0, 1490.0], [1770.0, 2050.0], [2440.0, 2880.0]]
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/EndmemberLibrary.jl:191
┌ Info: Running from lines: 1 - 10
└ @ Main /home/luca/.julia/bin/unmix.jl:211
AbstractString[InlineStrings.String7("SOIL"), InlineStrings.String7("PV"), InlineStrings.String7("NPV")]
AbstractString[InlineStrings.String7("SOIL"), InlineStrings.String7("PV"), InlineStrings.String7("NPV"), "Brightness"]
┌ Info: Output Image Size (x,y,b): 10, 10, [4, 4, 6].
│ Creating output fractional cover dataset.
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/Datasets.jl:77
┌ Info: Output Image Size (x,y,b): 10, 10, [4, 4, 6].
│ Creating output fractional cover dataset.
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/Datasets.jl:77
┌ Info: Output Image Size (x,y,b): 10, 10, [4, 4, 6].
│ Creating output fractional cover dataset.
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/Datasets.jl:77
┌ Info: Unmix output files: ["output_test_fractional_cover", "output_test_fractional_cover_uncertainty", "output_test_complete_fractions"]
└ @ Main /home/luca/.julia/bin/unmix.jl:267
┌ Info: total number of workers available: 1
└ @ Main /home/luca/.julia/bin/unmix.jl:268
┌ Info: Line 2 run in 0.0142 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
┌ Info: Line 3 run in 0.0138 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
┌ Info: Line 4 run in 0.0138 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
┌ Info: Line 5 run in 0.0138 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
┌ Info: Line 6 run in 0.0155 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
┌ Info: Line 7 run in 0.0144 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
┌ Info: Line 8 run in 0.0207 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
┌ Info: Line 9 run in 0.0181 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
┌ Info: Line 10 run in 0.0137 seconds
└ @ SpectralUnmixing /home/luca/SpectralUnmixing.jl/src/SpectralUnmixing.jl:542
17.617387 seconds (18.76 M allocations: 1.104 GiB, 32.59% gc time, 66.76% compilation time)
i file di output saranno file hdr (complete_fractions, fractional_cover, fractional_cover_uncertainty)
complete_fractions: indica la percentuale della classe contenuta nel pixel
fractional_cover : se complete_fraction indica tipo il 60%, fractional_cover indica la divisione percentuale delle frazioni mineralogiche (Ematite, Goethite....). Se la complete_fractions della categoria Soil e' inferiore al 20% e' inutile questo successivo raffinamento
fractional_cover_uncertainty: indica la qualita' del dato...valori bassi unmixing migliore
Il prodotto Emit L3 ASA (scaricabile da qui) corrisponde all'unmixing mineralogico dei dati ipespettrali di Emit. La copertura e' a livello mondiale tra le latitudini 55N/-54.5S ed una risoluzione spaziale di mezzo grado decimale (circa 55 km) con specializzazione su suoli aridi (i dati sono mascherati per la vegetazione)
Vengono calcolate 10 categorie mineralogiche
Il prodotto e' nato per polveri e non per suoli. Per indagini mineralogiche di suoli e' piu' affidale il prodotto L2B a cui pero' si deve effettuare in proprio l'unmixing spettrale
Attenzione : la struttura dei file netcdf ha subito una variazione intorno al 2025
Da EarthData si possono scaricare i dati
https://search.earthdata.nasa.gov/search/granules?p=C2408750690-LPCLOUD
https://earth.jpl.nasa.gov/emit/data/data-portal/coverage-and-forecasts/
Piccola nota: bande Emit per true color
Red: ~650 nm → Band 29
i dati sono in formato netcfd ma non risulta georiferito , si apre tranquillamente in Esa Snap ma la cosa migliore e' trasformarlo in formato Envi per avere tutte le informazioni spettrali
In fondo alla pagina lo script per effettuare l'operazione..attenzione che a seconda che l'orbita sia discendente od ascendente si deve ruotare la matrice di 90 grafi
Il file viene georiferito nel senso che ogni pixel ha le sue coordinate ma l'immagine non e' ruotata come dovrebbe essere
https://github.com/nasa/EMIT-Data-Resources
Leggendo la documentazione delle libreria HyperCoast ho trovato riferimento a Moe Vae. Si tratta di una rete neurale complessa basato su
Mixture-of-Experts Variational Autoencoder for Clustering and Generating from Similarity-Based Representations on Single Cell Data
Andreas Kopf, Vincent Fortuin, Vignesh Ram Somnath, Manfred Claassen
https://arxiv.org/abs/1910.07763
che ha il vantaggio di lavorare su una moltitudine di dati come quelli iperspettrali
Ho provato tramite AI, con i dati di Indian Pines
![]() |
| A sinistra verita'a terra A destra risultato del modello |
Un confronto tra spettri di punti del volo Aviris-NG zona Grosseto e Enamp
Per rendere il confronto minimamente rappresentativo e' stato preso un bersaglio antropico che non e' modificato nel tempo ed un campo sempre allo stato suolo nudo
![]() |
| Bersaglio naturale (suolo nudo) |
![]() |
| Bersaglio Antropico |
![]() |
| Bersaglio antropico |
Hypercoast e' una libreria Python per leggere dati da formati iperspettrali e visualizzare spettri
L'uso migliore e' quello all'interno di Jupyter Lab
![]() |
| Aviris-NG Grosseto |
In tanti anni ho visto qualche kernel panic, ma in questo formato non mi era mai successo la cosa curiosa che al riavvio successivo ness...