Rozpoznawanie numeru rachunku
z druczku przelewu.


Autorzy: Natalia Nowak, Jakub Gruszka
Raport z projektu: Metody i algorytmy sztucznej inteligencji, ARE3513
Prowadzący: dr inż. Witold Paluszyński
Data: 4 czerwca 2008r.

Prezentacja problemu.

Celem zadania jest opracowanie algorytmu rozpoznającego numer konta bankowego pobranego z druku przelewu/wpłaty. Rozpoznawanie pisma ręcznego jest zagadnieniem bardzo skomplikowanym i możemy je podzielić na następujące etapy: Przykład przelewu

Metody rozwiązania problemu.

Analiza problemu.

W znalezionych przez nas materiałach było bardzo dużo informacji na temat rozpoznawania pisma maszynowego, natomiast algorytmów rozpoznawania pisma ręcznego było niewiele. Jedna z nich proponuje podzielenie cyfry na obszar o wymiarach 5x5. Jednak zaprezentowany algorytm służy do rozpoznawania liter arabskich. W przypadku cyfr arabskich założyliśmy, że lepsze jest podzielenie cyfry na obszar o wymiarach 7x5 (cyfry są zazwyczaj wyższe niż szersze). Co do metod selekcji pojedynczych cyfr nie znaleźliśmy dobrych algorytmów. Z tego powodu zdecydowaliśmy się na opracowanie własnej metody rozwiązującej problem wyodrębniania cyfr z ciągu.

Wycięcie numeru konta z druku przelewu.

Nowoczesne skanery mają możliwość automatycznego przycinania skanowanego obrazu. Dlatego założyliśmy, iż cały obraz będzie zawierał już wykadrowany druk wpłaty. Ułatwiło to znacznie implementację programu. Pozostał jednak problem jak dobrać "ramkę", która wytnie tylko numer konta. Został on wyznaczony empirycznie jako prostokąt:

[obraz_p.getWidth()/10, obraz_p.getHeight()*10/51, obraz_p.getWidth()*100/118, obraz_p.getHeight()/14]

Zmiana obrazu na skalę szarości.

W celu poprawnej identyfikacji cyfr musimy je najpierw oddzielić od tła. Druki przelewów mają czerwony kolor tła. Fakt ten został wykorzystany do zamiany pikseli na kolor biały, jeśli na obrazie dominował kolor czerwony za pomocą formuły: R>B*1.4+1, gdzie R - wartość obrazu na kanale czerwonym, B - wartość na kanale niebieskim.
Na samym początku prowadzone zostały także symulacje nad możliwością rozpoznawania cyfr pisanych niebieskim oraz czarnym tuszem. Problemy związane z brakiem powtarzalności kolorów zdjęć robionych aparatem cyfrowym (nie posiadamy skanera) uniemożliwiły dobrą selekcję cyfr niebieskich z czerwonego tła. Nasz program rozpoznaje numer rachunku pisany czarnym atramentem.
Jeśli suma R+G+B < 220, to obraz jest uznawany za czarny (wstawiana jest wartość 0), jeśli jest R+G+B > 550, wtedy piksel jest klasyfikowany jako biały (tło). Obraz następnie poddawany jest przetwarzaniu za pomocą filtru medianowego, minimalnego oraz maksymalnego. Ma to na celu usunięcie pojedynczych punktów, które zostały sklasyfikowane jako cyfra (kolor czarny). Przykład wyselekcjonowanego numeru rachunku

Selekcja pojedynczych cyfr numeru konta bankowego.

Mając już obraz w skali szarości możemy przystąpić do rozdzielenia poszczególnych cyfr. Algorytm zawiera następujące funkcje: Algorytm działa w następujący sposób:
- najpierw wykonywana jest funkcja idzWprawo, która znajduje nam lewy kraniec pierwszej cyfry,
- następnie wykonywana jest punkcja idzWzdluzCyfry, która znajduje nam prawy kraniec cyfry,
- później następuje wycięcie danej cyfry i zapisanie jej do oddzielnego pliku w katalogu o nazwie wyniki,
- algorytm ten powtarzany jest w pętli 26 razy za każdym razem przypisując do indeksu początkowego wartość indeksu końcowego + 2.
Należało także rozbudować ten algorytm, gdyż zachodziła czasami sytuacja taka, że cyfry nachodziły na siebie (zwłaszcza długi daszek cyfry 5). Dodaliśmy dodatkowe założenie polegające na sprawdzeniu, czy szerokość cyfry jest większa od wysokości. Jeśli tak, to obraz jest dzielony na pół.
Przykład wyselekcjonowanej cyfry

Wydobycie cech z obrazu.

W naszym projekcie wykorzystaliśmy metodę wydobycia cech obrazu pisma ręcznego zaproponowaną przez dr inż. Mirosława Gajera z Katedry Automatyki AGH. Proces ekstrakcji cech obrazu polega na tym, że prostokąt (obraz), w który wpisany został obraz znaku, zostaje podzielony na np. 35 prostokątnych sektorów o identycznych wymiarach. W zależności od kształtu rozpoznawanego znaku pisma, w pewnych sektorach pikseli czarnych będzie stosunkowo dużo, a w innych sektorach będzie ich mniej, bądź mogą nie występować tam wcale. Wartość pojedynczego sektora jest normowana od 0 do 1 (w celu uniezależnienia wartości cech od wielkości obrazu). Przykładowy efekt pokazany jest na rysunku poniżej.
Przykład wydobycia cechy z litery C

Klasyfikacja danego obrazu.

Program zawiera bazę już rozpoznanych (nauczonych) cyfr. Za jej pomocą można starać się sklasyfikować nowy obraz. Służy do tego celu wskaźnik Q definiowany następująco:
Kryterium jakości
gdzie:
j - ilość wzorców w bazie,
cyfra_do_rozpoznania(i) - i-ta cecha cyfry, która jest rozpoznawana. Tak znaleziony wskaźnik jest podstawą do rozpoznawania cyfr. Rozwiązaniem jest cyfra, która najmniej różni się od wzorca.

Implementacji programowa.

Program do wydobywania cyfr został napisany w Javie z wykorzystaniem pakietu graficznego imageJ. Klasyfikator został napisany w Matlabie 7.0. Okno klasyfikatora zostało pokazane poniżej.
Program napisany w Matlabie

Przeprowadzone eksperymenty.

Najpierw trzeba było stworzyć bazę wzorcowych cyfr. Baza zawiera ok. 500 cyfr i ich cech. Później przeprowadziliśmy eksperymenty na ok. 30 druczkach.

Wyniki badań:

Cyfry 0 1 2 3 4 5 6 7 8 9
Liczba błędnych
rozpoznań
8 5 9 11 2 9 12 1 9 14
Liczba błędnych
rozpoznań [%]
7 6 9 10 5 22 30 3 23 28

Wnioski:

Bibliografia:

Valid HTML 4.01 Transitional