Bibliografia
Biermann, L., Clewley, D., Martinez-Vicente, V. et al. Finding Plastic Patches in Coastal Waters using Optical Satellite Data. Sci Rep 10, 5364 (2020). https://doi.org/10.1038/s41598-020-62298-z
Moshtaghi, M., Knaeps, E., Sterckx, S. et al. Spectral reflectance of marine macroplastics in the VNIR and SWIR measured in a controlled environment. Sci Rep 11, 5436 (2021). https://doi.org/10.1038/s41598-021-84867-6
MARIDA: A benchmark for Marine Debris detection from Sentinel-2 remote sensing data Katerina Kikaki ,Ioannis Kakogeorgiou, Paraskevi Mikeli, Dionysios E. Raitsos, Konstantinos Karantzalos PLOS Published: January 7, 2022 https://doi.org/10.1371/journal.pone.0262247
Microplastiche in acqua
Alessio Monnanni, Valentina Rimondi, Guia Morelli, Alessia Nannoni, Alessandra Cincinelli, Tania Martellini, David Chelazzi, Marco Laurati, Laura Sforzi, Francesco Ciani, Pierfranco Lattanzi, Pilario Costagliola,
Microplastics and microfibers contamination in the Arno River (Central Italy): Impact from urban areas and contribution to the Mediterranean Sea,
Science of The Total Environment,
Volume 955,
2024,
177113,
ISSN 0048-9697,
https://doi.org/10.1016/j.scitotenv.2024.177113.
(https://www.sciencedirect.com/science/article/pii/S004896972407270X)
Microplastiche in sedimenti
Types, occurrence and distribution of microplastics in sediments from the northern Tyrrhenian Se Michele Mistri a, Marco Scoponi b, Tommaso Granata c, Letizia Moruzzi c, Francesca Massara d, Cristina Munari a https://doi.org/10.1016/j.marpolbul.2020.111016
Annotazione : le plastiche in acqua si presentano alterate per la permanenza nel liquido. Inoltre la firma spettrale e' profondamente influenzata dalla presenza anche di una pellicola d'acqua sulla plastica galleggiante . Per quanto riguarda la sezione SWIR dello spettro la presenza di sedimenti puo' disturbare la risposta degli indici spettrali di calcolo
-----------------------------------------------
Per Landsat 8 il metodo comune per determinare le plastiche e'determinato dall'indice
Plastic Index = Band 5 (NIR) / (Band 5 + Band 6 (SWIR1)).
var areaOfInterest =
/* color: #98ff00 */ /* shown: false */ ee.Geometry.MultiPolygon( [[[[9.950883097809994, 43.88872579729536], [9.934403605622494, 43.48554689334167], [10.292832560700619, 43.51443524985007], [10.269486613434994, 43.53634133439625], [10.263993449372494, 43.62985044452412], [10.259873576325619, 43.7311534518937], [10.253007121247494, 43.76289953785138], [10.182969279450619, 43.910495519373605]]], [[[9.911900455707178, 43.92257421254923], [9.872075016254053, 43.45486023186587], [10.347233707660303, 43.44688454959106], [10.314274723285303, 43.50169612390543], [10.299168522113428, 43.51862782505474], [10.268956119769678, 43.55048637670663], [10.277195865863428, 43.565414278891666], [10.288182193988428, 43.57735393781841], [10.281315738910303, 43.60918145612981], [10.268956119769678, 43.656891171520144], [10.273075992816553, 43.70158462959755], [10.266209537738428, 43.73334638914901], [10.262089664691553, 43.78492333929173], [10.238743717425928, 43.83843695830995], [10.212651188129053, 43.89289227846965]]]]);
// 2. Pre-processing Function for Landsat 8
var processL8 = function(image) {
var opticalBands = image.select('SR_B.*').multiply(0.0000275).add(-0.2);
// Plastic Index Formula: NIR / (NIR + SWIR1)
// Landsat 8: B5 is NIR, B6 is SWIR1
var plasticIndex = opticalBands.expression(
'NIR / (NIR + SWIR1)', {
'NIR': opticalBands.select('SR_B5'),
'SWIR1': opticalBands.select('SR_B6')
}).rename('PI');
return image.addBands(plasticIndex).select('PI');
};
// 3. Load 2025 Median Plastic Index
var pi2025 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
.filterBounds(areaOfInterest)
.filterDate('2025-01-01', '2025-12-31')
.map(processL8)
.median()
.clip(areaOfInterest);
// 4. Visualization Parameters
// Plastic usually results in higher values in this index (closer to 0.4 - 0.6)
var piViz = {
min: 0,
max: 0.6,
palette: ['#0000FF', '#00FFFF', '#FFFF00', '#FF0000'] // Blue to Red
};
// 5. Display the Map
Map.addLayer(pi2025, piViz, 'Plastic Index Median 2025');
// --- 6. ADDING THE LEGEND ---
var legend = ui.Panel({
style: {
position: 'bottom-left',
padding: '8px 15px'
}
});
var legendTitle = ui.Label({
value: 'Plastic Index (2025)',
style: {fontWeight: 'bold', fontSize: '16px', margin: '0 0 4px 0', padding: '0'}
});
legend.add(legendTitle);
var makeRow = function(color, name) {
var colorBox = ui.Label({
style: {
backgroundColor: color,
padding: '8px',
margin: '0 0 4px 0'
}
});
var description = ui.Label({
value: name,
style: {margin: '0 0 4px 6px'}
});
return ui.Panel({
widgets: [colorBox, description],
layout: ui.Panel.Layout.Flow('horizontal')
});
};
// Labels adjusted for Plastic Index typical ranges
var names = ['Water/Low', 'Low Probability', 'Medium Probability', 'High Probability (Potential Plastic)'];
var colors = ['#0000FF', '#00FFFF', '#FFFF00', '#FF0000'];
for (var i = 0; i < 4; i++) {
legend.add(makeRow(colors[i], names[i]));
}
Map.add(legend);
// 7. Export the result
Export.image.toDrive({
image: pi2025,
description: 'Plastic_Index_2025',
folder: 'EarthEngine_Exports',
fileNamePrefix: 'PI_2025_Site',
region: areaOfInterest,
scale: 30,
crs: 'EPSG:4326',
fileFormat: 'GeoTIFF',
formatOptions: {
cloudOptimized: true
}
});
Il problema e' che la risposta delle plastiche e' simile a quella della vegetazione (delle alghe nello specifico) per quanto riguardo l'infrarosso vicino
Per cercare di discriminare si possono incrociare NDVI e PI
/**
* Landsat 8 Plastic vs. Algae Discrimination Script
* 2025 Median Composite
*/
var areaOfInterest =
/* color: #98ff00 */ /* shown: false */ ee.Geometry.MultiPolygon( [[[[9.950883097809994, 43.88872579729536], [9.934403605622494, 43.48554689334167], [10.292832560700619, 43.51443524985007], [10.269486613434994, 43.53634133439625], [10.263993449372494, 43.62985044452412], [10.259873576325619, 43.7311534518937], [10.253007121247494, 43.76289953785138], [10.182969279450619, 43.910495519373605]]], [[[9.911900455707178, 43.92257421254923], [9.872075016254053, 43.45486023186587], [10.347233707660303, 43.44688454959106], [10.314274723285303, 43.50169612390543], [10.299168522113428, 43.51862782505474], [10.268956119769678, 43.55048637670663], [10.277195865863428, 43.565414278891666], [10.288182193988428, 43.57735393781841], [10.281315738910303, 43.60918145612981], [10.268956119769678, 43.656891171520144], [10.273075992816553, 43.70158462959755], [10.266209537738428, 43.73334638914901], [10.262089664691553, 43.78492333929173], [10.238743717425928, 43.83843695830995], [10.212651188129053, 43.89289227846965]]]]);
// 2. Cloud and Water Masking
var maskCloudsAndLand = function(image) {
var qa = image.select('QA_PIXEL');
// Cloud/Cirrus Mask
var cloudMask = qa.bitwiseAnd(1 << 1).eq(0)
.and(qa.bitwiseAnd(1 << 2).eq(0))
.and(qa.bitwiseAnd(1 << 3).eq(0))
.and(qa.bitwiseAnd(1 << 4).eq(0));
// Optional: Simple Water Mask (using QA bits)
// This helps focus only on marine/river surfaces
var waterMask = qa.bitwiseAnd(1 << 7).neq(0);
return image.updateMask(cloudMask).updateMask(waterMask);
};
// 3. Discrimination Processing Function
var processDiscrimination = function(image) {
// Scaling factors for Landsat 8 C2 L2
var optical = image.select('SR_B.*').multiply(0.0000275).add(-0.2);
// A. NDVI: Highlights Chlorophyll (Algae/Vegetation)
var ndvi = optical.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI');
// B. Plastic Index (PI): Highlights high-reflectance floating solids
var pi = optical.expression('B5 / (B5 + B6)', {
'B5': optical.select('SR_B5'), // NIR
'B6': optical.select('SR_B6') // SWIR1
}).rename('PI');
// C. Discrimination Logic
// Plastic: Moderate/High PI AND relatively low NDVI (compared to algae)
// Algae: Very High NDVI AND lower PI (due to SWIR absorption by water content)
var plasticMask = pi.gt(0.4).and(ndvi.lt(0.2)).rename('Plastic_Likely');
var algaeMask = ndvi.gt(0.3).and(pi.lt(0.4)).rename('Algae_Likely');
return image.addBands([ndvi, pi, plasticMask, algaeMask]);
};
// 4. Load Collection and Create Median
var collection = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
.filterBounds(areaOfInterest)
.filterDate('2025-01-01', '2025-12-31')
.map(maskCloudsAndLand)
.map(processDiscrimination);
var finalMedian = collection.median().clip(areaOfInterest);
// 5. Visualization
Map.centerObject(areaOfInterest, 12);
// Natural Color for context
Map.addLayer(finalMedian, {bands:['SR_B4','SR_B3','SR_B2'], min:0, max:0.3}, 'Natural Color RGB');
// Algae Layer (Green)
Map.addLayer(finalMedian.select('Algae_Likely').selfMask(), {palette: ['#00FF00']}, 'Detected Algae');
// Plastic Layer (Red)
Map.addLayer(finalMedian.select('Plastic_Likely').selfMask(), {palette: ['#FF0000']}, 'Detected Plastic');
// 6. Legend for UI
var legend = ui.Panel({style: {position: 'bottom-right', padding: '8px 15px'}});
legend.add(ui.Label({value: 'Classification', style: {fontWeight: 'bold'}}));
var addLegendRow = function(color, text) {
var row = ui.Panel({layout: ui.Panel.Layout.Flow('horizontal')});
row.add(ui.Label({style: {backgroundColor: color, padding: '8px', margin: '0 0 4px 0'}}));
row.add(ui.Label({value: text, style: {margin: '0 0 4px 6px'}}));
legend.add(row);
};
addLegendRow('#00FF00', 'Organic / Algae (High NDVI)');
addLegendRow('#FF0000', 'Plastic / Debris (High PI, Low NDVI)');
Map.add(legend);
// 7. Export
Export.image.toDrive({
image: finalMedian.select(['Plastic_Likely', 'Algae_Likely']),
description: 'Plastic_vs_Algae_2025',
folder: 'EarthEngine_Exports',
region: areaOfInterest,
scale: 30
});
Tutto molto lineare ed anche ragionevole che alla foce di un fiume come l'Arno vi sia un accumulo di microplastiche in mare. Ma se si legge l'articolo Monnanni et alii 2024 e' stimata una quantita' di fibre di 7.6 t/y con 56,011 ± 16,411 particelle per litro rappresentate principalmente da dimensioni 60 μm
Considerando che studi su Sentinel 2 hanno posto il limite di detection della plastica del 25% di superficie del pixel e considerando che un pixel e' 1000 metri quadri (10x10 m) per una superficie di plastica di almeno 25 mq. Limite simile (30 mq su pixel di 30x30 m) viene indicato per Landsat 8. Non e' pensabile che di rilevare da satellite rilevare le concentrazioni indicate nell'articoli di Monnanni
Volendo passare all'iperspettrale si vede una prima differenza (si precisa che il dato Enmap e'stato corretto con l'algoritmo di water correction..questo vuol dire che il dato scaricato da EOWeb risulta mascherato sulla terraferma) Nel dato multispettrale di Sentinel 2 la riflettanza e' bassa ma apprezzabile nel dato iperspettrale si registra praticamente solo rumore
![]() |
| Sentinel 2 |
![]() |
| Enmap (correzione water) |
Questo comportamento e' dato dall'algoritmo MIP Modular Inversion Program di Enmap che di fatto forza a zero i valori di riflettanza sopra i 900 nm. Per avere un comportamento simile a Sentinel si deve quindi processare l'immagine Enmap su EOWeb con l'algoritmo di rimozione atmosferica terrestre (dove viene usato SICOR) anche se si sta lavorando in mare
Usando la correzione atmosferica per Land si ha come risulta uno spettro di questo tipo per punti in acqua
i punti a riflettanza 6.5 sono chiaramente errori e devono essere scartati. Modificando la scala verticale del graficosi osserva che l'algoritmo Land di Enmap non taglia le lunghezze d'onda SWIR come l'algoritmo Water (anche se ovviamente avendo riflettanze cosi' basse il rumore strumentale e' molto significativo
Per replicare quanto fatto (unica immagine disponibili foce del Serchio) gli indici spettrali in multispettrale con i dati iperspettrali si usa l'approccio di derivata prima
Red Edge Slope (Algae): (B_705nm - B_680nm) / 25
Hydrocarbon Slope (Plastic): (B_1720nm - B_1730nm) / 15
In Enmap con Band Math diventano
Algae = (Band054-Band050)/30 (706-679 nm)
Hydro = (Band160-Band162)/21 (1717-1738 nm)
![]() |
| RGB |
![]() |
| Hydro |
![]() |
| Algae |
con la regola si evidenziano i potenziali punti di presenza di plastica
if (Plastic_Derivative > 0.005 && Algae_Derivative < 0.002) then 1 else 0



















