L'immagine di esempio che hai pubblicato ha una prospettiva relativamente forte (non viene riprodotta direttamente dalla direzione della normale alla superficie) che può causare problemi con le tecniche di corrispondenza dei modelli che utilizzano l'elaborazione a blocchi. Suppongo che devi prendere l'immagine con una prospettiva forte, quindi la prima cosa che vogliamo fare è stimare la trasformazione dell'immagine che rimuoverà la proiezione prospettica e risulterà un'immagine rettificata ("immagine diritta").
Correzione della proiezione prospettica quando si conosce la forma
L'obiettivo finale della preelaborazione è trovare gli angoli di quel rettangolo grigio che fa da sfondo alla tabella dei colori. Ho iniziato semplicemente con il limite di valore costante. Letteratura / web contiene molte informazioni su come eseguire il limite quando l'immagine ha un'illuminazione non uniforme, ma se è possibile, provare a correggere la configurazione dell'immagine in modo che l'illuminazione sia relativamente uniforme.
Supponevo che la tabella dei colori occupasse una porzione abbastanza grande dello schermo, quindi è probabilmente la più grande regione continua dell'immagine. Esistono molte funzioni di etichettatura in bianco e nero (MATLABs bwlabel, IPP LabelMarkers, OpenCV ha un cvblob di libreria esterna) che darà ad ogni regione connessa distinta il proprio indice. Dopo l'etichettatura è possibile calcolare le aree dei componenti collegati usando un istogramma e quindi scegliere il componente con l'area più grande.
Di solito è una buona idea riempire i componenti in modo tale che il componente non abbia buchi, questo riduce il numero di pixel del bordo.
Ora possiamo usare gli operatori di ricerca dei bordi (ho usato il metodo basato sul gradiente, ma puoi anche tracciare il bordo seguendo pixel bianchi collegati a pixel neri) per ottenere pixel appartenenti al boarder.
Poiché l'oggetto che ci interessa è il rettangolo, ho adattato quattro linee ai pixel del bordo utilizzando un robusto raccordo (RANSAC). Dopo aver trovato una nuova linea, ho rimosso tutti i punti vicini alla linea trovata, questo costringe le successive operazioni di adattamento a restituire altri bordi dell'oggetto. Alla fine, quando sono stati trovati tutti i bordi, ho calcolato tutte le possibili intersezioni tra l'insieme di linee. Dal set di punti risultanti ho rimosso tutti i punti al di fuori dell'immagine.
Ora abbiamo gli angoli del grafico a colori e siccome conosciamo le dimensioni del grafico, possiamo calcolare la matrice di trasformazione (omografia, proiezione tra due piani. Usare la trasformazione lineare diretta (DLT) per risolvere ) tra le coordinate millimetriche e le coordinate dei pixel.HHH
x=HX
Questa matrice di trasformazione può quindi essere utilizzata per trasformare l'immagine originale in modo tale che la tabella dei colori sia riprodotta direttamente dalla direzione della normale alla superficie.
Come si può vedere, rimane solo la distorsione radiale. Quando abbiamo usato la trasformazione per la trasformazione dell'immagine (interpolazione 2D), abbiamo scelto le coordinate di interpolazione in modo tale che conosciamo la risoluzione precisa dell'immagine, il che significa che ora conosciamo ad esempio la dimensione delle lettere.H
Se vogliamo ancora eseguire una corrispondenza dei modelli, possiamo utilizzare qualsiasi metodo di corrispondenza dei modelli decente. Il metodo non deve essere invariante per rotazione / scala poiché l'immagine è già stata corretta.