Наткнулся я как-то на один алгоритм, вот статья - An expert system for general symbol recognition. Зацепило что идея простая и, казалось бы, рабочая. Вот простой пример работы -
имеем уже подверженный максимальному утончению символу, где 1-чёрный пиксель, 0-белый(фон) -
100000001
100000010
010000100
001000100
000101000
000010000
разбиваем его на m x n зон -
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.|...
и аппроксимируем последовательность единиц в каждой зоне в прямые линии -
\..|...|../
.\.|...|./.
..\|...|/..
---|---|---
...|...|...
...|___|...
...|...|...
Получилось 3 линии в 3 зонах. Пусть это шаблон. Если на входе будет похожий символ, в котором несколько пикселей будут отличаться, то он, возможно, аппроксимируется в идентичный шаблон и распознается на 100%. На примерах линии строятся максимум из 3 пикселей, что не даёт должной аппроксимации, но на реальных примерах количество пикселей больше и там это работает, по идее.
Но не очень понятно что делать с граничными пикселями и возможным сдвигом символов по зонам. К примеру -
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% с ошибкой, примерно, на игрушечных примерах.