Заметьте, что я действительно ищу ответ на свой вопрос. Я не ищет ссылку на какой-то исходный код или на какой-то академический документ: я уже использовал источник, и я уже читал документы и до сих пор не понял последнюю часть этого вопрос...
Я работаю над быстрым шрифтом OCR, и я очень хорошо продвигаюсь.
Я уже нахожу базовые линии, разделяя символы, преобразуя каждый символ в черно-белый, а затем контурируя каждый символ, чтобы применить к нему код цепи Freeman.
В основном это 8-связный код цепи выглядит следующим образом:
3 2 1
\ | /
4-- --0
/ | \
5 6 7
Итак, если у меня есть "a", после всех моих преобразований (включая преобразование в черно-белый), я получаю что-то вроде этого:
11110
00001
01111
10001
10001
01110
Тогда внешний граф может выглядеть так (я могу ошибаться здесь, что контур ASCII-art и мой "алгоритм" могут получить контур неправильно, но это не вопрос моего вопроса):
XXXX
X1111X
XXXX1X
X01111X
X10001X
X10001X
X111X
XXX
Следуя Xs, я получаю код цепи, который будет:
0011222334445656677
Обратите внимание, что нормализованный код цепи, но вы всегда можете нормализовать код цепи следующим образом: вы просто сохраняете наименьшее целое число.
(Кстати, есть суперэффективная реализация, чтобы найти код цепи, где вы просто берете 8 соседних пикселей "X", а затем смотрите в 256 таблице поиска, если у вас есть 0,1,2,3, 4,5,6 или 7).
Теперь мой вопрос: из этого кода 0011222334445656677, как найти, что у меня есть 'a'?
Потому что, например, если мой 'a' выглядит так:
11110
00001
01111
10001
10001
01111 <-- This pixel is now full
Тогда мой код цепи теперь: 0002222334445656677
И все же это также "а".
Я знаю, что вся суть этого кода цепи должна быть устойчивой к таким крошечным изменениям, но я не могу понять, как я должен найти, какой символ соответствует одному цепочному коду.
Я был так далеко, и теперь я застрял...
(Кстати, мне не нужна 100% -ная эффективность, и такие вещи, как дифференцирование "0" с "O" или "o", на самом деле не проблема)