Признаки, извлеченные из неизвестного символа, определяются тремя направлениями (xposition, yposition, angle), с 50-100 признаками на символ, а признак прототипа определяется 4-мя направлениями (xposition, yposition, angle, length), с 10-20 свойствами на конфигурацию прототипа.
Классификация проводится в два шага. На первом, создается короткий список элементов класса, с которыми могут совпадать неизвестные. Каждый признак выбирается из битового вектора классов, которым этот признак может удовлетворять, и битовых векторов просуммированных по всем свойствам. Классы с большим количеством признаков становятся списком для следующего шага.
Каждый признак неизвестного элемента ищет битовые вектора прототипов выбранного класса, с которыми может совпадать, а затем высчитывается реальная похожесть данных. Каждый элемент прототипа класса символов представляет собой логическую сумму выражения продукта с конфигурацией, таким образом, сохраняется запись об уровне похожести данных каждого признака в каждой конфигурации, каждого прототипа. Наивысший уровень сходства, вычисленный из общего числа признаков, будет лучшим среди всех сохраненных конфигураций класса.
В виду того, что классификатор способен различать поврежденные символы, классификатор не был обучен с использованием искаженных символов. Для обучения применялось объединение 20 образцов по 94 символах одного размера в 8 различных шрифтах, но с 4 атрибутами (жирный, обычный, курсивный, жирный курсивный). Таким образом, было 60160 образцов для обучения. Разительное отличие от других классификаторов, таких как Calera, с более чем миллионом образцов и Baird - 100 шрифтовый классификатор с 1175000 элементами для обучения.
Tesseract обладает относительно малым языковым анализом. Всякий раз, когда модуль распознавания обрабатывает новую сегментацию, лингвистический модуль выбирает лучшее из доступных слов в каждой последующей категории: наиболее часто встречающееся слово, наиболее словарное слово, наиболее часто встречающаяся цифра, наиболее часто встречающееся слово в верхнем регистре и наиболее часто встречаемое слово в нижнем регистре. Классификатор выбирает из них слово максимально похожее на то, которое было подано на вход. Но финальное решение по выбранной сегментации - это слово с наименьшим дистанционным рейтингом, где каждая из представленных выше категорий домножена на различные константы.
Использование адаптивных классификаторов в OCR модулях приносит немалые плоды. Несмотря на то, что статичный классификатор хорошо подходит для обработки любого вида шрифта, его способность различать символы и не-символы не достаточно развита. Более чувствительные к шрифту классификаторы, обученные с использованием выходных данных статического классификатора обладают большей способностью к распознаванию символов в документах, где число шрифтов лимитировано.
Tesseract не использует шаблонный классификатор, но использует те же функции, что
и статический классификатор. Единственное значительное отличие между статичным
и адаптивными классификаторами, если забыть об обученных данных, это то, что
адаптивный классификатор использует нормализацию по базовым линиям.Нормализация
по базовым линиям упрощает обнаружение символов верхнего и нижнего регистров, а
также повышает стойкость к шумам. Основное преимущество нормализации - удаление
зависимости от шрифтов, и от ширины символа для данного шрифта. Следующая
фигура демонстрирует пример форму трех символов в нормализации по базовой
линии, и форму нормализации по моменту.
Рис. 13. Слово в базовых линия, и нормализованные по моменту буквы
1.7 Фильтр Гаусса (gaussianblurring)
Размытие является неотъемлемой частью различных техник коррекции изображения, направленных на устранение специфических дефектов (излишняя детализация, дефекты сканирования, пыль, и т.д). Одним из их возможных применений является шумоподавление, т.е. задача восстановления исходного изображения, к пикселям которого добавлен случайный шум.
Размытие по гауссу - это характерный фильтр размытия изображения, который использует нормальное распределение (Гауссово распределение) для вычисления преобразования, применяемого к каждому пикселю изображения.
Шум в изображении меняется независимо от пикселя к пикселю и, при условии, что математическое ожидание значения шума равно нулю, шумы соседних пикселей будут компенсировать друг друга. Чем больше окно фильтрации, тем меньше будет усредненная интенсивность шума, однако при этом будет происходить и существенное размытие значащих деталей изображения.
Уравнение распределения Гаусса в N измерениях имеет вид:
,
Шумоподавление при помощи прямоугольного фильтра имеет существенный недостаток: пиксели на расстоянии «r» от обрабатываемого оказывают на результат тот же эффект, что и соседние.
Более эффективное шумоподавление можно, таким образом, осуществить, если влияние пикселей друг на друга будет уменьшаться с расстоянием (частный случай - для двух измерений):
,
где «r» - это радиус размытия, «r2» = «u2» + «v2» , «σ» - стандартное отклонение распределения Гаусса. В случае двух измерений - эта формула задает поверхность, имеющей вид концентрических окружностей с распределением Гаусса от центральной точки. Пиксели, где распределение отлично от нуля используются для построения матрицы свертки, которая применяется к исходному изображению. Значение каждого пикселя становится средне взвешенным для окрестности. Исходное значение пикселя принимает наибольший вес (имеет наивысшее Гауссово значение), и соседние пиксели принимают меньшие веса, в зависимости от расстояния до них. В теории, распределение в каждой точке изображения будет ненулевым, что потребовало бы вычисление весовых коэффициентов для каждого пикселя изображения. Но, на практике, когда рассчитывается дискретное приближение функции Гаусса, не учитывают пиксели на расстоянии свыше 3σ, т.к. они достаточно малы. Таким образом, программе, фильтрующей изображение, достаточно рассчитать матрицу d6σe×d6σe, чтобы гарантировать достаточную точность приближения распределения Гаусса.
Для применения данного фильтра используется свертка по функции:
Параметр σ задает степень размытия. На графике функция с σ
= 5
Рис. 13
Результаты свертки по функции Гаусса и по константной функции
(усреднения).
Рис. 14
Фильтр Гаусса хорошо подходит для ситуации, когда зашумленное изображение
имеет большое количество деталей, т.к данный фильтр меньше размывает детали
малого размера и весьма достойно убирает зашумление.
1.8 Алгоритм Канни
Канни изучил математическую проблему получения фильтра, оптимального по критериям выделения, локализации и минимизации нескольких откликов одного края. Это означает, что детектор должен реагировать на границы, но при этом игнорировать ложные, точно определять линию границы (без её фрагментирования) и реагировать на каждую границу один раз, что позволяет избежать восприятия широких полос изменения яркости как совокупности границ. Канни ввел понятие Non-MaximumSuppression (подавление не-максимумов), которое означает, что пикселями границ объявляются точки, в которых достигается локальный максимум градиента в направлении вектора градиента.
Для определения граней необходимо сперва воспользоваться фильтром описанным выше(5х5), так как шум может быть принят за грань изображения.
Для вычисления приближенного значение градиента яркости изображения применяется оператор Собеля. Результатом его применения в каждой точке изображения будет либо вектор градиента яркости в этой точке, либо его норма. Сглаженное изображение фильтруется с помощью матрицы Собеля по горизонтальному и вертикальному направлениям, чтобы получить первые производные в горизонтальном и вертикальном направлениях.
Вектор градиента, всегда перпендикулярен к граням.
После получения градиента и направления, необходимо удалить с изображения все пиксели, которые не являются гранями. Для этого каждый пиксель проверяется на принадлежность к локальному максимуму в своей окрестности по направлению градиента (рис. 15). Пикселями границ объявляются пиксели, в которых достигается локальный максимум градиента в направлении вектора градиента.
Рис. 15
Точка «А» - грань (вертикальное направление). Направление градиента - нормаль для этой грани. Точки «В» и «С» лежат на векторе градиента. Поэтому т. «А» сравнивается с ними, чтобы проверить, является ли она локальным максимумом. Если да, то переходят к следующей стадии, иначе она обнуляется.
Далее, необходимо проверить: находится или нет граница в данной точке(применяя порог). Чем меньше порог, тем больше границ будет находиться, но тем более восприимчивым к шуму станет результат, выделяя лишние данные изображения. Наоборот, высокий порог может проигнорировать слабые края или получить границу фрагментами. Для этого необходимы два порога «max_Val» и «min_Val» - верхний и нижний. В программных реализациях данного алгоритма эти пороги задаются самостоятельно. Один из возможных вариантов задания этих порогов - это принять их равными :
_Val = 0.66*[среднее значение],
max_Val = 1.33*[среднее значение],
где «cреднее значение» - это усредненная величина интенсивности пикселей для вашего изображения в «оттенках серого».
Любая грань с интенсивностью большей «max_Val» -
точно грань, меньшие нижнего порога - нет. Грани, интенсивности которых, лежат
между этими порогами, классифицируются в зависимости от принадлежности к
пикселю уже отобранной грани.
Рис. 16. Верхний и нижний пороги интенсивности
Рис. 16а. Верхний и нижний пороги интенсивности
Грань «А» выше «max_Val» - она точно является гранью. Грань
«C» ниже максимума, но соединена с
гранью «А», поэтому тоже является гранью - мы получили полную кривую. Грань «В»
же лежит ниже максимума, но не соединена ни с гранью «А», ни с гранью «C», поэтому она не является гранью.
Для получения корректного результата, весьма важно, правильно выбрать эти
пороги. На этой стадии, также удаляются шумы на краях граней
Рис. 17. Пример обработки изображания алгоритмом Канни
Глава 2. Описание разработанной системы
В данной главе описан прототип системы, которая была разработана в рамках
данного выпускного проекта. Здесь содержится описание как алгоритма работы
приложения, так и общая информация о возможностях прототипа и результаты его
тестирования.
2.1 Общее описание приложения и принципа его
работы
Разработанный в рамках данной работы прототип реализован в виде приложения, написанного под платформу Windows. Приложение позволяет распознавать данные с изображений паспортов. Со сканера поступает изображение паспорта сотрудника. При этом оно загрязнено невидимыми символами (в случае паспорта Российской Федерации - гербами) или иметь дефекты. Расположение интересующих нас данных:
· Номер
· Ф.И.О.
· Дата и место рождения
· Пол
· Дата регистрации
Заранее определено, где расположены интересующие нас области, т.к. имеется единый образец данного документа. Изображение паспорта расположено ровно, но возможны некоторые отклонения, в зависимости от положения документа во время сканирования. Данное приложениесчитывания данных состоит из следующих программных модулей:
· Пользовательский интерфейс
· Модуль ротации изображения;
· Модуль локализации данных
· Модуль распознавания;
· Внешняя база данных
Отсканированное изображение паспорта выбирается через UI непосредственно и подается на вход алгоритма для устранения дефектов сканирования и ротации изображения. После этого рабочее изображение поступает для локализации данных. И только после того, когда было установлено местоположение интересующей нас информации, текст распознается модулем распознавания символов. Далее следуют алгоритмы постобработки текста, основанный на словарном контроле результатов.
Для решения задачи распознавания образов предлагаю использовать OCR модуль для Python: Tesseract.Python-tesseract это обертка для Tesseract-OCR выкупленного Google. Данный модуль может принимать на вход все типы изображений поддерживаемые PythonImagingLibrary, включая jpeg, png, bmp, tiff. В то время как tesseract-OCR по умолчанию поддерживает только tiff и bmp.
Данная программа работает с изображением скана паспорта (см. рис. 10)
Рис.18. Исходное изображение
Первым делом производится ротация и предварительная обработка изображения скана паспорта, на основе представлений о виде изображения в стандартном виде: на всю рабочую область, без наклона. Для этого производятся следующие манипуляции над исходным изображением:
. Переводим изображение в оттенки серого
Рис. 19. Изображение в оттенках серого
. Сглаживаем шум на границах при помощи фильтра Гаусса
. Находим границы изображения при помощи алгоритма Канни
Рис. 20. Результат работы алгоритма Канни
. Бинаризация изображения
. Находятся все необходимые линии(как на самом изображении паспорта, так и на границах: изображение подложка)
Рис. 21. Результат обнаружения линий на изображении
. Находим углы для всех линий
. Кластеризируем углы по двум центрам
. Выбираем кластер с большим количеством элементов
. Находим угол для ротации (подразумеваем, что изображение обладало отклонением от 0 до 90 градусов)
. После предыдущего пункта могут появиться неотфильтрованные области (не содержащие изображения паспорта) - отрезаем их
. Получаем финальное изображение
Рис. 22. Финальное изображение
.5.1 Выделение границ нахождения данных
Так как расположение данных в паспорте заранее определено, и для всех образцов одинаково - получаем области, содержащие только нужную информацию.
Обнаружение зон интересующей информации:
. Бинаризация изображения[5]
Рис. 23. Бинаризация изображения
. Обнаружение контуров в бинаризованном изображении, и получение
контуров ограниченных областей
Рис. 24 Получение контуров
. Сортировка областей интереса (предполагаемое место нахождения
информации) в паспорте