Наткнулся я как-то на один алгоритм, вот статья - An expert system for general symbol recognition. Зацепило что идея простая и, казалось бы, рабочая. Вот простой пример работы - имеем уже подверженный максимальному утончению символу, где 1-чёрный пиксель, 0-белый(фон) -
100000001
100000010
010000100
001000100
000101000
000010000
100|000|001
100|000|010
010|000|100
---|---|---
001|000|100
000|101|000
000|010|000
1..|...|..1
1..|...|.1.
.1.|...|1..
---|---|---
..1|...|1..
...|1.1|...
...|.1.|...
\..|...|../
.\.|...|./.
..\|...|/..
---|---|---
...|...|...
...|___|...
...|...|...
Но не очень понятно что делать с граничными пикселями и возможным сдвигом символов по зонам. К примеру -
001|000|100
000|101|000
001|010|000
-----------
000|100|000
001|011|000
001|000|100
..1|...|1..
...|1.1|...
..1|.1.|...
-----------
...|1..|...
..1|.11|...
..1|...|1..
...|...|...
...|___|...
...|...|...
-----------
..I|\..|...
..I|.\.|...
..I|..\|...
Сверка с шаблоном происходит позонно. Для большей точности в статье предлагается разбивать символ на большее количество зон, но тогда два похожих символа, отличающихся сдвигом на 1 пиксель вправо, к примеру, могут попасть в разные зоны и шаблоны будут совершенно не похожи. Вся аппроксимация коту под хвост.
Меня подкупила простота этого алгоритма и мне интересно, насколько он реально работает, как решаются описанные проблемы, применялся ли он где-нибудь реально и может кто-то слышал о нём? Я написал его реализацию и получил довольно плачевные результаты, распознаётся примерно 70% верно и 10% с ошибкой, примерно, на игрушечных примерах.