This is an old revision of the document!
Tema 1 - Mini OCR
Responsabili: Anca Morar, Alexandru Grădinaru
Lansare: 17 decembrie 2021
Termen de predare: 23 ianuarie 2022, ora 23:55
-
Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!
În cadrul acestei teme va trebui să implementați un OCR simplu.
Descrierea aplicației
Aplicația va permite încărcarea unei imagini de intrare, identificarea literelor individuale și afișarea textului din acea imagine. Se va pune la dispoziție de asemenea o imagine șablon cu literele alfabetului și un fișier text care realizează corespondența dintre caractere și literele din imaginea șablon.
Imaginea de intrare este următoarea:
Imaginea șablon cu literele alfabetului este următoarea:
Fișierul text care realizează corespondența între caractere și literele din șablon conține pe fiecare linie următoarele elemente:
caracterul x y
x și y reprezintă adresa pixelului de unde începe dreptunghiul încadrator al caracterului, în imaginea șablon.
Fișierul text poate fi descărcat de aici: sablon.txt
De exemplu, dacă pe prima linie in fișier avem următoarele elemente:
A 280 233
înseamnă că în imaginea șablon, la rezoluția originală (1920 x 1080), imaginea cu caracterul “A” se găsește într-un dreptunghi încadrator care are colțul din stânga-sus la pixelul (280,233):
Textul din imaginea de intrare se va afișa în consolă: MERRY CHRISTMAS AND A HAPPY NEW YEAR !
Pași
Pașii algoritmului de identificare a textului sunt următorii:
Conversia pixelilor imaginii filtrate din spațiul RGB în spațiul HSV (Hue, Saturation, Value)
Segmentarea imaginii utilizând nuanța (Hue) pe post de criteriu de similaritate
Puteti folosi orice metodă de segmentare a imaginii, dar sunteți încurajați să aplicați un algoritm simplu de segmentare prin extindere (region growing):
Se consideră că toți pixelii imaginii sunt nevizitați
Se parcurg (și se bifează ca fiind vizitați) pixelii imaginii de sus în jos și de la stânga la dreapta. Dacă în parcurgerea scan-line se identifică un pixel de foreground (care are nuanța verde), atunci acesta primește un ID neutilizat până atunci, și este inserat într-o coadă, el reprezentând un pixel germen. Urmează o parcurgere în lățime (BFS), în care se procesează elementele din coadă (cât timp aceasta conține elemente). Procesarea unui element din coadă constă din următorii pași:
se identifică toți pixelii vecini nevizitați, care au o nuanță similară, și se introduc în coadă
pixelii vecini se marchează ca fiind nevizitați și primesc același ID al pixelului germen
se scoate din coadă elementul care a fost procesat
Această parcurgere în lățime conduce la identificarea unei regiuni de foreground, a unei litere individuale din imaginea de intrare. În imaginea de mai jos se poate observa rezultatul segmentării:
* Identificarea cuvintelor
Se va identifica fiecare caracter. Se va procesa fiecare regiune individuală, R, astfel:
Se va identifica lungimea și lățimea dreptunghiului încadrator al regiunii, D
Pixelii din dreptunghiul încadrator se vor compara cu pixelii din imaginea șablon. Pentru fiecare linie din fișierul text:
Se va crea o fereastră, F, de rezoluția dreptunghiului încadrator, care va avea colțul din stânga-sus egal cu adresa menționată pe linia din fișierul text
Se va compara fiecare pixel din dreptunghiul încadrator, D, cu pixelul corespondent din fereastra F (la aceeasi adresă, relativ la colțul din stânga-sus al ferestrei)
Se va calcula un cost de potrivire (de exemplu, numărul de pixeli corespondenți care au aceeași valoare, relativ la dimensiunea dreptunghiului încadrator)
Linia din fișierul text care corespunde la fereastra din imaginea șablon cu costul de potrivire cel mai bun reprezintă linia caracterului regiunii R
Se va identifica fiecare cuvânt. Pentru aceasta puteți stabili niște reguli simple de identificare a spațiilor în text. Exemplu:
Dacă între două regiuni individuale de pe același rând există un spațiu mai mare decât un threshold, se prespune că între acele două litere există un spațiu (o literă corespunde unui cuvânt iar cealaltă literă, următorului cuvânt din text)
Dacă o regiune individuală începe pe un nou rând (nu mai există altă regiune în stânga ei), atunci această regiune face parte dintr-un cuvânt nou
* Afișarea mesajului în consolă
Se vor afișa cuvintele din imaginea de intrare, conform corespondenței între caracterele din fișierul text, literele din șablon, și potrivirea dintre regiunile individuale din imaginea de intrare și literele șablonului.
Bonusuri Posibile
Funționarea pentru litere cu dimensiunea fontului variabilă
Funcționarea pentru mai multe fonturi
Funcționarea pentru text rotit
Indicații Suplimentare
Tema se poate implementa in orice limbaj sau framework. Dacă folosiți biblioteci ajutătoare (ex, OpenCV), acestea pot fi utilizate numai pentru încărcarea/afișarea imaginii sau pentru operații de citire/scriere pe pixelii imaginii. Nu se pot folosi funcții deja implementate în biblioteci pentru:
implementarea filtrului median
trecerea din spațiul RGB în spațiul HSV
segmentarea imaginii și identificarea regiunilor de foreground (a literelor individuale)
determinarea dreptunghiurilor încadratoare regiunilor (literelor)
compararea pixelilor din dreptunghiurile încadratoare din imaginea de intrare cu informația din șablonul cu alfabetul
Arhivarea proiectului
Arhiva trebuie sa contina toate resursele necesare compilarii si rularii.
Dacă folosiți framework-ul de la laborator, realizați următorii pași:
inainte de a face arhiva asigurati-va ca ati curatat proiectul Visual Studio:
click dreapta pe proiect in Solution Explorer → Clean Solution
si stergeti folderul /build/.vs (daca nu il vedeti, este posibil sa fie ascuns)
SAU stergeti complet folderul /build
in cazul in care arhiva tot depaseste limita de 50MB (nu ar trebui), puteti sa stergeti si folderul /deps sau /assets intrucat se pot adauga la testare. Nu este recomandat sa faceti acest lucru intrucat ingreuneaza mult testarea in cazul in care versiunea curenta a librariilor/resurselor difera de versiunea utilizata la momentul scrierii temei.