139
10.2. Kody łańcuchowe Freemana
(5) 6(5,0) = 5,, «(54,2) = Ss,
6(5,,0) = 52i 6(55,3) = 56i
6(52,0) = 53, <5(56,4) = 57,
6(53,0) = 54, 6(57,5) = 5s,
6(54,$) = /, 6(58,6) = 59,
6(59,$) = P,
6(59,3) = 5io, 6(57,4) = 5i2, 6(5io,3) = 5n, 6(5u,4) = 5i3, 6(S,,,$) = R, 6(5,3,5) = 5h, 6(5h, 6) = 5,5,
6(5,5,$) = D,
natomiast dla pozostałych argumentów funkcja 6 przyjmuje wartość err.
Dokonajmy rozpoznania litery D (opisanej przez ciąg 00002344456$) za pomocą zdefiniowanego automatu 21 (funkcja przejścia dla ciągu symboli została zdefiniowana w Dodatku 3).
6(5,00002344456$) = 6(6(5,0), 0002344456$) = 6(5,, 0002344456$) =
= 6(6(5,, 0), 002344456$) = 6(52,002344456$) = 6(6(52,0), 02344456$) = = 6(53,02344456$) = 6(6(53,0), 2344456$) = 6(54,2344456$) =
= 6(6(54,2), 344456$) = 6(55,344456$) = 6(6(55,3), 44456$) =
= 6(5«, 44456$) = 6(6(5S, 4), 4456$) = 6(57,4456$) = 6(6(57,4), 456$) = = 6(5,2,456$) = 6(6(5i2,4),56$) = 6(5,3,56$) = 6(6(5,3,5),6$) =
= 6(5,4,6$) = 6(6(5,4,6), $) = 6(5,s, $) = D.
Zakończymy ten podrozdział przedstawieniem głównego algorytmu tej metody. Algorytm zapiszemy w konwencji pascalopodobnej. Wprowadźmy w tym celu następujące elementy:
rec - rozpoznawany obraz (lub err, gdy brak decyzji), state - stan, w którym znajduje się automat,
finalstates - zmienna złożona typu zbiorowego (set), w której zapamiętane są nazwy stanów końcowych.
getchar(ch) - procedura pobiera z bufora wejściowego i podstawia pod zmienną ch kolejny znak kodu Freemana,
transfunc(state, ch) - funkcja, która na podstawie aktualnego stanu i pobranego znaku daje nazwę kolejnego stanu
procedurę FreemRec(var rec); begin
State := 5';