ricostruzione del personaggio e riempimento per OCR

Sto lavorando con il riconoscimento del testo sui pneumatici. Per utilizzare un OCR, devo prima ottenere una mappa binaria chiara.

Ho elaborato le immagini e il testo appare con i bordi rotti e fuori produzione. Ho provato l’erosione / dilatazione standard con dischi circolari ed elementi di linea in MATLAB, ma in realtà non aiuta.

Pr1- Qualche idea su come ribuild questi personaggi e colmare il vuoto tra i tratti dei personaggi?

Image_highres originaleImage_lowRes originalerilevato un buon margine

Pr2- Le immagini sopra sono a risoluzione più alta e con una buona illuminazione. Tuttavia, se l’illuminazione è scarsa e la risoluzione è relativamente bassa come nell’immagine sottostante, quali sarebbero le opzioni valide per l’elaborazione?

inserisci la descrizione dell'immagine qui

Soluzioni provate:

S1: questo è il risultato dell’applicazione del filtro mediano all’immagine elaborata condivisa da Spektre. Per rimuovere il rumore ho applicato un filtro mediano (5×5) e successivamente una dilatazione dell’immagine con un elemento lineare (5,11). Anche ora l’OCR (Matlab 2014b) riconosce solo alcuni dei personaggi

Comunque, grazie mille per i suggerimenti finora. Aspetterò comunque di vedere se qualcuno può suggerire qualcosa di diverso, magari pensando fuori dagli schemi :).

inserisci la descrizione dell'immagine qui

Risultati dell’implementazione Matlab dei passaggi dal codice di Spektre in basso (senza dilatazione del tratto (normalizzazione con angoli nell’ordine di 1,2,3,4:

inserisci la descrizione dell'immagine qui

e con soglia tr0 = 400 e tr1 = 180 e ordine degli angoli per la normalizzazione 1,3,2,4 inserisci la descrizione dell'immagine qui

I migliori saluti

Wajahat

Ho giocato un po ‘con il tuo contributo

La normalizzazione dell’illuminazione + la normalizzazione dell’intervallo dinamico aiuta un po ‘ad ottenere risultati molto migliori ma ancora lontani dal necessario. Mi piacerebbe provare la nitidezza delle derivazioni parziali per aumentare le lettere dallo sfondo e ritagliare piccoli rilievi prima di integrarmi e ricolorare per mascherare l’immagine quando avrò il tempo (non so quando forse domani) modifico questo (e commento / notifica tu)

illuminazione normalizzata

calcolare l’intensità degli angoli medi e bilineare gradualmente le intensità per far combaciare il colore medio

illuminazione normalizzata

rilevamento dei bordi

derivazione parziale di intensità i da x e y

  • i=|i(x,y)/dx|+|i(x,y)/dy|

e poi ritagliato da treshold=13

rilevamento dei bordi

[gli appunti]

Per eliminare la maggior parte del rumore ho applicato un filtraggio fluido prima del rilevamento dei bordi

[modifica1] dopo alcune analisi, ho trovato che l’immagine ha margini sfavorevoli per l’ottimizzazione dell’integrazione

Qui esempio di grafico di intensità dopo la prima derivazione di x nella linea centrale dell’immagine

bordi poveri

Come puoi vedere le aree nere vanno bene, ma quelle bianche sono quasi non riconoscibili dal rumore di fondo. Quindi la tua unica speranza è di usare il filtro min max come suggerito da @Daniel e prendere più peso sulle regioni di bordo nere (i bianchi non sono affidabili)

minimo Massimo

filtro massimo min enfatizza le regioni nere (maschera blu) e bianche (maschera rossa). Se le aree delle cabine fossero affidabili, basta riempire lo spazio tra di esse ma questa non è un’opzione nel tuo caso invece vorrei ingrandire le aree (ponderate di più sulla maschera blu) e OCR il risultato con OCR personalizzato per tale input a 3 colors.

  • Puoi creare il tuo OCR personalizzato per questo vedi OCR e la somiglianza dei personaggi

puoi anche scattare 2 immagini con diverse posizioni di luce e fotocamera fissa e combinarle per coprire la riconoscibile area nera da tutti i lati

[edit2] Codice sorgente C ++ per l’ultimo metodo

 //--------------------------------------------------------------------------- typedef union { int dd; short int dw[2]; byte db[4]; } color; picture pic0,pic1,pic2; // pic0 source image,pic1 normalized+min/max,pic2 enlarge filter //--------------------------------------------------------------------------- void filter() { int sz=16; // [pixels] square size for corner avg color computation (c00..c11) int fs0=5; // blue [pixels] font thickness int fs1=2; // red [pixels] font thickness int tr0=320; // blue min treshold int tr1=125; // red max treshold int x,y,c,cavg,cmin,cmax; pic1=pic0; // copy source image pic1.rgb2i(); // convert to grayscale intensity for (x=0;x<5;x++) pic1.ui_smooth(); cavg=pic1.ui_normalize(); // min max filter cmin=pic1.p[0][0].dd; cmax=cmin; for (y=0;yc) cmin=c; if (cmaxCanvas->Pen ->Color=clWhite; pic2.bmp->Canvas->Brush->Color=clWhite; for (y=0;yCanvas->Pen ->Color=clRed; pic2.bmp->Canvas->Brush->Color=clRed; pic2.bmp->Canvas->Ellipse(x-fs1,y-fs1,x+fs1,y+fs1); // red } if (c==0x000000FF) { pic2.bmp->Canvas->Pen ->Color=clBlue; pic2.bmp->Canvas->Brush->Color=clBlue; pic2.bmp->Canvas->Ellipse(x-fs0,y-fs0,x+fs0,y+fs0); // blue } } } //--------------------------------------------------------------------------- int picture::ui_normalize(int sz=32) { if (xsc) c0=c; if (c1 for (y=0;y>2); } } } //--------------------------------------------------------------------------- 

Uso la mia class immagine per le immagini, quindi alcuni membri sono:

  • dimensione xs,ys dell’immagine in pixel
  • p[y][x].dd è pixel in posizione (x,y) come tipo intero a 32 bit
  • clear(color) – cancella l’intera immagine
  • resize(xs,ys) – ridimensiona l’immagine a nuova risoluzione
  • bmp – Bitmap GDI incapsulata VCL con accesso Canvas

Ho aggiunto la fonte solo per 2 funzioni membro pertinenti (non è necessario copiare l’intera class qui)

[modifica3] immagine LQ

La migliore impostazione che ho trovato (il codice è lo stesso):

 int sz=32; // [pixels] square size for corner avg color computation (c00..c11) int fs0=2; // blue [pixels] font thickness int fs1=2; // red [pixels] font thickness int tr0=52; // blue min treshold int tr1=0; // red max treshold 

Esempio LQ

A causa delle condizioni di illuminazione, l’area rossa non è utilizzabile (distriggersta)

È ansible applicare prima un filtro massimo (assegnare a ciascun pixel di una nuova immagine il valore massimo di un intorno attorno allo stesso pixel nell’immagine originale), quindi un filtro minimo (assegnare il minimo dal vicinato nella massima immagine). Soprattutto se modellate il vicinato un po ‘più largo di quanto sia alto (ad esempio 2 o 3 pixel a destra / sinistra, 1 pixel in alto / in basso), dovreste essere in grado di ottenere alcuni dei vostri personaggi (l’immagine sembra mostrare principalmente spazi vuoti nella direzione orizzontale).

Le dimensioni e la forma ottimali del quartiere dipendono dal tuo problema specifico, quindi dovrai sperimentarne alcune. Con questa operazione potresti sperimentare l’unione di caratteri: dovrai probabilmente rilevare i BLOB e dividerli se sono troppo ampi rispetto agli altri BLOB.

modifica: anche le impostazioni di binarizzazione sono assolutamente fondamentali. Prova diversi algoritmi di binarizzazione (Otsu, Sauvola, …) per vedere quale (e quali parametri) funziona meglio per te.