Обратите внимание, что я действительно ищу ответ на мой вопрос. Я не ищу ссылку на некоторый исходный код или на какую-либо академическую статью: я уже использовал источник, и я уже читал статьи и до сих пор не выяснил последнюю часть этого выпуска ...
Я работаю над быстрым распознаванием шрифтов на экране и добился очень хороших результатов.
Я уже нахожу базовые линии, разделяя символы, преобразуя каждый символ в черно-белое и затем очерчивая каждый символ, чтобы применить к нему код цепочки Фримена.
В основном это 8-связанный код цепочки, который выглядит примерно так:
3 2 1
\ | /
4-- --0
/ | \
5 6 7
Так что, если у меня есть «а», после всех моих преобразований (включая преобразование в черно-белое), я получаю что-то вроде этого:
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, как мне найти, что у меня есть «а»?
Потому что, например, если мое 'a' выглядит так:
11110
00001
01111
10001
10001
01111 <-- This pixel is now full
Тогда мой код цепи теперь: 0002222334445656677
И все же это тоже «а».
Я знаю, что весь смысл этого цепочечного кода заключается в том, чтобы быть устойчивым к таким крошечным изменениям, но я не могу понять, как я должен найти, какой символ соответствует одному цепочечному коду.
Я был так далеко, и теперь я застрял ...
(Кстати, мне не нужна 100% эффективность, и такие вещи, как дифференцирование «0» от «O» или «o», на самом деле не проблема)