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