Znalezienie cyfr w kodzie pocztowym.


Autor: Mariusz Dymarek
Raport z projektu: Metody i algorytmy sztucznej inteligencji, ARE3513
Prowadzący: dr inż. Witold Paluszyński
Data: 16 czerwca 2008r.


Wroclaw, June 16 2008

This report has been prepared as a requirement for the course: ARE3513 "Methods and algorithms of artificial intelligence.

Author: Mariusz Dymarek.

Finding numbers in image with post code



This project is middle part of identifying post code from envelope. Whole process consist 3 parts: It was assumed, that image from entry is bitmap with post code on it(problem of localization of post code in envelope was skipped). Entry image should include 6 signs in following order: xx-xxx. The aim of this project is to extract 5 images (each with one number) from image with post code.
Description of the algorithm
First picture picture is being thresheld, next algoritm uses to reduce noises in picture. To solve main problem(extracting numbers) algorithm uses vertical and horizontal projection.

Opis problemu i założenia

Projekt jest częścią procesu odczytywania kodu pocztowego z koperty. Proces ten można podzielić na trzy etapy: Zrealizowany projekt jest środkowym etapem tego procesu. Pismo może być zarówno odręczne jak i maszynowe. W projekcie zalożono, że dane wejściowe do aplikacji to mapa bitowa z kodem pocztowym (pominięto problem lokalizacji kodu na kopercie). Zadanie polega na segmentacji obrazu wejściowego w taki sposób, aby wyłuskać z niego pięć mniejszych obrazów reprezentujących cyfry kodu pocztowego. Obraz wejściowy powinien zawierać 6 znaków w nastepującym formacie xx-xxx, cyfry nie powinny zachodzic na siebie(jeśli zachodzą program próbuje odtworzyć cyfry, ale w większości przypadków jest tracona część cyfry). Rozpoznawanie liter z wyłuskanych obrazów nie jest realizowane.
Przykładowy obraz wejściowy:
Przykład przelewu


Algorytm rozwiązujący problem

Przygotowanie obrazu do segmentacji

Wejściowy obraz jest konwertowany do skali szarości, następnie jest progowany (próg jest zmienny - średnia szarość danego obrazu). Umożliwia wydobycie znaków z obrazów o różnych stopniach kontrastu. Przykładowy obraz po progowaniu:
Obraz po progowaniu
Następnie obraz jest przepuszczany przez filtr medianowy oraz poddany jest kolejno operacji erozji i dylatacji.
Jako element strukturalny jest użyta macierz:
0 1 0
1 1 1
0 1 0
Operacje te mają na celu usunięcie wszystkich szumów, które podczas progowania zostały błędnie zaklasyfikowane jako znak. Obraz przygotowany do segmentacji:
Obraz przygotowany do segmentacji
Niestety jak widać na powyższym obrazku, czasami filtry usuwają nie tylko szumy, ale też część cyfry, która zanika po procesie erozji. W projekcie nie ma to dużego wpływu na efekt końcowy. Natomiast stanowiłoby to problem przy ostatnim etapie odczytywania kodu pocztowego, czyli rozpoznawaniu znaków z obrazków.

Wyliczenie projekcjii pinowej przetworzonego obrazu.

Algorytm wyłuskiwania cyfr bazuje, na rzutowaniu pionowym, ktore jest wykresem średnich poziomów szarości w liniach pionowych. Ponad to, w programie odwrócono wykres. Tak, że liczba zero oznacza że wszystkie punkty w rzutowaniu są białe i analogicznie - 255 wszystkie punkty w linii są czarne. Algorytm wyliczający projekcję pionową: Algorytm wyliczający projekcję pionową
gdzie: Projekcja pionowa przykładowego obrazu wygląda następująco:
Projekcja pionowa
Jeśli obrazy wejściowe zawierają kod pocztowy w formacie xx-xxx, to ich projekcje pionowe posiadają stałe cechy, dzięki którym można podzielić obrazy na znaki. Punkty z wykresu, które mają wartość zero są białymi paskami, które oddzielają kolejne litery od siebie. Korzystając z tej zależności i znając rozkład cyfr w obrazku łatwo wyłuskiwać kolejne znaki. Jednak, jeżeli liczby nachodzą na siebie sytuacja jest trudniejsza(alogrytm stara się znaleźć wtedy wartość jak najbliższą białej linii). Można również łatwo rozpoznać kreskę pionową w tuż przed środkiem obrazu.

Opis Algorytmu

Kolejne kroki algorytmu: Funkcja znajdz, próbuje na podstawie projekcji pionowej rozdzielic dwie cyfry. Jako parametr przekazywany jest do niej linia, od której funkcja zaczyna szukać linii z końcem pierwszej i początkiem drugiej cyfry, linia z końcem drugiej w kolejności cyfr.Funkcja szuka minimalnej wartości histogramu na podanym przedziale.
Rozdzielenie liczby trzeciej i czwartej wywoływane jest z punktem końcowym w linii o maksymalnej wartości projekcji pionowej z oczekiwanego zakresu położenia 4 cyfry.

Implementacja programowa.

Program został napisany w całości na potrzeby projektu. Aplikacja została napisana w środowisku Matlab w wersji 7.4 . Okno z wynikiem działania programu zostało przedstawione poniżej.
Program wywołuje się wpisując w linii komend wpisując "rysunek" i naciskając enter:
Program napisany w Matlabie Po wpisaniu nazwy pliku do analizy zostaje wyświetlone okno z wynikiem:
Program napisany w Matlabie

Przeprowadzone eksperymenty.

Z uwagi na to, że problem został rozwiązany metodami geometrycznymi nie potrzeba było dużej ilości danych testowych.
Program był testowany 50 obrazami wejściowymi. Obrazy te były różnorodne(np przykłady na kartce w kratkę, różne kolory liter, dane pisane długopisem, mazakiem, dane o różnych kontrastach itp...) Podczas procesu tworzenia aplikacji użyto 40 obrazów do kontroli postępu prac. Natomiast pozostałe 10 obrazów zostało sprawdzonych po napisaniu programu jako dane testujące program.

Wyniki badań:

Wszystkie próbki zostały rozdzielone poprawnie na cyfry, mimo tego wystąpiły problemy z liczbami nachodzącymi na siebie i zbyt podobnymi do podłoża. Wynik dla prawidłowego podziału:
Przykład 1 Uwagi z przeprowadzonych testów:

Wnioski:

Bibliografia:

Valid HTML 4.01 Transitional