Open lorenzoinnocenti opened 11 months ago
Sono abbastanza sicuro che non riutilizzi mai i dati, ci avevamo pensato attentamente, la funzione ha un verbose che si può utilizzare per controllare i blocchi che genera durante la procedura di resize. I valori nan sono quelli della maschera per definizione della mask da quello che abbiamo capito, di conseguenza abbiamo scelto di essere conservativi propagando i valori nan piuttosto che fare la average degli altri (topic se ricordo bene concordato con voi nelle primissime settimane di lavoro). Tuttavia un'implementazione in cui facciamo la media di tutti i pixel non nan è possibile ma bisogna stabilire una threshold di numero di nan accettabile per resized pixel.
Capisco, sono scelte implementative, il problema principale è comunque il comportamento strano per valori bassi di sub_height e sub_width, e le performance migliori di resize usando cv2. Comunque, se a voi non risulta questo comportamento perché nel vostro caso la risoluzione di output viene divisa più equamente in blocchi, continuate pure così.
Non siamo sicuri che i valori nan nei dati siano tutti e soli i valori segnati come non validi nella mask, vi direi di considerare più quest'ultima.
Oltre a questo, su sentinel 5 ci sono dei valori che nella mask risultano validi mentre invece contengono valori che non hanno senso. In questo caso, i controlli da fare sono:
SO2 < 0 HCHO < 0 AER_AI_340_380 < -1 AER_AI_354_388 < -1
SO2 e HCHO sono concentrazioni per cui se sono negative è errato, mentre per gli indici di AEROSOL la documentazione stessa dice che il minimo è -1.
applicheremo i controlli applicando la hard mask anche a quei valori, essendo un controllo così specifico direi che lo controlleremo durante la creazione dei dataset dei singoli satelliti
Nella resize dividete l'array di input in blocchi e fate la media, questo dà problemi se la risoluzione di input e quella di output non sono molto diverse.
Esempio: Usando current_shape = (571, 632) e new_shape = (296, 312) Versione "original", sub_height = 1 e sub_width = 1, quindi viene creato un pixel out ogni pixel in fino a 296, poi l'ultimo è la media degli ultimi 275. Versione "hybrid", sub_height = 2 e sub_width = 2, quindi viene creato un pixel in out ogni quattro input fino a 296*2, poi l'ultimo è la media degli ultimi 275, riutilizzando questi ultimi due volte nel calcolo dell'output.
Il problema non si presenta se current_shape è un multiplo, o quasi, di new_shape, usando "original", mentre con "hybrid" non si ha la certezza che l'output sia corretto. Secondo me sarebbe meglio utilizzare qualche forma di interpolazione, come cv2.resize, che è anche molto più veloce.
Se comunque volete usare la media vi consiglio di escludere dal calcolo i valori nan e quelli che nella maschera sono segnati come non validi.