Clipping

Il servizio di Clipping dà la possibilità di creare sotto scene delle immagini contenute nell'archivio di input specificando le coordinate geografiche degli angoli in basso a sinistra (LL) ed in alto a destra (UR) del box della sotto scena. Il servizio di Clipping accetta in input dati CEOS e GeoTIFF e produce in output dati in formato GeoTIFF. Le coordinate passate come input allo script devono descrivere un box di taglio rettangolare in coordinate geografiche espresse in latitudine e longitudine dei due punti.

Le immagini contenute all'interno di un archivio possono essere ruotate rispetto al sistema di coordinate geografiche N-S/E-W: dovendo eseguire un taglio rettangolare dell'immagine occorre pertanto determinare il più piccolo sovra-box nel sistema N-S/E-W che contenga il box di taglio in modo da avere comunque la zona selezionata all'interno della sotto-scena. In figura 3.3 si può vedere un esempio di taglio di una sotto-scena nel caso di immagine ruotata.

Figure 3.3: Esempio di taglio di un`immagine ruotata.
\includegraphics[width=8cm]{images/clipping-1.eps}

L`area in giallo rappresenta la sotto-scena selezionata nel sistema di riferimento dell'immagine che risulta ruotato rispetto al nord geografico; prima di procedere al taglio viene pertanto creato il sovra-box (bordo rosso in figura 3.3) allineato al nord geografico e contenente la sotto-scena.

Un esempio pratico del servizio di Clipping è mostrato nelle figure 3.4 - 3.5: la prima immagine (ottenuta come combinazione RGB delle bande 3,2,1) rappresenta la zona attorno al lago di Salton Sea nel deserto del Colorado (California-USA). Nella medesima figura è evidenziato con un rettangolo verde il box di taglio dell'immagine di coordinate $ LLlat=32.7360,LLlon=-116.4184$ e $ URlat=33.7465,URlon=-115.0828$ . La seconda figura 3.5 mostra invece la combinazione RGB del risultato del servizio di Clipping.

Figure 3.4: Archivio Landsat Level 1G (L71039037_03720030325.zip): combinazione RGB delle bande 3,2,1. Immagine acquisita dal sensore ETM+ il 25 Marzo 2003.
\includegraphics[width=12cm]{images/lago.eps}

Figure 3.5: Archivio Landsat Level 1G (L71039037_03720030325-ss.zip): combinazione RGB delle bande 3,2,1. Immagine processata dal servizio di Clipping.
\includegraphics[width=12cm]{images/lago-ss.eps}

Per la realizzazione di questo servizio sono stati creati sotto programmi che svolgono operazioni specifiche durante l'esecuzione del taglio della sotto scena. Alcuni componenti sono comuni al servizio di Format Conversion per poter convertire il formato dell'archivio di input nel formato compatibile al programma che realizza effettivamente il taglio. I programmi che compongono il servizio sono di seguito elencati:

Il programma che realizza il taglio vero e proprio della sotto-scena è clipgtiff. Questo programma accetta in ingresso le coordinate espresse in latitudine e longitudine dell'angolo in basso a sinistra e in alto a destra del box di taglio dell'immagine. Partendo dalle coordinate locali si ricavano le coordinate espresse in pixel corrispondenti nell'immagine utilizzando l'inversa della matrice di conversione $ C$ . La matrice di conversione $ C$ consente di eseguire la trasformazione:


$\displaystyle \begin{bmatrix}x'  y' \end{bmatrix}$ $\displaystyle =$ $\displaystyle C \begin{bmatrix}n_x  n_y \end{bmatrix}$  
  $\displaystyle =$ $\displaystyle pxSize \begin{bmatrix}\cos \theta & -\sin \theta  \sin \theta & \cos \theta \end{bmatrix} \begin{bmatrix}n_x  n_y \end{bmatrix}$  

dove $ x'$ e $ y'$ sono le coordinate locali in UTM, $ n_x$ e $ n_y$ sono le coordinate di partenza espresse in numero di pixel, $ pxSize$ è la risoluzione geometrica del pixel e $ \theta$ è l'angolo di rotazione dell'immagine.

A partire dalla matrice di conversione $ C$ il calcolo dell'inversa viene effettuato utilizzando il metodo standard per matrici $ 2x2$ :

$\displaystyle \begin{pmatrix}{{C_{11}}} & {{C_{12}}} {{C_{21}}} & {{C_{22}}} ...
...C_{21}}} & \frac{{C_{11}}}
{{C_{11}}{C_{22}} - {C_{12}}{C_{21}}} \end{pmatrix}$

Di seguito รจ riportato un estratto di codice del programma clipgtiff riportato in appendice A.1.1 dove viene calcolata la matrice inversa:
language=c
\begin{lstlisting}[frame=tb]{somecode}
matrix_inv[0] = adfGeoTransform[5]/( adfG...
...* adfGeoTransform[5] - adfGeoTransform[2]* adfGeoTransform[4]);
\end{lstlisting}
L`array di float matrix_inv contiene i quattro valori della matrice inversa, mentre l'array adfGeoTransform contiene sei valori float che corrispondo ai seguenti parametri:

Il calcolo per ricavare le coordinate espresse in pixel è riportato nelle seguenti linee di codice:
language=c
\begin{lstlisting}[frame=tb]{somecode}
pxLR[0] = (int)(( matrix_inv[2] * (LL[2]-...
...rm[3]) ) + ( matrix_inv[1] * (LL[3]-adfGeoTransform[0]))) * -1;
\end{lstlisting}
Le coordinate in pixel vengono memorizzate in array di due elementi dove il primo elemento è la coordinata X e il secondo elemento è la coordinata Y, mentre gli array LL e UR contengono le coordinate espresse in UTM degli angoli, rispettivamente, in basso a sinistra ed in alto a destra del box di taglio.

Nell'implementazione del programma clipgtiff si è dovuto risolvere il problema in cui l'area di taglio selezionata dall'utente non rientra completamente all'interno dell'immagine. Per far questo si sono dovuti implementare una serie di controlli sulle coordinate di taglio. Nel caso gli angoli del box di taglio siano esterni all'immagine vengono riportati sui bordi dell'immagine, proiettando la coordinate sui vari lati della scena. In pratica si individua la zona di taglio come il risultato dell'intersezione del piano che contiene l'immagine e il piano che contiene l'area selezionata dall'utente.

Nel caso in cui la scena di taglio sia completamente esterna all'immagine viene comunicato un messaggio di errore. Se il box di taglio comprende tutta l'immagine viene restituita l'immagine stessa. I controlli applicati sono riportati nelle seguenti linee di codice:
language=c
\begin{lstlisting}[frame=tb]{somecode}
if( ( BoxLL[0] > pxSizeX ) \vert\vert ( B...
...SizeX - 1;
if( BoxUR[1] > (pxSizeY-1) ) BoxUR[1] = pxSizeY - 1;
\end{lstlisting}
Le variabili pxSizeX e pxSizeY contengono i valori delle dimensioni dell'immagine in pixel, mentre le variabili BoxLL e BoxUR contengono le coordinate del box di taglio.

Le informazioni in input al servizio devono essere il formato (inputFormat), la piattaforma (platform), le coordinate espresse in latitudine e longitudine dell'angolo in basso a sinistra e dell'angolo in alto a destra della sotto-scena selezionata. In figura 3.6 è rappresentato il diagramma di funzionamento di questo servizio in cui a seconda degli input forniti vengono seguiti cammini differenti per il processamento dell'archivio.

Figure 3.6: Diagramma del servizio di Clipping.
\includegraphics[width=12cm]{images/clipping.eps}
Dal diagramma si vede come il percorso di processamento dell'immagine da tagliare converga al formato di immagine GeoTIFF, ovvero l'unico formato accettato dall'eseguibile clipgtiff. Infatti nel caso il formato di input sia GeoTIFF il digramma porta direttamente al clipgtiff, mentre se il formato di input è CEOS, vi è una prima differenziazione della piattaforma Landsat-5 o Landsat-7 per la conversione dell'archivio e poi viene eseguito il programma per il taglio clipgtiff.

Una prima versione del servizio di Clipping è stata realizzata il linguaggio IDL. Questa prima soluzione è stata però abbandonata perché non coerente con la linea di sviluppo del software per i servizi. Infatti usando IDL ci si doveva appoggiare per l'esecuzione del servizio sul motore interno di questo software e questo limitava le performance e la flessibilità. In oltre per lo sviluppo dei servizi non si voleva essere legati a software proprietari e quindi si è deciso di sviluppare il Clipping usando il linguaggio di programmazione C.

Mario Cavicchi 2007-07-25