Распознавание цифры по 4 точкам

в 17:31, , рубрики: Песочница, Программирование, разработка, распознавание цифр, метки:

Хочу поделиться, как я реализовал распознавание цифр без использования OCR библиотек на Delphi. Нужно было быстро и точно вытащить число из прямоугольника, размером 70 на 10 пикселей.

Пример исходного изображения в приближении 1600%

Первый шаг — преобразование исходной картинки в черно-белое.
Пробегался по каждому пикселю и сравнивал его цвет с «эталоном», если больше то преобразуем в белый, иначе в черный.

Таким образом, руками выделил шаблоны (образцы) всех цифр. Каждая цифра имеет размер 7 на 10 пикселей.

Далее разобъем каждую цифру на последовательность из нулей и единиц. Где 0 — белый цвет, 1 — черный. Например, для нуля

Таким образом, двигаясь слева направо сверху вниз получаем последовательность для каждой цифры:
0: '0011100011011011000111100011110001111000111100011110001111101100111100'
1: '0011000111100000110000011000001100000110000011000001100000110001111110'
2: '0111100111111000001100000110000011000011000011000011000011111101111111'
3: '0111100110111000001100000110011110001111100000110000011100001101111110'
4: '0000110000111000111100110110010011011001101111111111111100001100000110'
5: '1111100111110010000001000000111100000111000001110000111000011001111000'
6: '0011110011111011000001100000111111011101111100011110001111101110111110'
7: '1111110111111000001100001100000100000110000110000011000011100001100000'
8: '0011100011011011000110110110011110001111101100111110001111100110111110'
9: '0011100111111011000111100011110001111111110011011000011100001101111100'

По 4 точкам можно распознать до 24=16 уникальных значений, нам достаточно десяти.

Посчитаем количество возможных сочетаний четырех цифр из 70:
Ckn=n!/(k!*(n-k)!)=70!/(4!*66!)=70*69*68*67/4!=916895 сочетаний.

Нам нужны те сочетания, которые у всех цифр (от 0 до 9) будут различны (чтобы однозначно идентифицировать каждую цифру).

Перебором нашел следующие точки: (8,20,57,69)

Их координаты:

Теперь нам известны 4 точки по которым мы сможем однозначно определить цифру и сочетания для каждой цифры:
.

Всё. Теперь исходную картинку обрабатывал следующим образом: слева и справа находил значимые пиксели (черные), обрезал белые концы. Оставшуюся картинку делил на блоки по 7 на 10 пикселей. А в этих блоках сравнивал сочетания в 4 точках.

Буду рад, если кому-нибудь пригодиться.

Автор: coalesce

Источник: http://habrahabr.ru/post/148319/

* - обязательные к заполнению поля