Ultimamente ho incasinato la Debian box e mi compare questo errore aprendo QGis...dopo funziona ma non disponibili i plugin
la soluzione e' settare in modo esplicito la PythoPathPYTHONPATH=/usr/lib/python3/dist-packages:$PYTHONPATH
qgis
Ultimamente ho incasinato la Debian box e mi compare questo errore aprendo QGis...dopo funziona ma non disponibili i plugin
la soluzione e' settare in modo esplicito la PythoPathPYTHONPATH=/usr/lib/python3/dist-packages:$PYTHONPATH
qgis
Niente da fare ...Enmap Toolbox plugin di QGis non funziona con Debian 13...ci ho provato in tutti i modi (il problema principale ad una libreria di Qt5) ed alla fine sono tornato a montare una macchina virtuale di Debian 12 che installa QGis 3.22 LTS
python3 -m venv virtualenv --system-site-packages
source virtualenv/bin/activate
pip install enpt_enmapboxapp
qgis
Attenzione: questo plugin non funziona su Debian 13 per delle dipendenze non risolte. Funziona in modo corretto su Debian 12 con QGis 3.22 LTS
Attenzione 2 : la funzione CCDC e' presente su Google Earth Engine solo sui profili a pagamento...per questo motivo ho usato la versione di QGis...Aggiornamento: a quanto sembra non e' necessario il profilo a pagamento ma che lo script sia collegato ad un progetto di Google Cloud ed autorizzato (un progetto autorizzato si riconosce dall'icona in alto a destra)
| Progetto autorizzato |
| Progetto non autorizzato |
Questo plugin usa l'algorimo Continous Change Detection che si basa su una funzione armonica per evidenziare brusche variazioni del parametro analizzato
Questo e' lo script per Google Earth Engine
// 1. DEFINIZIONE ROI
var areaOfInterest =
/* color: #d63000 */
/* displayProperties: [
{
"type": "rectangle"
}
] */
ee.Geometry.Polygon(
[[[10.896754172154326, 43.02122523564496],
[10.896754172154326, 43.002271538414895],
[10.935463812657256, 43.002271538414895],
[10.935463812657256, 43.02122523564496]]], null, false);
Map.centerObject(areaOfInterest, 15);
// 2. PREPARAZIONE DATI
var prepareData = function(image) {
var optical = image.multiply(0.0000275).add(-0.2);
var ndvi = optical.normalizedDifference(['SR_B4', 'SR_B3']).rename('NDVI');
return image.addBands(ndvi).select('NDVI');
};
var collection = ee.ImageCollection("LANDSAT/LT04/C02/T1_L2")
.merge(ee.ImageCollection("LANDSAT/LT05/C02/T1_L2"))
.merge(ee.ImageCollection("LANDSAT/LE07/C02/T1_L2"))
.filterBounds(areaOfInterest)
.map(prepareData)
.sort('system:time_start');
// 3. ESECUZIONE CCDC CON GESTIONE ERRORI
// Proviamo a chiamare l'algoritmo nativo in modo più "protetto"
var ccdc;
try {
ccdc = ee.Algorithms.TemporalSegmentation.ccdc({
collection: collection,
breakThreshold: 1.0,
minObservationsForSegment: 6
});
print('CCDC eseguito con successo:', ccdc);
} catch (e) {
print('Errore critico: Il tuo account non ha accesso a CCDC tramite API diretta.', e);
print('Soluzione: Assicurati che lo script sia collegato a un Cloud Project (in alto a destra).');
}
// 4. SE CCDC HA FUNZIONATO, VISUALIZZA
if (ccdc) {
var magnitude = ccdc.select('NDVI_magnitude').arrayGet([0]);
var tBreak = ccdc.select('tBreak').arrayGet([0]);
var magViz = {min: -0.5, max: 0.5, palette: ['#d73027', '#f4a582', '#f7f7f7', '#d9f0d3', '#1a9850']};
var dateViz = {min: 1984, max: 2024, palette: ['#0000ff', '#00ffff', '#ffff00', '#ff0000']};
Map.addLayer(magnitude.clip(areaOfInterest), magViz, 'Magnitudo Cambiamento');
Map.addLayer(tBreak.clip(areaOfInterest), dateViz, 'Anno del Cambiamento');
}
Ho trovato in rete un dataset di foto da drone con gia' classificate le fratture. Si tratta di dati con licenza permissiva
I dati derivano da questo articolo
@article{article,
author = {Ovaskainen, Nikolas and Nordbäck, Nicklas and Skyttä, Pietari and Engström, Jon},
year = {2022},
month = {01},
pages = {104528},
title = {A new subsampling methodology to optimize the characterization of two-dimensional bedrock fracture networks},
volume = {155},
journal = {Journal of Structural Geology},
doi = {10.1016/j.jsg.2022.104528}
}
e sono disponibili come ortofoto RGB da drone a questo link https://zenodo.org/records/4719627 (16 Gb) mentre le fratture sono tematizzate in un diversi file gpkg a questo link https://www.kaggle.com/datasets/nasurz/getaberget-fracture-trace-dataset/data (4Mb)
il problema e' che in questo formato le immagini non sono adatte al processamento per la rete neurale. L'idea e' quindi di dividere le ortofoto in tasselli da 15 metri e creare una immagine maschera con le sole fratturazioni. Tale compito e' stato eseguito con uno script Python in QGis
Nello script si devono impostare le coordinate geografiche della finestra ed il folder dove saranno salvate le varie tiles. In un primo passaggio si disattiva dal progetto QGis il tema lineare delle fratture per avere solo i tasselli delle ortofoto e dopo si disattiva il tematismo raster per creare le maschere
------------------------------------------------------------------------------------------
from qgis.core import (
QgsProject, QgsApplication, QgsLayout, QgsPrintLayout, QgsLayoutItemMap,
QgsUnitTypes, QgsLayoutSize, QgsLayoutPoint, QgsLayoutExporter, QgsRectangle
)
import os
# Path to your QGIS project
project_path = "C:\\Users\\l.innocenti\\Desktop\\geta.qgz"
# Output folder
output_dir = "C:\\Users\\l.innocenti\\Desktop\\geta5\\mask\\"
os.makedirs(output_dir, exist_ok=True)
# Load project
project = QgsProject.instance()
project.read(project_path)
from qgis.core import QgsRectangle
# Compute project extent from all layers
extent = None
for layer in project.mapLayers().values():
if not layer.isValid():
continue
layer_extent = layer.extent()
if extent is None:
extent = QgsRectangle(layer_extent)
else:
extent.combineExtentWith(layer_extent)
if extent is None:
raise ValueError("No valid layers found in the project.")
xmin, ymin = 108914, 6720011
xmax, ymax = 108969, 6720066
# Get the full extent in project CRS
#extent = project.boundingBox()
#xmin, ymin, xmax, ymax = extent.xMinimum(), extent.yMinimum(), extent.xMaximum(), extent.yMaximum()
# Tile size in meters
tile_size = 15
# Iterate over the grid
x = xmin
tile_id = 0
while x < xmax:
y = ymin
while y < ymax:
# Tile extent
tile_extent = QgsRectangle(x, y, x + tile_size, y + tile_size)
# Create a print layout
layout = QgsPrintLayout(project)
layout.initializeDefaults()
layout.setName(f"tile_{tile_id}")
pc = layout.pageCollection().pages()[0]
# Map item
map_item = QgsLayoutItemMap(layout)
map_item.setRect(20, 20, 200, 200)
map_item.setExtent(tile_extent)
map_item.setBackgroundColor(QColor(255, 255, 255, 0))
map_item.attemptResize(QgsLayoutSize(200, 200, QgsUnitTypes.LayoutMillimeters))
visible_layers = [lyr for lyr in iface.mapCanvas().layers()]
map_item.setLayers(visible_layers)
layout.addLayoutItem(map_item)
layout.addLayoutItem(map_item)
map_item.attemptMove(QgsLayoutPoint(0, 0, QgsUnitTypes.LayoutMillimeters))
# Export PNG
exporter = QgsLayoutExporter(layout)
out_path = os.path.join(output_dir, f"tile_{tile_id}.png")
exporter.exportToImage(out_path, QgsLayoutExporter.ImageExportSettings())
print(f"Saved {out_path}")
tile_id += 1
y += tile_size
x += tile_size
------------------------------------------------------------------------------------------
alla fine si hanno coppie di questo tipo (le immagini sono state rifilate con imagemagick per togliere lo spazio bianco inserito da QGis)
per "aggiustare" il background con colore nero e il target come grigio come 127
import cv2
import numpy as np
import sys
# --- Check for input filename ---
if len(sys.argv) < 2:
print("Usage: python script.py <image_filename>")
sys.exit(1)
filename = sys.argv[1]
# Read image
img = cv2.imread(filename)
if img is None:
raise FileNotFoundError(f"Cannot read file: {filename}")
# Define white color in BGR
white = np.array([255, 255, 255], dtype=np.uint8)
# Create mask for white pixels
mask_white = np.all(img == white, axis=-1)
# Create output image
output = np.full_like(img, (128, 128, 128)) # Set all to gray
output[mask_white] = (0, 0, 0) # Set white pixels to black
# Save with same filename (overwrite original)
cv2.imwrite(filename, output)
print(f"Image processed and saved: {filename}")
Per installare Enmap ToolBox su Debian Linux si devono aggiungere alcune dipendenze. Alcune sono presenti gia' in apt ma enpt_enmapboxapp deve essere scaricata con pip. A questo punto e' necessario creare un venv e si deve lanciare qgis dall'interno del venv
Per utilizzare Orfeo Toolbox direttamente dentro QGis si spacchetta lo zip di Orfeo Toolbox in una directory (con il nome senza caratteri speciali). Poi si seleziona strumenti di processing/Options /Programmi e si popolano i campi
Cartella OTB : C:/OTB-7.4.1-Win64/OTB-7.4.1-Win64
Cartella delle applicazioni OTB : C:/OTB-7.4.1-Win64/OTB-7.4.1-Win64/bin;C:/OTB-7.4.1-Win64/OTB-7.4.1-Win64/lib/otb/applications
Si caricano i raster delle bande 2,3,4 (BGR) e la banda 8 pancromatica
Si apre il menu Raster/Miscellanea/Crea Raster Virtuale selezionando come input le bande ottiche e spuntando il flag Place each input file in a separate band
A questo punto dal toolbox si seleziona pansharpening indicando come Dataset spettrale il raster virtuale creato in precedenza e come dataset pancromatico la banda 8
![]() |
| LE71920292001046EDC01 |
Ho provato a cimentarmi (anche se e' una gara terminata) con https://platform.ai4eo.eu/seeing-beyond-the-visible/data J. Nalepa, B. Le ...