P r o j e k t i B i l d a n a l y s Ett enkelt OCR-system av Anders Fredriksson F98 Fredrik Rosqvist F98 Handledare: Magnus Oskarsson Lunds Tekniska Högskola 2001-11-29 - Sida 1 -
1.Inledning Många människor har upptäckt fördelen med att arbeta med ordbehandlare. Detta kräver dock att texten finns i digital form, dvs sparad som en datorfil. Vanligtvis sker detta genom att texten skrivs direkt i ordbehandlaren med hjälp av ett tangentbord. I många fall fungerar detta väldigt bra, men det finns situationer då en annan form av inläsning skulle vara praktisk. En sådan situation är då texten man vill redigera endast finns på papper. Alternativen är då att skriva in texten för hand i en ordbehandlare eller att använda ett datorprogram som skapar en datorfil av texten på pappret. Detta senare alternativ kallas Optical Character Recognition (optisk teckenigenkänning) och systemet som gör detta kallas således OCR-system. Detta är grundprincipen bakom en produkt kallad C-Pen som är en elektronisk överstrykningspenna. På själva pennspetsen sitter en liten kamera som läser in bilder av texten. Ett inbyggt OCR-system gör sedan om dessa bilder av texten till digital text. Då detta är gjort kan den digitala informationen överföras till en dator med ordbehandlare för redigering eller så kan orden i texten översättas till något annat språk med hjälp av en databas och visas på en display på sidan av pennan. Ett annat användningsområde är som hjälpmedel till synskadade. Då texten finns i datoriserad form kan denna översättas till blindskrift för att sedan skrivas ut som sådan på en specialskrivare. Alternativt kan texten, med hjälp av en dator, omvandlas till tal ( eller i alla fall något man kan likna vid tal.) I detta projekt har vi skapat ett enkelt OCR-system i MATLAB. Anledningen till att det kallas enkelt är att det endast fungerar för typsnittet Times New Roman samt för ett begränsat antal tecken, de små bokstäverna a-ö. Texten som skall bearbetas antas dessutom var inläst rakt, dvs raderna är parallella med bildunderkanten. Vikten i detta program har lagts på segmentering och identifiering medan inläsning och brusreducering endast behandlas ytligt. Detta beror på att vi fann de förstnämnda stegen mer intressanta. 2. Inläsning och brusreducering En bild med 256 gråskalenivåer läses in på något sätt, exempelvis via scanner eller digitalkamera. I vårt fall har vi använt oss av bilder från Adobe Photoshop. Därefter konverteras den till bitmaps-format och importeras till MATLAB. För att undertrycka eventuellt brus i bilden och för att få en binär bild till segmenteringen trösklas denna, dvs intensiteter över ett visst värde sätts till ett (i fortsättningen kallade svarta pixlar) och de under till noll (vita pixlar), varpå en binär bild fås.( Se Appenix. OCRThreshold) Om ingångsbilden är av god kvalitet samt om trösklingsnivån är lämpligt vald kommer denna bild att innehålla tillräcklig information för att kunna segmentera ut bokstäverna. Om bilderna varit av sådan kvalitet att tröskling inte varit tillräckligt kan ett medelvärdesfilter användas. Brus kännetecknas av att det är - Sida 2 -
högfrekvent, d.v.s. skiljer sig markant i intensitet från sin omgivning. Då ett medelvärdesfilter används minskas denna till medelnivån av denna och dess näraliggande pixlar. Eftersom brus var högfrekvent sänks dess intensitet till ett påtagligt lägre värde som troligen hamnar under trösklingsvärdet och bruset försvinner. Nackdelen med denna metod, som gör att vi inte använder denna, är att skarpa kanter i bilden smetas ut på samma sätt som brus. Detta får till följd att bredden och höjden på bokstäverna ändras och således även pixelantalet. Vår identifieringsmetod bygger på dessa, varför en ändring av dessa är klart olämplig. Ett bättre alternativ hade varit att använda ett medianfilter, men vår test av detta visade att det tog alldeles för lång tid. För att ytterligare undertrycka en del av bruset kan man utnyttja av att väldigt små segment, i detta sammanhang sammanhängande svarta pixlar, troligtvis är brus och således kan sorteras bort.(se Appendix OCRSegment ) 3. Segmentering Efter att merparten av bruset filtrerats bort är nästa steg att segmentera ut de sammanhängade svarta pixlarna, vilka senare i programmet skall identifieras som bokstäver. Det finns olika metoder att göra detta på. I detta system börjar sökandet efter svarta pixlar högst upp i vänstra hörnet och fortsätter nedåt rad för rad tills en svart pixel påträffas. När väl en svart pixel påträffas börjar själva segmenteringen. De närliggande pixlarna undersöks om också dessa är svarta och om så är fallet undersöks även deras grannar. Allting sker genom rekursiva anrop av en funktion findsegment. För att inte en granne ska identifiera den pixel, som hittade grannen, som svart, tas alla funna pixlar bort, dvs deras värde sätts till 0 (= vit pixel). Koordinaterna för alla svarta grannpixlar sparas och efteråt beräknas en bild utifrån dessa. Även koordinaterna för övre vänstra hörnet beräknas och sparas, liksom bredden och höjden. Med närliggande pixlar menas i detta fall pixlar som ligger rakt under eller ovan, rakt åt höger eller vänster samt diagonalt från pixeln. Detta synsätt på närliggande pixlar kallas närliggande pixlar i D-8- metriken. (Se Appendix OCRSegment) - Sida 3 -
4. Identifiering En bra identifiering skall bygga på egenskaper som är specifika för varje bokstav. Om detta inte går att uppnå får man använda sig av många olika egenskaper som tillsammans ger en bra identifiering av vilken bokstav det rör sig om. Detta OCR-system bygger på följande egenskaper (Se Appendix. OCRClassify): - Kvoten mellan höjd och bredd. Bredden och höjden sparades för varje segment. Detta gör att man t.ex. kan skilja på om segmentet innehåller ett a (kvot nära ett) eller h (kvot större än ett). I och med att en kvot används blir egenskapen oberoende av teckenstorleken. - Kvoten mellan antalet svarta pixlar och totala antalet pixlar i segmentet. Genom att beräkna medelintensiteten för ett segment får man en teckenstorleksoberoende egenskap som motsvarar arean, dvs antalet svarta pixlar dividerat med totala antalet pixlar. - Kvoten av medelintensiteterna i de båda segment som bildas då segmentet delas på bredden. Ovanstående två kvoter har svårt att skilja på vissa bokstäver t.ex. b, d, p, q, r och g. Alla dessa har nämligen samma höjd-bredd-förhållande och medelintensitet av svarta pixlar. För att lösa detta delas segmentet upp i två halvor, en vänsterhalva och en högerhalva. Därefter beräknas medelintensiteten i dessa varpå en egenskap erhålls som kan identifiera många av dessa bokstäver. - Kvoten av medelintensiteterna i de båda segment som bildas då segmentet delas på höjden. Vissa bokstäver, exempelvis e och o (Se Fig.2), ger liknande resultat i alla tre ovanstående identifieringskvoter. Detta löses på motsvarande sätt som ovan fast att uppdelningen i nya segment sker på höjden så att en undre och övre halva av segmentet bildas. - Specialfallet o och z samt n och x. Bokstäverna o och z samt n och x är trots ovanstående identifieringsalgoritmer fortfarande svåra att skilja på. Detta löses genom en kontroll av mittpixelns intensitet. I o och n är denna vit medan i z och x är denna svart. (Se Appendix OCRIdentify) - Sida 4 -
För att veta vilken bokstav den uträknade egenskapen, i detta fall kvoten, tillhör, har en databas skapats för varje egenskap för alla bokstäver. Denna innehåller en undre gräns och en övre gräns. Den undre gränsen är beräknad som två standardavvikelser under medelvärdet och den övre två standardavvikelser över medelvärdet. Databasen byggdes upp genom inläsning av bildfiler med fem bokstäver av samma sort men av olika storlek. Bokstavens medelvärden och standardavvikelser för de olika egenskaperna beräknades med hjälp av dessa fem fall. (Se Appendix OCRCreateDatabase). Antalet testbokstäver är alltså väldigt litet ur statistisk synvinkel. Av praktiska (tidsmässiga) skäl användes dock enbart dessa fem. Identifieringen sker geonom successiv utsållning efter samma ordning som de olika egenskaperna presenterades på föregående sida. Först jämförs alltså den uträknade bredd-höjd-kvoten med motsvarande databas. I detta skede sållas alltså bokstäver som g, f och andra avlånga bokstäver bort om segmentet innehåller ett e, a eller annan kvadratisk bokstav. De möjliga kandidaterna går sedan vidare till nästa steg där medelintensiteten jämförs. I detta skede skiljs bokstäver som innehåller mycket håligheter ut från de som är av mer kompakt natur. Om t.ex. både f och l har klarat sig vidare från förra steget är det stor sannolikhet att en utsållning sker i detta steg då l är av mer kompakt natur än f. På samma sätt jämförs de två sistnämnda egenskaperna. För att kontrollera om det rör sig om någon av våra svenska specialtecken används följande algoritmer: Algoritmen för att identifiera å är följande: - En ring upptäcks. - Kontrollerar om det finns ett a under denna. - Om detta är fallet ändras detta a till ett å. - Ringen tas bort oberoende om ett a hittas eller inte. - Sida 5 -
Algoritmen för att identifiera ä och ö är följande: - En punkt upptäcks. - Kontrollerar om det finns en punkt på lämpligt avstånd åt höger. Finns detta inte tas punkten bort. - Om ytterligare en punkt påträffas undersöks segmentet under. - Är detta ett a ändras detta till ett ä och är det ett o ändras detta till ett ö. - De båda punkter tas bort oberoende av om ett a eller o hittas eller ej. Anledningen till att punkten kan kastas bort beror på att i och j är definerade i vårt program utan prickar. Att man endast ser efter om det finns en prick åt höger beror på att segmenteringen går uppifrån nedåt från vänster till höger. Alltså kommer den vänstra pricken att upptäckas först. Systemet kontrollerar även radbyten. Detta görs genom att kolla ifall en rad endast består av vita pixlar. Även mellanslag kontrolleras genom att mäta avståndet mellan två tecken och jämföra det med en tredjedel av bredden på ett av tecknen. 5. Sammanfattning Optisk teckenigenkänning (OCR) sker i följande steg: - Inläsning Bilden läses in på lämpligt sätt t.ex. via scanner eller digitalkamera. De bilder vi provat programmet på är skapade med Adobe Photoshop. - Brusreducering Bilden filtreras så att endast bokstäverna finns kvar. I detta system sker detta genom tröskling och segment som är mindre än de minsta bokstäverna nonchaleras. - Segmentering Alla svarta sammanhängande pixlar i bilden segmenteras ut med hjälp av en rekursiv algoritm som undersöker varje svart pixels grannar enligt D-4-metrik. Till varje segment sparas positionen i ursprungsbilden samt bredd och höjd. - Identifiering För att urskilja vilken bokstav som finns i segmentet används bredd-höjd-kvoten, medelintensiteten i hela segmentet, kvoterna mellan medelintensiteterna i vänster och höger halva samt övre och undre samt en funktion som undersöker intensiteten på mittpixeln i segmentet. Alla dessa är storleksoberoende, vilket ökar användningsområdet. - Sida 6 -
Själva identifieringen sker genom successiv utsållning, dvs de bokstäver som ej är möjliga efter jämförelse med databasegenskaperna stryks. - Sida 7 -
A. Testkörningar Följande bilder gjordes i Adobe Photoshop och kördes i OCRsystemet med följande resultat: Test 1. >anders >och >fredrik Test 2. >detta_program >är_så_grymt >coolt - Sida 8 -