5.2. Coordinate e regioni

L’elaborazione delle immagini agisce sui pixel e, per agire su un pixel, un algoritmo deve indirizzarlo tramite le sue coordinate. Per agire su un rettangolo di pixel vale lo stesso principio: il rettangolo deve essere descritto in un modo su cui l’algoritmo e il codice dell’applicazione siano concordi. La convenzione che il modulo image usa per le coordinate e i rettangoli e semplice, con un dettaglio che spiazza i lettori abituati alla convenzione matematica piuttosto che a quella della computer-grafica, e che vale la pena chiarire fin dall’inizio.

5.2.1. La griglia di pixel

Il pixel (0, 0) e l’angolo in alto a sinistra di un’immagine. L’asse x si estende verso destra, quindi una x maggiore significa piu a destra. L’asse y si estende verso il basso, quindi una y maggiore significa piu in basso nell’immagine. Un’immagine di dimensioni larghezza-per-altezza contiene pixel a coordinate intere da (0, 0) fino a (width - 1, height - 1); non esiste alcun pixel in (width, 0) o (0, height) – quelle posizioni sono i bordi destro e inferiore, un passo oltre l’ultimo pixel effettivo in ciascuna direzione.

L’asse y rivolto verso il basso e il dettaglio menzionato sopra. Un lettore abituato alla geometria della carta millimetrata si aspetta che una y maggiore significhi piu in alto; qui questa intuizione e esattamente invertita. La ragione dell’inversione e che i sensori digitali e i display digitali lavorano entrambi a partire dall’angolo in alto a sinistra e procedono verso destra lungo ciascuna riga, dall’alto verso il basso, e disporre i pixel in memoria nello stesso ordine rende la relazione tra «posizione i nel buffer» e «riga r, colonna c dell’immagine» il calcolo aritmetico piu semplice possibile – la posizione i del pixel (x, y) e semplicemente y * width + x. Ogni libreria di imaging ha concordato questa disposizione decenni fa per lo stesso motivo, e il costo e un piccolo aggiustamento mentale quando si lavora con le immagini per la prima volta.

Un rettangolo che rappresenta un'immagine. Un marcatore nel suo angolo in alto a sinistra e etichettato (0, 0). Una freccia lungo il bordo superiore punta verso destra etichettata x; una freccia lungo il bordo sinistro punta verso il basso etichettata y. Un rettangolo piu piccolo disegnato all'interno e etichettato ROI, con il suo angolo in alto a sinistra in (x, y) e le sue dimensioni w e h indicate lungo i bordi.

Il sistema di coordinate dell’immagine: origine in alto a sinistra, x verso destra, y verso il basso. Una regione rettangolare all’interno dell’immagine e individuata dal suo angolo in alto a sinistra (x, y) e dalle sue dimensioni (w, h).

5.2.2. Rettangoli

La maggior parte delle operazioni su un’immagine si occupa meno di un singolo pixel e piu di un rettangolo di pixel – un’area in cui cercare, una regione da copiare, un riquadro all’interno di un riquadro su cui calcolare statistiche. Il modo per individuare un rettangolo adotta la piu semplice estensione possibile della convenzione del singolo pixel: si indica la coordinata dell’angolo in alto a sinistra, seguita dalle dimensioni del rettangolo, raccolte in una quadrupla (x, y, w, h). I pixel all’interno del rettangolo si trovano nelle colonne da x a x + w - 1 e nelle righe da y a y + h - 1.

Il dettaglio che vale la pena chiarire qui e che w e h sono dimensioni, non coordinate dell’angolo in basso a destra. Il rettangolo (10, 20, 4, 3) copre le colonne 10, 11, 12, 13 e le righe 20, 21, 22 – dodici pixel in totale – non una regione che va da (10, 20) a (4, 3). La convenzione e uniforme in tutto il modulo, quindi una volta interiorizzata gli errori cessano, ma la prima volta coglie le persone in fallo.

La forma (x, y, w, h) compare in tre punti che sembrano distinti ma condividono la stessa convenzione. Il primo e quando un’immagine descrive la propria estensione: il rettangolo che copre l’intera immagine e (0, 0, width, height). Il secondo e quando un metodo di rilevamento restituisce un risultato con un bounding box – un blob, un rect, un apriltag – e il riquadro viene riportato come (x, y, w, h). Il terzo e quando a un metodo deve essere indicato di lavorare su una sotto-regione dell’immagine anziche sull’intero frame; l’argomento keyword roi che delimita l’operazione accetta la stessa quadrupla.

Prendere un bounding box da un metodo e passarlo al roi del metodo successivo e uno dei pattern piu comuni nell’elaborazione delle immagini. Il bounding box di un primo rilevamento grossolano restringe l’area di ricerca per un secondo rilevamento piu fine, e il vocabolario uniforme tra i risultati di rilevamento e gli argomenti dei metodi e cio che rende quel pattern cosi immediato – un’unica forma di tupla, usata allo stesso modo su entrambi i lati del passaggio.

5.2.3. Indirizzi interi, centroidi frazionari

Gli indirizzi dei pixel sono di per se numeri interi. Un pixel o e o non e in una data colonna e riga intera, e chiedere cosa si trova alla coordinata (40.5, 30.7) non e una domanda ben formulata – non esiste alcun pixel posizionato esattamente in quel punto. Alcune grandezze che il modulo image deriva dalle posizioni dei pixel sono pero frazionarie, e vale la pena capire perche, in modo che la distinzione non colga di sorpresa l’applicazione in seguito.

Il caso piu comune e il centroide – il centro di massa di una regione. Per una regione connessa di pixel, il centroide in forma a virgola mobile e la media delle posizioni dei pixel che la compongono, pesata per la loro densita. Una regione i cui pixel sono a cavallo di due colonne avra un centroide x pari, ad esempio, a 41,6 – una posizione reale che l’occhio descriverebbe come «il centro di quella regione» anche se nessun pixel effettivo si trova esattamente a quella x. Gli oggetti dei risultati di rilevamento contengono entrambe le forme come proprieta di sola lettura: una coppia di interi (cx / cy, utile quando si reimmette la posizione in qualcosa che vuole coordinate di pixel intere) e una coppia a virgola mobile (cxf / cyf, utile quando la posizione viene immessa in un anello di controllo che beneficia di una risoluzione sub-pixel).

L’altro caso e lo spostamento tra due frame misurato nel dominio della frequenza. Le tecniche che analizzano il contenuto spettrale di un’immagine anziche i suoi pixel direttamente possono risolvere spostamenti piu fini di un pixel, e riportano tali spostamenti come valori (dx, dy) a virgola mobile.

La regola pratica: gli indirizzi dei pixel sono interi; le posizioni e gli spostamenti che escono da un algoritmo possono essere a virgola mobile. I metodi di disegno accettano entrambe le forme e arrotondano per difetto i valori a virgola mobile al pixel intero piu vicino quando il risultato deve cadere sulla griglia.

5.2.4. Cartesiane e polari

Il sistema descritto finora e cartesiano: ogni pixel e individuato dal suo offset orizzontale e verticale rispetto all’origine. E il sistema in cui i byte sono memorizzati – il pixel i nel buffer corrisponde al pixel nella colonna i % width e nella riga i // width, percorrendo le righe a partire dall’alto – ed e il sistema in cui ogni metodo opera per impostazione predefinita.

Vale la pena conoscere una seconda rappresentazione perche alcuni algoritmi funzionano molto meglio con essa. Le coordinate polari individuano ogni pixel tramite la sua distanza da un punto centrale scelto e l”angolo tra esso e una direzione di riferimento. I pixel dell’immagine non si sono spostati – i byte sono ancora nello stesso buffer in ordine di riga – ma lo schema di indirizzamento e passato da «quanto a destra e quanto in basso» a «quanto distante dal centro e a quale angolo attorno ad esso.»

Due rettangoli affiancati, ciascuno che rappresenta la stessa immagine. Quello a sinistra mostra le coordinate cartesiane -- origine in alto a sinistra, assi x e y, un punto campione P alle coordinate (x, y). Quello a destra mostra le coordinate polari -- un marcatore di centro C all'interno del rettangolo, con una linea da C allo stesso punto P etichettata r (distanza), e un arco etichettato theta (angolo).

Lo stesso punto P, individuato in due modi: cartesiano (x, y) dall’origine in alto a sinistra, polare (r, theta) da un centro scelto.

Perche prendersi la briga di cambiare? A causa di due identita che trasformano ricerche difficili in ricerche facili.

In coordinate polari, ruotare l’immagine attorno al centro scelto e la stessa operazione del traslare i suoi pixel lungo l’asse dell’angolo – la direzione x nell’immagine ri-proiettata. Una copia ruotata e l’originale spostato a sinistra o a destra in forma polare.

Nella variante log-polare – l’asse della distanza usa una scala logaritmica, l’asse dell’angolo resta lineare – scalare l’immagine attorno al centro scelto e la stessa operazione del traslare i suoi pixel lungo l’asse della distanza – la direzione y. Una copia scalata e l’originale spostato in alto o in basso in forma log-polare.

Cosi un algoritmo che deve riconoscere un pattern noto soggetto a rotazione o scala puo effettuare la sua ricerca nello spazio polare, dove entrambe le trasformazioni si riducono a traslazioni ordinarie. Le traslazioni sono molto piu economiche da cercare rispetto a rotazioni e scalature, e la ri-proiezione polare e cio che rende disponibile questa sostituzione.

Le coordinate polari non sostituiscono quelle cartesiane per la memorizzazione dei pixel; i byte risiedono sempre sulla griglia cartesiana. Il modulo fornisce una coppia di metodi che ri-proiettano un’immagine dalla forma cartesiana a quella polare su richiesta, l’algoritmo che necessita di coordinate polari svolge il suo lavoro, e poi o il risultato viene riproiettato all’indietro oppure la misurazione nello spazio polare viene usata direttamente. Questo meccanismo e l’unico motivo per cui le coordinate polari compaiono in qualunque punto dell’interfaccia del modulo.

Con le coordinate cartesiane per individuare i singoli pixel, la quadrupla (x, y, w, h) per individuare i rettangoli di essi, e le coordinate polari disponibili quando un algoritmo ne trae beneficio, un’applicazione dispone di un vocabolario completo per individuare dove si trova qualcosa in un’immagine. Cio che e effettivamente memorizzato in una qualsiasi di quelle posizioni e il successivo livello delle fondamenta.