Elaborazione delle immagini: come rilevare un'insegna quadrialterale nell'immagine?


14

Come posso rilevare un'insegna quadrilatera da un'immagine catturata usando un telefono cellulare? Come posso rilevare forme come il rettangolo? rettangolo arrotondato (angoli arrotondati anziché angoli di forma)?

Sto usando opencv.wrapper ma sono nuovo di esso.

Grazie.

Ecco l'esempio: alt text http://www.freeimagehosting.net/uploads/b03442fd36.png

testo alternativo http://www.freeimagehosting.net/uploads/e6b36040e8.png

A causa del rumore e di molte linee lì, non sono in grado di determinare quale sia la linea di confine dell'insegna. A volte riesco a trovare il limite delle linee dopo aver trasformato. Sono intrappolato .... in questo tipo di scenario ...

Queste sono le 2 immagini grezze prese dalla fotocamera del cellulare

testo alternativo http://www.freeimagehosting.net/uploads/6dbd613edf.jpg testo alternativo http://www.freeimagehosting.net/uploads/720da20080.jpg

Ho bisogno di un tuo consiglio per vedere come posso elaborare l'immagine per ottenere l'insegna?

Grazie mille


2
Parole chiave: OpenCV, trasformata di Hough duplicati: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

Sì, perché trasforma FTW!

ma ci sono dei disturbi nell'immagine come posso scoprire qual è il confine dell'insegna

@ xabi123: hough trasforma, soglia, leggi confine

1
Potresti condividere un'immagine di esempio?

Risposte:


7

Entrambe le tue immagini contengono molte linee che non hanno nulla a che fare con il segno che stai cercando. E alcune di quelle linee sono più lunghe / hanno un contrasto più elevato rispetto alle linee che effettivamente desideri, quindi penso che il rilevamento delle linee del bordo (ad es. Usando una trasformazione hough o sommando i contrasti in orizzontale / verticale) non funzionerà.

Ma: il segno che stai cercando ha altre caratteristiche che dovrebbero essere più facili da rilevare:

  • Il segno sullo sfondo ha una luminosità (quasi) costante
  • Occupa un'area relativamente ampia dell'immagine
  • È vicino al centro dell'immagine

Quindi stai cercando una grande area connessa con basso contrasto. Ho hackerato un algoritmo di prova di concetto in Mathematica. (Non sono un esperto di OpenCV, ma menzionerò la rispettiva funzione OpenCV quando li conosco.)

In primo luogo, utilizzo i filtri derivati ​​gaussiani per rilevare l'entità del gradiente in ciascun pixel. Il filtro derivato gaussiano ha un'ampia apertura (11x11 pixel in questo caso), quindi è molto sensibile al rumore. Quindi normalizzo l'immagine del gradiente a media = 1, quindi posso usare le stesse soglie per entrambi i campioni.

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

Implementazione OpenCV: è possibile utilizzare sepFilter2Dper il filtro effettivo, ma a quanto pare, è necessario calcolare i valori del kernel del filtro da soli .

Il risultato è simile al seguente:

magnitudine del gradiente

In questa immagine, lo sfondo del segno è scuro e i bordi del segno sono luminosi. Quindi posso binarizzare questa immagine e cercare componenti connessi scuri.

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

Implementazione di OpenCV: il limite dovrebbe essere semplice, ma penso che OpenCV non contenga un'analisi dei componenti connessa - puoi usare flood fill o cvBlobsLib per questo.

Ora trova il BLOB più grande vicino al centro dell'immagine e trova lo scafo convesso (ho semplicemente usato il BLOB più grande che non è collegato allo sfondo, ma potrebbe non essere sufficiente per ogni immagine).

risultati: inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


0

Un altro approccio che si può adottare e che è più robusto ai rumori in questa situazione è quello di generare una curva del livello di grigio medio dell'immagine lungo l'asse xe lungo l'asse y. Ossia, calcola il livello di grigio medio per ogni linea / colonna nell'immagine.

Se, ad esempio, l'insegna (o i suoi bordi) è più chiara dell'ambiente circostante (come nel caso di tutti gli esempi mostrati nella domanda), avrai due picchi nella curva dell'asse x (per sinistra e destra e bordi ) e due picchi nella curva dell'asse y (per i bordi superiore e inferiore). Utilizzando una tecnica di rilevamento dei bordi per un segnale a 1 dimensione (forse un filtro passa-alto) è possibile dedurre le coordinate degli angoli dell'insegna.

Ho visto questo approccio usato per rilevare le targhe e anche per il riconoscimento del viso (il naso tende ad essere la parte più luminosa del viso, quindi genera un picco nelle curve dell'asse x e dell'asse y).


hmm .. cosa succede se il cartello viene ruotato o la fotocamera viene ruotata?
Mustafa,

0

Questa potrebbe essere una piccola idea capovolta, ma potrebbe valere la pena provarla. Invece di provare a rilevare la rectange e pensare al testo come rumore , forse puoi trattare il testo come informazione e usarlo per rilevare più facilmente la rectange.

Ecco il contorno dell'idea:

  • rilevare il testo nell'immagine . Non deve essere un'implementazione solida (dovresti essere in grado di google qualche piccola libreria che lo fa, o forse OpenCV ce l'ha), solo una stima approssimativa del testo nell'immagine
  • trova il cener di tutti i rilevamenti di testo . Anche con immagini rumorose dovrebbe essere nel posto reale
  • annulla la rettifica del rettangolo nell'area intorno ai rilevamenti di testo . Forse utilizzare la distanza mediana dal centro dei rilevamenti di testo o qualcosa di simile. Fai diversi diametri e prendi il richiamo più forte .

Le spiegazioni e i vantaggi:

  • l'area intorno al testo è generalmente omogenea - il vero rettangolo dovrebbe essere il primo richiamo forte
  • in questo modo non è necessario eseguire la trasformazione dell'intera immagine, quindi è possibile farlo in modo più turale (forse più volte nella stessa area ma con dimensioni della benna diverse ...)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.