OCR (optical character recognition) - rozpoznávání textu v obraze Martin Koníek, I46 programová dokumentace
1. Úvod Tento projekt vznikl na MFF UK a jeho cílem bylo vytvoit algoritmus schopný rozpoznávat text v obraze (OCR). Algoritmus pochází od autora a nepoužívá žádné dobe známé metody (jak se dotete dále) a jeho výsledky jsou velmi uspokojivé (jak si mžete vyzkoušet). Chtl bych podkovat Dejvovi, že mi jej umožnil vyvíjet jako mj zápotový program, jelikož mi tato tematika pipadá zajímavjší, než ostatní nabízené na cviení.
2. Metodika Po vyzkoušení programu si možná íkáte: A jak to tedy funguje? Správná otázka, protože to je samozejm to hlavní, o em tento dokument pojednává. Jádrem je algoritmus, který dokáže analyzovat obsah obrazu a výsledky analýzy porovnat s obsahem databáze, píp. je do databáze pidat. 2.1. Analýza Obraz je projíždn svislými linkami zleva doprava a je zkoumán pro souvislé neprázdné oblasti. Vždy, když skoní zapoatá neprázdná oblast, máme další svislý pás, který mžeme podrobn zkoumat. Tedy každé 2 znaky musí být možno oddlit svislou linií. Z toho ihned vyplývají 2 omezení: znaky se nemohou pekrývat a musí být horizontáln souvislé. Máme-li pás, najdeme ješt horní a dolní hranici znaku, ímž získáme ohraniující obdélník a zábava mže zaít. O znaku uvnit obdélníku jsou zjištny následující parametry. Parametry: - prbh linie zleva - prbh linie zprava - prbh linie zespodu - prbh linie shora - poet prseík s horizontální linií - poet prseík s vertikální linií - poet prseík s diagonální linií - pomr šíka / výška Význam parametr: Prbh linie (celkový vzhled znaku) Nejjednodušší je to na píkladu. Pedstavte si písmeno A. To vypadá z takto: - zleva má charakter vlevo (pjdeme-li odshora dol po jeho levé linii, pjdeme vlevo) - zprava má charakter vpravo (stejný dvod) - zespodu má charakter nahoru, rovn, dol (pjdeme-li zleva doprava po jeho spodní linii, pjdeme nahoru, pak chvíli rovn, pak dol) - shora má charakter nahoru, dol (stejný dvod) Tyto 4 parametry staí na jednoznanou identifikaci velké ásti abecedy (!). Nkterá písmena (H, L, T, F, E, I) by však obdržela naprosto stejnou charakteristiku (jsou rovné ze všech stran). Proto byly pidány další parametry. Poet prseík Pes obdélník jsou taženy 3 linie a spoteny poty prseíku s plnou oblastí (tj. když postupující paprsek vstoupí na plný pixel).
Šíka / výška Reálné íslo urující pomr stran ohraniujícího obdélníku (tak se dobe pozná nap. I od L). Implementace zjištní parametr: Prbh linie Vezmme si jeden ze 4 pípad, ostatní jsou obdobné. Nap. levá strana: Míme vzdálenost od levého okraje a porovnáváme s pedchozí vzdáleností a ve 3 promnných si poítáme, kolikrát už vzdálenost vzrostla, klesla, resp. zstala konstantní. Pokud vzdálenost vzroste (klense, nezmní se), zvýšíme poet rst (pokles, nemn) o 1 a ostatní 2 poty snížíme. Tyto 3 promnné se tedy petahují o dominanci, až jedna z nich zvítzí dosáhne pednastavené hodnoty (TOLERANCE). Na obrázku je poet pokles posupn: 1, 2, 3, 2 (nárst - zelen), 3, 4 poklesy zvítzily, dosáhly hodnoty 4, která byla nastavena jako tolerance. Prohlásíme tedy úsek za vlevo a ostatní 2 hodnoty (rsty a nemny) vynulujeme. erná linie na obrázku by takto dostala charakteristiku: vlevo, rovn, vpravo. Poet prseík Jsou taženy 3 paprsky (horizontální, vertikální, diagonální ne pesn po uhlopíce, odvozeno experimentáln ) a pi vstupu na vyplnný pixel se zapoítá prseík. Vydlení 2 ísel. Šíka / výška 2.2. Databáze V databázi jsou uložené znakové sady skupiny znak. Každá z nich obsahuje znaky a u každého z nich jméno (mže být i dlouhé) + zmínných 8 parametr. Databázi jsem pojal pro pehlednost jako soubor na disku ve formátu XML, takže jsem si mohl vyzkoušet i napsat jednoduchý XML parser. Ten jsem kvli rekurzivní struktue formátu XML implementoval jako rekurzivní funkci. Po analýze znaku z obrazu je možno ho pojmenovat a pidat do databáze.
Vlastní rozpoznání textu v obraze probíhá tak, že se každý znak analyzuje zvláš, získané parametry se porovnají se vším v aktuální znakové sad, vybere se maximální shoda a jméno tohoto znaku z databáze se prohlásí za výsledek. Výsledky pro jednotlivé znaky se poskládají a máme text. 2.3. Vlastní implementace Program byl vytvoen v Delphi 7. Vše je zapouzdeno v tíd TAnalyzer (jednotka Analyzer.pas), jejíž hlavní metody jsou: function CharSimilarity(L1, L2 : TCharInfo) : real; - vrací, jak moc jsou si 2 struktury typu TCharInfo (používané pro ukládání znak) podobné procedure AnalyzeFrom(Can : TCanvas; Left, Top, W, H, Tlr : integer); - z dané oblasti na daném canvasu analyzuje znak a získanými parametry naplní strukturu AnalyzedChar function GetAnalyzedCharInfo : TCharInfo; - vrací strukturu AnalyzedChar function GetAnalyzedString : string; - vrací celkový poskládaný výsledek function LoadCharsFrom(FileName : string) : boolean; function SaveCharsTo(FileName : string) : boolean; - nate xml soubor do pole FCharsets patícího tíd TAnalyzer / uloží zpt do souboru procedure SetCharsetIdx(idx : integer); - vybere aktuální znakovou sadu function GetResultPrecision : real; - vrátí, jak úspšná byla celková analýza obrazu, tj. jak podobné byly znaky v obraze tm v databázi Zbytek je okomentován ve zdrojovém kódu. Ostatní jednotky (Main.pas, TeachDlg.pas, EditChar.pas) obsahují formuláe a slouží jako grafické rozhraní pro demonstraci použití tídy TAnalyzer.
3. Závr a další práce Musím se piznat, že jsem byl sám pekvapený, jak dobré výsledky zaal program podávat po pidání dostatku parametr pro znaky. První verze pracovala naivn jen s analýzou levé a pravé linie (už i to ale stailo na naprosto bezpené rozpoznání A od B ). Po pidání horní a dolní strany se vyskytl zmiovaný problém písmen T, L, H apod. Byly tedy ješt pidány 3 linie, které asov tém zadarmo poskytly daleko pesnjší výsledky. Algoritmus opravdu funguje dobe jak na znakové sad písmen kreslených myší (obdoba PDA a dotykové tužky), tak na bžných znakových sadách. Jeho návrh ho ale peduruje k rozpoznávání písmen velikosti alespo 20 pixel znak musí být dost velký na to, aby se na nm bylo eho chytit. Tady hraje velmi dležitou úlohu nastavená tolerance. Pro menší písmo je samozejm daleko vhodnjší mensí tolerance, protože tak mže být úsek vysoký 10px oznaen za vlevo, rovn, vpravo, piemž pi vyšší toleranci by byl oznaen jen jako rovn, pípadn by nebyl oznaen vbec a byl by považován za hrbol. Program nyní také pracuje pouze s jedním ádkem textu, což by nebyl problém v další verzi zmnit. Možná by se dal použít i pro petení naskenované strany textu, pi dostatené velikosti obrazu. Pro tento úel nebyl však nebyl navržen. Zajímavostí je, že rozpoznávané znaky nemusí být jen písmena. Staí znak analyzovat a pojmenovat. Program tak mže poznat domek, tank, letadlo a spoustu dalších vcí.