1 разработка модуля распознавания

advertisement
Содержание
Введение ................................................................................................................... 2
1 РАЗРАБОТКА МОДУЛЯ РАСПОЗНАВАНИЯ............................................ 4
1.1 Функциональное назначение модуля распознавания ............................ 4
1.2 Обзор основных существующих методов распознавания текста......... 5
1.3 Постановка целей и задач диссертации .................................................. 9
2 РЕАЛИЗАЦИЯ МОДУЛЯ РАСПОЗНАВАНИЯ ........................................ 11
2.1 Разработка алгоритма модуля распознавания текста ............................... 11
2.2 Обоснование выбора средств разработки ............................................. 13
2.3 Программная реализация предварительной обработки изображения 15
2.4 Программная реализация алгоритма выделения особых точек
изображения........................................................................................................ 20
2.5 Программная реализация алгоритма построения графа изображения
символа ................................................................................................................ 26
2.6 Программная реализация алгоритма распознавания текста .......... 29
3 АНАЛИЗ РАЗРАБОННОГО АЛГОРИТМА РАСПОЗНАВАНИЯ
ТЕКСТА ................................................................................................................. 34
3.1 Устойчивость алгоритма к появлению искаженных символов .......... 34
3.2 Устойчивость алгоритма к появлению разрывов в изображениях
символов.............................................................................................................. 35
3.3 Постановка задачи поиска наиболее похожей последовательности
символов среди эталонных значений ............................................................... 37
4 РЕШЕНИЕ ЗАДАЧИ ПОИСКА НАИБОЛЕЕ ПОХОЖЕЙ
ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ СРЕДИ ЗАДАННЫХ ЭТАЛОНОВ
39
4.1 Алгоритм поиска похожей последовательности среди
последовательностей одинаковой длинны ...................................................... 39
4.2 Алгоритм поиска похожей последовательности среди
последовательностей различной длины .......................................................... 40
5 ПРАКТИЧЕСКАЯ АПРОБАЦИЯ МОДУЛЯ РАСПОЗНАВАНИЯ
ТЕКСТА И АНАЛИЗ РЕЗУЛЬТАТОВ ЕГО РАБОТЫ ..................................... 44
5.1 Программа испытаний алгоритма распознавания текста.................... 44
5.2 Результаты испытаний модуля............................................................... 44
Заключение ............................................................................................................ 46
Список использованных источников .................................................................. 47
Введение
В наше время перемещение людей в рамках разных государств значительно возросло благодаря бурному развитию средств транспортных сообщений. Как результат, таможенные и пограничные службы столкнулись с
проблемой обслуживания большого потока людей, транспортных средств и
т.д., пересекающих границу государства.
Одним из составляющих элементов процесса взаимодействия с иностранными гражданами, въезжающими на территорию Республики Беларусь,
является оформление соответствующих документов в белорусских посольствах, расположенных в различных точках планеты. Важной составляющей
данного пакета документов являются документы для оформления въездной
визы.
В Министерстве Иностранных Дел Республики Беларусь было разработано автоматизированное рабочее место для сотрудников, занимающихся
принятием документов от граждан и оформлением заявки на выдачу визы.
Изначально данное рабочее место подразумевало ручной ввод данных, содержащихся в документах, с последующим импортом их в хранилище заявок.
Для автоматизации процесса обработки документов было предложено использовать механизм распознавания данных с бумажных носителей с последующим их импортом в форму подачи заявки.
Целью дипломного проекта является создания модуля распознавания
текста, который должен повысить эффективность работы сотрудников Министерства Иностранных Дел Республики Беларусь при обработке документов для подачи заявки на выдачу въездной визы. Разрабатываемый модуль
должен автоматизировать процесс ввода данных в соответствующую форму.
Для достижения установленной цели были поставлены и решены следующие задачи:
1) освоение принципов работы со средой Lotus Notes;
2) освоение платформы для создания программного обеспечения
Microsoft .NET Framework;
3) реализация взаимодействия приложения, написанного на основе технологии Microsoft .NET Framework, с объектами среды Lotus Notes;
4) реализация технологии предобработки изображений – так
называемой, скелетизации изображения;
2
5) осуществление комплексного анализа существующих методов
распознавания текста;
6) разработка и реализация собственного метода распознавания
искаженных символов;
Практическая значимость полученных результатов
Разработанное на базе созданного модуля распознавания текста приложение позволяет повысить скорость обслуживания клиентов, подающих
документы на получение въездной визы.
Апробация результатов дипломного проекта
Результаты работы, проделанной во время подготовки дипломного
проекта, докладывались и обсуждались на 43-й научной конференции аспирантов, магистрантов и студентов БГУИР (апрель 2008 г.).
3
1
1.1
РАЗРАБОТКА МОДУЛЯ РАСПОЗНАВАНИЯ
Функциональное назначение модуля распознавания
Одним из документов, принимаемых от иностранных граждан, является паспорт. Данные из паспорта необходимо перенести в специальную
форму программного комплекса, представляющего собой автоматизированное рабочее место сотрудника. Для внесения в заявку необходимы следующие данные из паспорта:
1. Фотография;
2. Национальность – кодируется тремя латинскими буквами;
3. Фамилия;
4. Имя;
5. Серия и номер паспорта;
6. Дата рождения;
7. Пол – кодируется символами «M» и «F»;
8. Срок действия паспорта;
9. Личный номер.
Перечисленный набор данных записывается в специальную область
паспорта – машиночитаемую строку, находящуюся на странице паспорта с
фотографией. Следовательно, для обработки паспорта достаточно использовать планшетный сканер для сканирования лишь области паспорта с машиночитаемой строкой. Полученный после этапа сканирования образ необходимо передать на вход разработанному модулю распознавания для преобразования к текстовому виду.
Алгоритм, который используется в модуле, разработан специально
для работы с трудно распознаваемыми символами, которые могут появиться
в результате неправильной настройки процесса сканирования, либо плохого
качества самого сканируемого документа.
На вход алгоритма подается изображение одиночного символа. В результате работы алгоритма производится преобразование изображения символа в его текстовое представление.
4
1.2 Обзор основных существующих методов распознавания текста
В настоящее время разработано и реализовано очень большое количество алгоритмов распознавания текста. Точность распознавания достигает
99%. Однако до сих пор существует проблема с обработкой рукописного текста. Достаточно хорошо развиты системы распознавания, используемые в
карманных персональных компьютерах. Однако они работают только с текстом, который создается непосредственно в момент работы алгоритма. Такие
алгоритмы основаны на анализе траектории движения пера.
Рассмотрим основные подходы к проблеме распознавания текста.
Любой печатный текст имеет первичное свойство - шрифты, которыми он напечатан. С этой точки зрения существуют два класса алгоритмов
распознавания печатных символов: шрифтовой и безшрифтовый.
Шрифтовые или шрифтозависимые алгоритмы используют априорную информацию о шрифте, которым напечатаны буквы. Это означает, что
программе оптического распознавания текста должна быть предъявлена
полноценная выборка текста, напечатанного данным шрифтом. Программа
измеряет и анализирует различные характеристики шрифта и заносит их в
свою базу эталонных характеристик. По окончании этого процесса шрифтовая программа оптического распознавания символов готова к распознаванию
данного конкретного шрифта. (В последнее время, задачи при решении которых требуется обучение стали ассоциироваться с применением нейронных
сетей, однако здесь развивается технология не использующая нейронные сети). Этот процесс условно можно назвать обучением программы. Далее обучение повторяется для некоторого множества шрифтов, которое зависит от
области применения программы.
К недостаткам данного подхода следует отнести следующие факторы:
Алгоритм должен заранее знать шрифт, который ему представляют
для распознавания, т.е. он должен хранить в базе различные характеристики
этого шрифта. Качество распознавания текста, напечатанного произвольным
шрифтом, будет прямо пропорционально корреляции характеристик этого
шрифта со шрифтами, имеющимися в базе данных программы. При существующем богатстве печатной продукции в процессе обучения невозможно
5
охватить все шрифты и их модификации. Другими словами, этот фактор
ограничивает универсальность таких алгоритмов.
Для работы программы распознавания необходим блок настройки на
конкретный шрифт. Очевидно, что этот блок будет вносить свою долю ошибок в интегральную оценку качества распознавания, либо функцию установки шрифта придется возложить на пользователя.
Программа, основанная на шрифтовом алгоритме распознавания символов, требует от пользователя специальных знаний о шрифтах вообще, об
их группах и отличиях друг от друга, шрифтах, которыми напечатан документ, пользователя. Отметим, что в случае, если бумажный документ не создан самим пользователем, а пришел к нему извне, не существует регулярного способа узнать с использованием каких шрифтов этот документ был напечатан. Фактор необходимости специальных знаний сужает круг потенциальных пользователей и сдвигает его в сторону организаций, имеющих в штате
соответствующих специалистов.
С другой стороны, у шрифтового подхода имеется преимущество,
благодаря которому его активно используют и, по-видимому, будут использовать в будущем. А именно, имея детальную априорную информацию о
символах, можно построить весьма точные и надежные алгоритмы распознавания. Вообще, при построении шрифтового алгоритма распознавания
надежность распознавания символа является интуитивно ясной и математически точно выразимой величиной. Эта величина определяется как расстояние в каком-либо метрическом пространстве от эталонного символа, предъявленного программе в процессе обучения, до символа, который программа
пытается распознать.
Безшрифтовые или шрифтонезависимые - алгоритмы, не имеющие
априорных знаний о символах, поступающих к ним на вход. Эти алгоритмы
измеряют и анализируют различные характеристики (признаки), присущие
буквам как таковым безотносительно шрифта и абсолютного размера (кегля),
которым они напечатаны. В предельном случае для шрифтонезависимого алгоритма процесс обучения может отсутствовать. В этом случае характеристики символов измеряет, кодирует и помещает в базу данных программы
сам человек. Однако на практике, случаи, когда такой путь исчерпывающе
решает поставленную задачу, встречаются редко. Более общий путь создания
6
базы характеристик заключается в обучении программы на выборке реальных символов.
К недостаткам данного подхода можно отнести следующие факторы:
Реально достижимое качество распознавания ниже, чем у шрифтовых
алгоритмов. Это связано с тем, что уровень обобщения при измерениях характеристик символов гораздо более высокий, чем в случае шрифтозависимых алгоритмов. Фактически это означает, что различные допуски и огрубления при измерениях характеристик символов для работы безшрифтовых
алгоритмов могут быть в 2-20 раз больше по сравнению с шрифтовыми.
Следует считать большой удачей, если безшрифтовый алгоритм обладает адекватным и физически обоснованным, т.е. естественно проистекающим из основной процедуры алгоритма, коэффициентом надежности распознавания. Часто приходится мириться с тем, что оценка точности либо отсутствует, либо является искусственной. Под искусственной оценкой подразумевается то, что она существенно не совпадает с вероятностью правильного
распознавания, которую обеспечивает данный алгоритм.
Достоинства этого подхода тесно связаны с его недостатками. Основными достоинствами являются следующие:
Универсальность. Это означает с одной стороны применимость этого
подхода в случаях, когда потенциальное разнообразие символов, которые могут поступить на вход системы, велико. С другой стороны, за счет заложенной в них способности обобщать, такие алгоритмы могут устойчиво распознавать символы, по виду далекие от тех, которые присутствовали в обучающей выборке.
Технологичность. Процесс обучения шрифтонезависимых алгоритмов
обычно является более простым и интегрированным в том смысле, что обучающая выборка не фрагментирована на различные классы (по шрифтам,
кеглям и т.д.). При этом отсутствует необходимость поддерживать в базе характеристик различные условия совместного существования этих классов
(некоррелированность, не смешиваемость, систему уникального именования
и т.п.). Проявлением технологичности является также тот факт, что часто
удается создать почти полностью автоматизированные процедуры обучения.
Удобство в процессе использования программы. В случае, если программа построена на шрифтонезависимых алгоритмах, пользователь не обя7
зан знать что-либо о странице, которую он хочет ввести в компьютерную память и уведомлять об этих знаниях программу. Также упрощается пользовательский интерфейс программы за счет отсутствия набора опций и диалогов,
обслуживающих обучение и управление базой характеристик. В этом случае
процесс распознавания можно представлять пользователю как “черный
ящик” (при этом пользователь полностью лишен возможности управлять или
каким-либо образом модифицировать ход процесса распознавания). В итоге
это приводит к расширению круга потенциальных пользователей за счет
включения в него людей обладающих минимальной компьютерной грамотностью.
Искусственные нейронные сети достаточно широко используются при
распознавании символов. Алгоритмы, использующие нейронные сети для
распознавания символов, часто строятся следующим образом. Поступающее
на распознавание изображение символа (растр) приводится к некоторому
стандартному размеру. Как правило, используется растр размером 16х16
пикселов. Значения яркости в узлах нормализованного растра используются
в качестве входных параметров нейронной сети. Число выходных параметров
нейронной сети равняется числу распознаваемых символов. Результатом распознавания является символ, которому соответствует наибольшее из значений выходного вектора нейронной сети. Повышение надежности таких алгоритмов связано, как правило, либо с поиском более информативных входных
признаков, либо с усложнением структуры нейронной сети.
Шаблонные классификаторы преобразуют исходное изображение
символа в набор точек и затем накладывают его на шаблоны, имеющиеся в
базе системы. Шаблон, имеющий меньше всего отличий, и будет искомым. У
этих систем достаточно высокая точность распознавания дефектных символов (склеенных или разорванных). Недостаток - невозможность распознать
шрифт, хоть немного отличающийся от заложенного в систему (размером,
наклоном или начертанием).
Признаковые классификаторы по каждому символу вычисляют набор
чисел (признаков). И сравнивают эти наборы. Но так как набор признаков
никогда полностью не соответствует объекту, то заведомо часть информации
о символе будет теряться.
8
Структурные классификаторы хранят информацию о топологии символа. Например, буква "о" описывается как непрерывная кривая, не имеющая
пересечений. Этот способ тоже имеет свои недостатки: как только вы представите "разорванную" из-за дефектов печати букву "о", она уже не подойдет
под свое описание и может быть распознана как "с" или "п".
Структурно-пятенный эталон (ABBY) лишен недостатков, присущих
шаблонным и структурным системам (высокая чувствительность к начертаниям и дефектам символов), и объединяет их достоинства. В структурнопятенном эталоне изображение представляется в виде пятен, связанных парными отношениями. Наглядно это можно представить себе в виде теннисных
шаров, нанизанных на резиновый жгут. Шары могут сдвигаться относительно друг друга. Такую связку подвижных шаров можно "натянуть" на различные изображения одного символа, и система становится менее зависимой от
шрифтов и дефектов. Технология распознавания с помощью структурнопятенных эталонов получила название "фонтанное преобразование" (от английского font - шрифт).
1.3
Постановка целей и задач диссертации
Целью данной диссертации является разработка алгоритма распознавания текста, устойчивого к обработке искаженных символов.
Структуру реализуемого алгоритма можно представить в виде схемы,
представленной на рисунке 1.1
9
Начало
Подготовка изображения
к анализу
Определение особых
точек изображения
символа
Построение графа
символа по его особым
точкам
Поиск полученного
представления графа
среди эталонов
Конец
Рисунок 1.1 – Структура алгоритма распознавания
Исходя из структуры алгоритма, задачами диссертации являются:
- разработка алгоритма подготовки изображения к анализу;
- разработка алгоритма определения особых точек изображения;
- разработка алгоритма построения графа изображения по его особым
точкам;
- разработка алгоритма эффективного поиска представления текущего
символа по базе эталонов.
Для решения этих задач необходимо будет провести анализ существующих методов обработки изображений, выбрать технологию работы с
изображениями, ознакомиться с элементами теории графов, теории поиска.
10
2
РЕАЛИЗАЦИЯ МОДУЛЯ РАСПОЗНАВАНИЯ
2.1 Разработка алгоритма модуля распознавания текста
Для разработки эффективного метода распознавания необходимо провести анализ условий работы данного алгоритма. В зависимости от внешний
условий выбрать наиболее подходящие методы распознавания текста, возможно, каким-то образом скомпановать их.
Условия работы алгоритма:
1) Алгоритм будет работать с относительно небольшим количеством
символов;
2) Отсутствие априорной информации о распознаваемом тексте
(шрифт, размеры и т.д.).
Из первого условия можно сделать вывод о том, что в разрабатываемом алгоритме основное внимание следует уделить качеству распознавания,
а не скорости работы. Действительно, так как алгоритм будет обрабатывать
небольшие объемы данных, состоящих из поврежденных изображений, то
чтобы повысить качество распознавания, можно несколько поступиться скоростью работы.
Отсутствие априорной информации о распознаваемом тексте лишает
возможности использовать шрифтозависимые алгоритмы распознавания.
В результате анализа примеров изображений символов, которые должен будет обрабатывать алгоритм, а также анализа набора существующих
способов распознавания текста, было принято решение разработать алгоритм, основанный на структурном методе распознавания текста. Это должно
позволить повысить точность распознавания искаженных символов, которые
особенно часто возникают в результате неправильного положения документа
в сканере, а также из-за появления «мусора» на изображении.
Для структурного анализа символа решено использовать так называемые «особые» точки изображения: конечные точки, точки пересечения линий
и точки перегибов (рисунок 1.1).
11
Рисунок 1.1 – Особые точки изображения символа «Ю»
Координаты особых точек можно получить в результате анализа
изображения. Для этого его нужно представить в виде массива черных и белых точек и обработать этот массив с помощью специально разработанных
для этой цели методов.
Изображение символа можно представить как набор точек и линий,
их соединяющих. Несложно заметить, что если нарисовать на бумаге какойлибо граф, то он тоже будет состоять из точек (вершин) и линий (ребер) их
соединяющих. Как известно, граф можно представить в виде матрицы размера NxN, где N – количество вершин графа. Эта матрица состоит из нулей и
единиц: aij = 0 в случае, если между i-ой и j-ой вершинами графа не существует ребро, и аij = 1 в случае, если между i-ой и j-ой вершинами графа существует ребро.
Имея матрицу, представляющую изображение символа, и набор эталонов, можно производить сравнение полученного результата с эталоном и
формирование гипотезы о принадлежности распознаваемого изображения к
конкретному символу. Следует отметить, что для хранения информации об
эталонах распознаваемых символов решено использовать механизм баз данных. Это позволит снизить временные затраты на поиск и обновление эталонных данных. При инициализации модуля распознавания выполняется вы12
борка всех данных по эталонам и отображение их в памяти для последующей
работы модуля. Это значительно повысит скорость распознавания за счет
снижения времени на обращение к базе данных за эталонными значениями.
Чтобы упростить хранение, поиск и сравнение матриц, представляющих граф, решено использовать собственные числа матриц, записанные через
точку с запятой. Для поиска собственных чисел матрицы необходимо использовать численные методы решения данного типа задачи.
Заключительным этапом работы алгоритма распознавания будет поиск строки, соответствующей строке, полученной при распознавании текущего символа. В случае обнаружения соответствия возвращается результат –
текстовое представления символа. В обратном случае возвращается сообщение о том, что данный символ невозможно распознать.
Достоинством данного алгоритма является устойчивость к искажению
текста. Допускаются искажения как частей символа, так и повороты самого
символа. Это достигается за счет использования топологического описания
символа, а не его маски.
2.2 Обоснование выбора средств разработки
При разработке эффективного продукта необходимо учитывать такие
факторы, как соответствие продукта современным технологиям, хорошая
производительность, устойчивость к сбоям, защищенность от постороннего
доступа к важным данным. При этом на разработку продукта должно уходить
разумное количество времени.
Основой создания системы потокового ввода документов стала технология Microsoft .NET Framework. Выбор на эту технологию пал за счет следующих возможностей .NET:
1) Полные возможности взаимодействия с существующим кодом.
2) Полное и абсолютное межъязыковое взаимодействие (в .NET поддерживаются межъязыковое наследование, межъязыковая обработка исключений и межъязыковая отладка).
3) Общая среда выполнения для любых приложений .NET, вне зависимости оттого, на каких языках они были созданы. Один из важных момен13
тов при этом – то, что для всех языков используется один и тот же набор
встроенных типов данных.
4) Библиотека базовых классов, которая обеспечивает сокрытие всех
сложностей, связанных с непосредственным использованием вызовов API, и
предлагает целостную объектную модель для всех языков программирования, поддерживающих .NET.
5) Действительное упрощение процесса развертывания приложения. В
.NET нет необходимости регистрировать двойные типы в системном реестре.
Более того, .NET позволяет разным версиям одного и того же модуля DLL
бесконфликтно функционировать на одном компьютере. [2]
В качестве языка программирования был выбран язык C#, который
был разработан специально для платформы .NET Microsoft. С# – это язык
программирования, синтаксис которого очень похож на синтаксис Java (но не
идентичен ему). Синтаксические конструкции С# унаследованы не только от
C++, но и от Visual Basic. Например, в С#, как и в Visual Basic, используются
свойства классов. Как C++, С# позволяет производить перегрузку операторов
для созданных типов (Java не поддерживает ни ту, ни другую возможность).
С# – это фактически гибрид разных языков. При этом С# синтаксически не
менее (если не более) чист, чем Java, так же прост, как Visual Basic, и обладает практически той же мощью и гибкостью, что и C++.
Подводя итоги, еще раз выделим основные особенности С#.
1) Управление памятью производится автоматически.
2) В С# предусмотрены встроенные синтаксические конструкции для
работы с перечислениями, структурами и свойствами классов.
3) В С# осталась возможность перегружать операторы, унаследованные от C++. При этом значительная часть возникавших при этом сложностей
ликвидирована.
4) Предусмотрена полная поддержка использования программных интерфейсов.
5) Также
предусмотрена
полная
поддержка
аспектноориентированных программных технологий (таких как атрибуты). Это позволяет присваивать типам характеристики для описания в будущем поведения данной сущности.
14
Для разработки системы модуля распознавания текста использовалась
среда разработки MS Visual Studio .NET. Это обусловлено следующими факторами.
Во-первых, в Visual Studio .NET унифицирована IDE для большинства
языков, имеющихся в Visual Studio 6. Это дает возможность разработчикам
легко переходить с использования одного языка к другому. Разработчики,
использующие разные языки, в Visual Studio .NET могут работать гораздо согласованнее и эффективнее.
Во-вторых, все языки, поставляемые с Visual Studio .NET, могут работать с CLR. Причем Visual Basic .NET и Visual С# ориентированы только на
CLR. Visual C++ позволяет создавать как управляемый код для CLR, так и
неуправляемый код для Windows.
Visual Studio .NET обеспечивает редактирование и расширение, что
делает эту IDE первоклассным инструментом независимо от целевой платформы. Механизм макросов управляемого кода и IDE значительно упрощают
запись и выполнение макросов. Усовершенствованный API расширения открывает доступ к тем частям IDE, которые никогда не были доступны разработчикам, использующим Visual Studio [3].
2.3 Программная реализация предварительной обработки
изображения
Практически каждое изображение символа, поступающее на обработку модуля дополнительного распознавания, имеет толщину линий более одного пикселя. Для работы алгоритма выделения особых точек на изображении символа необходимо, чтобы толщина линий была один пиксель. В связи
с этим перед работой основной части алгоритма модуля необходимо провести предварительную обработку изображения: преобразование линий к линиям, имеющим толщину в один пиксель. Это позволяет произвести алгоритм
скелетизации изображений Зонга-Суня.
Для каждого очередного черного пикселя изображения анализируется
его 8-ми связная область (рисунок 2.1).,
15
Рисунок 2.1 – Восьмисвязная область для черного пикселя
Представим эту область в виде набора бинарных переменных Рi, где Рi
= 0 в случае, если соответствующий пиксель белого цвета и Рi = 1 в случае,
если соответствующий пиксель черного цвета (рисунок 2.2).
Рисунок 2.2 – Представление восьмисвязной области с помощью переменных
Алгоритм Зонга-Суня заключается в двух проходах по всем пикселям
изображения. Каждый проход состоит из двух подытераций.
Подытерация 1. Пиксель удаляется с изображения, если выполняются
следующие условия:
1) 2 ≤ B (P0) ≤ 6,
где B (Pi) =
8
P
i 1
(2.1)
i
2) A(P0) = 1, где А(Р0) – число конфигураций 01 в последовательности
Р1, Р2, Р3, Р4, Р5, Р6, Р7, Р8, замыкая эту цепочку на Р1, т.е. вокруг этого пикселя существует только один переход от 0 к 1.
3) Р2 × Р4 × Р6 = 0.
4) Р4 × Р6 × Р8 = 0.
Подытерация 2. Выполняется аналогично подытерации 1, только на
шагах 3 и 4 производится проверка следующих условий:
1) Р2 × Р4 × Р8 = 0.
16
2) Р2 × Р6 × Р8 = 0.
Таким образом, на подытерации 1 происходит удаление точек на юговосточной границе и северо-западных угловых точек. Подытерация 2 удаляет
точки на северо-западной границе, а также юго-восточные угловые точки.
При анализе работы алгоритма, было обнаружено, что в некоторых
случаях точка не удовлетворяет условиями подытераций 1 и 2, однако должна быть удалена. Для ликвидации этих недочетов в основной алгоритм ЗонгаСуня были внесены изменения в виде дополнительных проверок для удаления пикселя:
1) !P8 × P3 × P6 = 1
2) !P4 × P7 × P1 = 1
3) !P2 × P5 × P7 = 1
4) !P6 × P1 × P3 = 1,
где !P8- отрицание P8 [6].
Программный код, реализующий алгоритм Зонга-Суня выглядит следующим образом.
/// <summary>
/// Метод, реализующий алгоритм Зонга-Суня.
/// </summary>
private bool ZongSuhn()
{
bool check = true;
for (int povtor = 0; povtor < 2; povtor++)
{
for (int i = 0; i < _image.Width; i++)
{
for (int j = 0; j < _image.Height; j++)
{
if (IsBlack(_image.GetPixel(i, j)))
{
for (int m = 1; m < 4; m++)
{
for (int n = 1; n < 4; n++)
{
17
_matrix[m + (n - 1)*3 - 1] = IsBlack(_image.GetPixel(i + m - 2, j + n - 2)) ? 1 : 0;
}
}
bool C = ((_matrix[1]*_matrix[5]*_matrix[7] == 0) &&
(_matrix[3]*_matrix[5]*_matrix[7] == 0) && (povtor == 0));
bool D = ((_matrix[1]*_matrix[5]*_matrix[3] == 0) &&
(_matrix[7]*_matrix[3]*_matrix[1] == 0) && (povtor == 1));
if (InRange() && IsOneChange() && (C || D))
{
_result.SetPixel(i, j, Color.White);
check = false;
}
else
{
_result.SetPixel(i, j, Color.Black);
}
}
else
{
_result.SetPixel(i, j, Color.White);
}
}
}
if (!check)
{
_image = _result;
}
if (check)
{
for (int i = 0; i < _image.Width; i++)
{
for (int j = 0; j < _image.Height; j++)
{
if (IsBlack(_image.GetPixel(i, j)))
18
{
for (int m = 1; m < 4; m++)
{
for (int n = 1; n < 4; n++)
{
_matrix[m + (n - 1)*3 - 1] = IsBlack(_image.GetPixel(i + m - 2, j + n - 2)) ? 1 : 0;
}
}
if (((1 - _matrix[0])*_matrix[5]*_matrix[7] == 1) ||
((1 - _matrix[2])*_matrix[7]*_matrix[3] == 1) ||
((1 - _matrix[8])*_matrix[3]*_matrix[1] == 1) ||
((1 - _matrix[6])*_matrix[1]*_matrix[5] == 1))
{
_result.SetPixel(i, j, Color.White);
}
else
{
_result.SetPixel(i, j, Color.Black);
check = false;
}
}
}
}
}
}
return check;
}
19
2.4
Программная реализация алгоритма выделения особых точек изображения
Для выделения особых точек изображения используется попиксельный анализ изображения. Чтобы выполнить эту операцию, необходимо очередное изображение символа представить в виде массива пикселей.
Определение концевых точек изображения. Чтобы выделить концевые точки изображения необходимо выполнить следующие операции:
1) Для каждого очередного взятого черного пикселя берется 8 связных
с нем пикселей.
2) Если в массиве из 8 пикселей присутствует только один черный
пиксель, значит, найдена концевая точка.
List<Point> _endPoints = new List<Point>();
/* Попиксельный анализ изображения с символом */
for (int i = 0; i < _workBitmap.Width; i++)
{
for (int j = 0; j < _workBitmap.Height; j++)
{
/* Берем 8 окружных пикселей для текущих точек */
Color c = _workBitmap.GetPixel(i, j);
if ((c.R <= 250) && (c.G <= 250) && (c.B <= 250))
{
List<Color> col = new List<Color>();
col = PointUtils.GetConnectedPoints(this._workBitmap, new Point(i, j));
/* Считам количество черных пикселей из выбранных 8 */
int count = col.Count;
/* Если количество равно одинице, то найдена конечная точка */
if (count == 1)
{
Point _p = new Point(i, j);
_endPoints.Add(_p);
}
}
}
20
}
В результате работы цикла будет сформирован список типа
List<Point>, в котором будут хранится координаты концевых точек изображения.
Определение точек пересечений линий на изображении. Для выделения точек пересечения линий на изображении необходимо выполнить следующие операции:
1) Для каждого очередного взятого черного пикселя берется 8 связных
с ним пикселей.
2) Если в массиве из 8 пикселей присутствует 3 и более черных пикселей, то найдена точка пересечения.
List<Point> _intersectionPoints= new List<List>();
/* Попиксельный анализ изображения с символом */
for (int i = 0; i < _workBitmap.Width; i++)
{
for (int j = 0; j < _workBitmap.Height; j++)
{
/* Берем 8 окружных пикселей для текущих точек */
Color c = _workBitmap.GetPixel(i, j);
if ((c.R <= 250) && (c.G <= 250) && (c.B <= 250))
{
List<Color> col = new List<Color>();
col = PointUtils.GetConnectedPoints(this._workBitmap, new Point(i, j));
/* Считам количество черных пикселей из выбранных 8 */
int count = col.Count;
/* Если количество больше или равно 3, то найдена точка пересечения */
if (count >= 3)
{
Point _p = new Point(i, j);
_intersectionPoints.Add(_p);
}
}
}
}
21
После прохождения данным циклом по всему изображению будет
сформирован массив, содержащий координаты точек пересечений линий.
Определение точек перегибов линий на изображении. В алфавите
есть символы, при топологическом описании которых концевых точек и точек пересечения символов может быть недостаточно. Рассмотрим, например,
символ «Ю». Крайняя точка контура не будет являться ни концевой, ни точкой пересечения, однако она должна быть использована в структурном описании символа. Встает проблема выделения точек перегиба линий изображений. Это можно выполнить с помощью последовательности следующих операций:
1) Для очередного черного символа выделяется массив пикселей заданной ширины/высоты (рисунок 2.3).
Рисунок 2.3 – Выделение области массива точек для определения точки
перегиба
2) В данном массиве анализируется первая и последняя строка: если
первая строка состоит исключительно из белых символов, значит найдена
точка, подозрительная на верхнюю точку перегиба; если последняя строка
состоит исключительно из белых символов, значит найдена точка, подозрительная на нижнюю точку перегиба.
3) Анализируется вторая строка массива. Анализ начинается со второго пикселя. Как только очередной пиксель, координаты которого находятся
во второй строке массива, имеет белый цвет, получаем цвет пикселя точно
под ним. Если он оказался черным, значит найдена точка перегиба.
22
Аналогичным образом происходит поиск боковых точек перегиба.
/// <summary>
/// Метод определяет, имеется ли в указанном масиве точек особая точка
/// </summary>
/// <param name="ar">Массив точек для поиска</param>
/// <returns></returns>
private bool FindSpecialPoints(List<Color> ar)
{
if (ar.Count != 0)
{
int m1 = 0;
int m2 = 0;
/*проверяем, верхний и правый ряды.
* Если они белые, значит в данном изображении есть точка перегиба
*/
for (int i = 0; i < ar.Count/3; i++)
{
Color c = ar[i];
if ((c.R <= 250) && (c.G <= 250) && (c.B <= 250))
{
m1++;
break;
}
}
if (m1 > 0)
{
/* Проверяем нижний и левый ряды.
* Если они белые, значит в данном изображении есть точка перегиба */
for (int i = (2*ar.Count)/3; i < ar.Count; i++)
{
Color c = ar[i];
if ((c.R <= 250) && (c.G <= 250) && (c.B <= 250))
{
m2++;
23
break;
}
}
}
if ((m1 > 0) && (m2 > 0))
return false;
/* Если белые ряды были найдены, то удаляем их из массива точек.
* Далее следуем по линии перегиба до первого белого пикселя.
* Как только найден пиксель, то смотрим пиксель сразу под ним.
* Если нижний пиксель черный, то на линии есть точка перегиба.
*/
if (m1 == 0)
{
ar.RemoveRange(0, ar.Count/3);
int index1 = ar.Count/2;
Color c1 = ar[index1];
if ((c1.R <= 250) && (c1.G <= 250) && (c1.B <= 250))
{
for (int i = 1; i <= index1 - 1; i++)
{
Color c2 = ar[i];
if ((c2.R <= 250) && (c2.G <= 250) && (c2.B <= 250))
{
continue;
}
else
{
Color c3 = ar[i + index1];
if ((c3.R <= 250) && (c3.G <= 250) && (c3.B <= 250))
{
return true;
}
}
}
24
}
}
else
{
ar.RemoveRange((2*ar.Count)/3, ar.Count/3);
int index1 = ar.Count/2;
Color c1 = ar[0];
if ((c1.R <= 250) && (c1.G <= 250) && (c1.B <= 250))
{
for (int i = index1 + 1; i < ar.Count; i++)
{
Color c2 = ar[i];
if ((c2.R <= 250) && (c2.G <= 250) && (c2.B <= 250))
{
continue;
}
else
{
Color c3 = ar[i - index1];
if ((c3.R <= 250) && (c3.G <= 250) && (c3.B <= 250))
{
return true;
}
else
return false;
}
}
}
}
}
return false;
}
В результате скелетизации на изображении могут появиться дополнительные особые точки (рисунок 2.4).
25
Рисунок 2.4 – Появление дополнительных особых точек в результате
скелетизации изображения.
Появление таких точек вносит ложное описание в топологию символа,
что может привести к неверным результатам распознавания. Чтобы избежать
такой проблемы, после выделения всех типов особых точек выполняется анализ полученных точек и отбрасывание ложных.
В основе критерия определения ложности очередной особой точки
лежит положение следующие положения:
1) Размер символа не менее 10х10 пикселей.
2) Вероятность попадания двух особых точек в область 2х2 пикселя
стремится к нулю.
На основе приведенных положений происходит сортировка полученных особых точек.
2.5 Программная реализация алгоритма построения
графа изображения символа
При программном построении графа изображения можно выделить
первоначальную задачу: определить, существует ли ребро между двумя точками на изображении. Решение такой задачи можно представить в виде последовательности следующих действий:
1) Выбирается стартовый черный пиксель.
26
2) Формируется восьмисвязная область. В этой области производится
поиск черного пикселя, если такой найден, то он будет являться продолжением ребра.
3) Найденный черный пиксель принимаем текущим.
4) Текущий пиксель сравниваем с конечным, если их координаты равны, значит ребро существует и выходим из алгоритма, если координаты пикселей не равны, то происходит переход на шаг 2.
5) Итерации повторяются до тех пор, пока траектория не достигла заданной конечной точки либо другой существующей особой точки.
Используя данный алгоритм, можно определить наличие либо отсутствие ребер между каждой парой особых точек и построить программное
представление графа изображения в виде матрицы, состоящей из нулей и
единиц.
/// <summary>
/// Метод определяет, существуют между указанной точкой и какой-либо
/// другой специальной точкой траетория.
/// </summary>
/// <param name="intersectionPoint">Стартовая точка пересечения</param>
/// <returns>Номер особой точки, с которой имеется ребро, -1 в случае, когда
таких точек нет.</returns>
public int IsArc(Point intersectionPoint, Point truepoint)
{
//берем первую конечную точку
xcur = intersectionPoint.X;
ycur = intersectionPoint.Y;
//сохраняем траекторию
List<Point> path = new List<Point>();
//осуществляем проверку наличия ребра
while ((xcur < _wokrBitmap.Width) && (ycur < _wokrBitmap.Height))
{
path.Add(new Point(xcur, ycur));
//берем окружение текущей точки
int i1 = xcur - 1;
int i2 = xcur + 1;
27
int j1 = ycur - 1;
int j2 = ycur + 1;
//запоминаем последнюю точку траектории
Point p = new Point();
if (path.Count - 2 >= 0)
p = path[path.Count - 2];
else
{
p = GetLastPoint(truepoint);
}
xlast = p.X;
ylast = p.Y;
//обрабатываем 8 окружных точек
if ((i1 >= 0) && (j1 >= 0))
{
WorkPoint(i1, j1);
WorkPoint(i1, ycur);
WorkPoint(xcur, j1);
}
if ((i1 >= 0) && (j2 < _wokrBitmap.Height))
{
WorkPoint(i1, j2);
WorkPoint(xcur, j2);
}
if ((i2 < _wokrBitmap.Width) && (j1 >= 0))
{
WorkPoint(i2, j1);
WorkPoint(i2, ycur);
}
if ((i2 < _wokrBitmap.Width) && (j2 < _wokrBitmap.Height))
{
WorkPoint(i2, j2);
}
int numSpecial = IsSpetial(intersectionPoint);
28
if (numSpecial != -1)
return numSpecial;
}
return -1;
}
2.6 Программная реализация алгоритма распознавания
текста
Имея реализованными алгоритмы предварительной обработки изображений (алгоритм скелетизации Зонга-Суня), алгоритм определения особых
точек на изображении, алгоритм построения графа изображения, можно приступать к программной реализации самого алгоритма распознавания.
Прежде необходимо заострить внимание на способе хранения информации об эталонах распознавания. Есть возможность хранить саму матрицу,
представляющую граф, в базе данных и соответствующий ей символ. Однако
при использовании такого метода могут возникнуть проблемы с эффективностью поиска эталона по базе (поиск будет работать медленно), так как критерием поиска будет выступать строка из большого количества символов. Для
снижения временных затрат на поиск выборки в базе данных решено представлять матрицу графа как совокупность собственных чисел каждой строки
матрицы. В результате в базе данных нужно будет хранить значительно
меньше информации об эталоне, а также данный метод позволит уменьшить
длину строки для критерия поиска. Для расчета собственных чисел матрицы
используются численные методы, которые реализованы в библиотеках сторонних производителей.
Рассмотрим программную реализацию алгоритма распознавания символов. Он состоит из следующих шагов:
1) Предобработка (скелетизация) изображения, поданного на вход.
2) Выделение особых точек скелетизированного изображения.
3) Построение графа скелетизированного изображения.
4) Представление матрицы графа в виде совокупности собственных
чисел каждой строки.
29
5) Поиск среди эталонов соответствующего значения.
6) Представление результатов пользователю.
В случае, если составленное из собственных чисел матрицы графа
значение не будет найдено в базе данных, пользователю модуля будет возвращено пустое значение символа, и оператор вынужден будет вручную подтвердить либо исправить результат первичного распознавания.
Код метода, выполняющего распознавание символа, выглядит следующим образом:
/// <summary>
/// Метод распознает изображение символа.
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public char Recognize(Bitmap image)
{
//получаем скелет изображения
Recognizer.Sceletonization.ZongSuhnSceletonization sceletonizer = new
Recognizer.Sceletonization.ZongSuhnSceletonization();
Bitmap imageScelet = sceletonizer.GetScelet(image);
//строим граф символа
Recognizer.GraphBuilder.GraphBuilder graphBuilder = new
Recognizer.GraphBuilder.GraphBuilder();
int[,] graph = graphBuilder.BuildGraph(imageScelet);
//получаем собственные числа графа
Recognizer.ProperNumber.ProperNumbers propBuilder = new
Recognizer.ProperNumber.ProperNumbers();
List<double> propNumbers = propBuilder.GetProperNumbersModified(graph,
0.1);
//склеиваем собственные числа в строку
String letters_id = "";
for (int i = 0; i < propNumbers.Count; i++)
{
letters_id += propNumbers[i].ToString() + ";";
}
30
//выполняем поиск по базе
char result = FindChar(letters_id);
return result;
}
Для поиска соответствующего эталона используется следующий программный код:
private static readonly MultiDictionary<double[], char> _etallons = new
MultiDictionary<double[], char>(true);
public new static void Inicialize(XmlElement config)
{
if ((_etallons != null) && (_etallons.Count != 0))
_etallons.Clear();
XmlNode preConnectionStrNode =
config.SelectSingleNode("DbPreConnectionString");
string preCon = preConnectionStrNode.InnerText;
XmlNode dbFileNameNode = config.SelectSingleNode("DbFileName");
string dbFileName = dbFileNameNode.InnerText;
#region checks
if (config == null)
throw new ArgumentNullException();
if (String.IsNullOrEmpty(preCon))
throw new Exception("Preconnection string in the config is invalid");
if (!File.Exists(dbFileName))
throw new FileNotFoundException("Data base file not found");
#endregion
using (OleDbConnection connection = new OleDbConnection(preCon +
dbFileName))
{
OleDbCommand selectCmd = connection.CreateCommand();
selectCmd.CommandText = "select letters_id, letters_char from letters";
OleDbDataAdapter adapter = new OleDbDataAdapter(selectCmd);
DataTable table = new DataTable();
try
{
31
adapter.Fill(table);
foreach (DataRow dr in table.Rows)
{
string letterIdStr = dr[0].ToString();
char letterChar = dr[1].ToString()[0];
double[] lettersId = GetNumbers(letterIdStr, ';');
_etallons.Add(lettersId, letterChar);
}
}
catch (Exception ex)
{
throw new Exception("Error in inicializing Sceleton recognizer" +
Environment.NewLine + ex);
}
}
}
private static List<RecognitionResult> FindChar(String id)
{
List<RecognitionResult> result = new List<RecognitionResult>();
double[] idNumbers = GetNumbers(id, ';');
result = FindEasyChar(idNumbers);
if (result.Count == 0)
{
result = FindComplexChar(idNumbers);
}
return result;
}
private static List<RecognitionResult> FindEasyChar(double[] id)
{
List<RecognitionResult> result = new List<RecognitionResult>();
if (_etallons.ContainsKey(id))
{
ICollection<char> collection = _etallons[id];
foreach(char symbol in collection)
{
result.Add(new RecognitionResult() {ResultAccuracy = 1, ResultChar
= symbol});
32
}
}
return result;
}
33
3
АНАЛИЗ РАЗРАБОННОГО АЛГОРИТМА РАСПОЗНАВАНИЯ ТЕКСТА
3.1 Устойчивость алгоритма к появлению искаженных
символов
Структурные алгоритмы распознавания разработаны специально для
распознавания текстов низкого качества. Такого рода алгоритмы подразумевают, что программа хранит информацию не о поточечном написании символа, а о наличии в нем структурных элементов (колец, дуг, отрезков и точек).
Изображение символа приводится к контуру, на котором анализируются
наличия пересечений линий, вычисляются углы, размеры дуг и т.д.
Этот метод позволяет выделять элементы на искаженных изображениях, то есть осуществлять распознавание при практически неограниченной
изменчивости символа.
Разрабатываемый алгоритм основан на топологическом описании
символа – его особых точек. Результирующее описание преобразуется в вектор чисел, который можно использовать для сопоставление с эталонными
векторами, полученными ранее. Искажение символа не влияет на его топологическое описание, а, следовательно, на результирующий вектор чисел (рисунок 3.1)
Рисунок 3.1 – Устойчивость алгоритма к появлению искажений символа
34
3.2 Устойчивость алгоритма к появлению разрывов в
изображениях символов
Чтобы получить изображение документа, его необходимо отсканировать на сканирующем устройстве. В случае некорректной настройки сканирующего устройства текст, расположенный в документе, может быть поврежден. Это может произойти по следующим причинам:
1) Неправильное размещение документа в сканере. В результате появляется искажение текста;
2) Печать документа на некачественной бумаге. Последующее сканирование документа приведет к появлению «мусора» на изображении – множество черных точек, которые затрудняют процесс распознавания и могут
привести к искажению результатов;
3) Неправильная настройка сканера. Для получения качественного
изображения на сканере не должно быть пятен, царапин, а так же разрешение
сканирования должно быть не менее 300 dpi.
Одним из типов повреждения символа является разрыв какой-либо
линии изображения. Для структурных алгоритмов распознавания текста это
может оказаться причиной появления ошибок работы. Это объясняется тем,
что в результате появления разрывов символов либо утере части изображения символа в топологическом описании символа появляются (при разрывах)
либо пропадают (в случае утери части символа) отдельные структурные части.
В рамках разработанного структурного алгоритма распознавания текста, основанного на топологическом описании символа, появление разрывов
линий характеризуется появлением дополнительных особых точек на изображении. Так, при разрыве прямой появляется две дополнительные концевые
точки. Это можно видеть на рисунке 3.2
35
Рисунок 3.2 – Появление дополнительных особых точек при разрыве линий
изображения
Появление дополнительных структурных элементов в топологическом
описании символа, в свою очередь, приводит к увеличению длины вектора
собственных чисел, представляющих граф изображение (рисунок 3.3)
Рисунок 3.3 – Увеличение длины вектора собственных чисел матрицы, представляющей граф изображения, при появлении разрывов
36
Исходя из вышеописанного, можно сделать вывод о неустойчивости
разработанного алгоритма к появлению разрывов символов. Это происходит
ввиду того, что при построении вектора собственных чисел матрицы, представляющей граф изображения, происходит появление дополнительных чисел, что приводит к ошибкам сопоставления с эталонными значениями символов.
3.3
Постановка задачи поиска наиболее похожей последовательности символов среди эталонных значений
В ходе работы по анализу векторов собственных чисел матриц, представляющих граф изображения символа, была замечена следующая особенность данных векторов. Появление разрывов символов сопровождается появлением дополнительных чисел в векторах. При этом на остальные числа разрыв линий не влияет (рисунок 3.4).
Рисунок 3.4 – Сходство векторов чисел для непрерывной линии и линии с разрывом.
Как видно из рисунка, удалив «лишние» числа из вектора, можно получить исходный эталонный вектор.
37
Таким образом, появляется задача реализации сравнения векторов чисел, содержащих «лишние» элементы с эталонными векторами, решив которую, можно повысить устойчивость алгоритма распознавания текста к появлению разрывов символов.
38
4
РЕШЕНИЕ ЗАДАЧИ ПОИСКА НАИБОЛЕЕ ПОХОЖЕЙ ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ СРЕДИ ЗАДАННЫХ ЭТАЛОНОВ
4.1 Алгоритм поиска похожей последовательности среди последовательностей одинаковой длинны
Для сравнения строк обычно используют метрики, оценивающие максимальную стоимость преобразования одной строки в другую. В общем случае, операциям редактирования, используемым в этом преобразовании, а
именно замене символов, их вставке и удалению, можно назначить разные
цены.
В качестве оценки похожести одной последовательности чисел на
другую при последовательностях одинаковой длинны, как правило, используют расстояние Хемминга.
Первоначально метрика была сформулирована Ричардом Хэммингом
во время его работы в Bell Labs для определения меры различия между кодовыми комбинациями (двоичными векторами) в векторном пространстве кодовых последовательностей, в этом случае расстоянием Хэмминга d (x, y)
между двумя двоичными последовательностями (векторами) X и Y длины n
называется число позиций, в которых они различны. Это эквивалентно минимальной цене преобразования первой строки во вторую в случае, когда
разрешена только операция замены с единичным весом.
В общем виде расстояние Хэмминга dH для объектов Xi и Xj размерности P задаётся функцией:
(4.1)
Расстояние Хэмминга обладает свойствами метрики, удовлетворяя следующим условиям:
(4.2)
39
При разработке алгоритма распознавания текста было решено использовать динамическую цену операции замены одного элемента другим. Такая
цена рассчитывается как разность между элементом эталонного вектора и
элементом вектора неизвестного символа. Это позволит более точно рассчитывать расстояние между последовательностями элементов.[7]
Программная реализация данного метода выглядит следующим образом:
public static double GetDistance(double[] etallon, double[] recognizing)
{
double result = 0;
for (int i = 0; i < etallon.Length; i++)
{
result += System.Math.Abs(etallon[i] - recognizing[i]);
}
return result;
}
4.2 Алгоритм поиска похожей последовательности среди
последовательностей различной длины
В качестве оценки похожести одной последовательности чисел на
другую при последовательностях разной длинны будем использовать алгоритм динамического программирования Вагнера и Фишера.
В методе динамического программирования последовательно, по
предыдущим значениям, вычисляются расстояния между все более и более
длинными префиксами двух строк – до получения окончательного результата. Опишем этот процесс более подробно.
Пусть di,j есть расстояние между префиксами строк x и y, длины которых равны, соответственно, i и j, то есть
40
di,j = d(x(1,i), y(1,j))
(4.1)
Цену преобразования символа a в символ b обозначим через w(a,b).
Таким образом, w(a,b) – это цена замены одного символа на другой, когда
a≠b, w(a,ε) – цена удаления a, а w(ε, b) – цена вставки b.
В процессе вычислений значения di,j записываются в массив (m+1) *
(n+1), а вычисляются они с помощью следующего рекуррентного соотношения.
di,j = min{di-1,j + w(xi, ε), di,j-1 + w(ε, yj), di-1,j-1 + w(xi, yi)}
(4.2)
Оно выводится следующим образом. Если предположить, что известна цена преобразования x(1, i-1) в y(1, j), то цену преобразования x(1, i) в
y(1,j) можно получить, добавив к ней цену удаления xi. Аналогично, цену
преобразования x(1, i) в y(1, j) можно получить, прибавив цену вставки yj к
цене преобразования x(1, i) в y(1, j-1). Наконец, зная цену преобразования
x(1, i-1) в y(1, j-1), цену преобразования x(1, i) в y(1, j) получают, прибавив к
ней цену замены xi на yj. Расстояние di,j является минимальной ценой преобразования x(1,j) в y(1,j), поэтому из трех указанных выше операций надо выбрать самую дешевую.
Перед тем, как начать вычислять di,j, надо установить граничные значения массива. Что касается первого столбца массива, то значение di,0 равно
сумме цен удаления первых i символов x. Аналогично, значения d0,j первой
строки задаются суммой цен вставки первых j символов y.
d0,0=0
(4.3)
для 1 < i < m
для 1 < j < n
41
Если принять цену замены символа, удаления символа и вставки символа, равной единице, то расстояние, вычисляемое таким способом, имеет
название «расстояние Левенштейна».
Расстояние Левенштейна активно применяется при поиске и обработке текстов
a) В поисковых системах для нахождения объектов или записей по
имени;
b) в базах данных при поиске с неполно-заданным или неточнозаданным именем
c) для исправления ошибок при вводе текста
d) для исправления ошибок в результате автоматического распознавания отсканированного текста или речи
e) в других приложениях, связанных с автоматической обработкой
текстов
С точки зрения приложений определение расстояния между словами
или текстовыми полями по Левенштейну обладает следующими недостатками:
a) При перестановке местами слов или частей слов получаются
сравнительно большие расстояния
b) Расстояния между абсолютно разными короткими словами оказываются небольшими, в то время как расстояние между сильно
похожими длинными словами оказываются значительными
Для расчета расстояний между эталонными векторами чисел и векторами чисел, полученными при анализе неизвестного символа, будем применять модифицированное расстояние Левенштейна. Модификация алгоритма
заключается в динамической цене операции замены элемента вектора. Данная величина вычисляется как разница между элементом эталонного вектора
и элементом текущего вектора. Это позволяет более точно оценить расстояние между двумя векторами чисел.[7]
Программная реализация данного алгоритма на языке C# выглядит
следующим образом.
public static double GetDistance(double[] etallon, double[] recognizing)
{
double result = Int32.MaxValue;
42
double[,] mass = new double[etallon.Length + 1, recognizing.Length + 1];
for (int i = 0; i <= etallon.Length; i++)
mass[i, 0] = i;
for (int j = 0; j <= recognizing.Length; j++)
mass[0, j] = j;
for (int i = 1; i <= etallon.Length; i++)
{
for (int j = 1; j <= recognizing.Length; j++)
{
double diff = (etallon[i - 1] == recognizing[j - 1]) ? 0 :
System.Math.Abs(etallon[i-1] - recognizing[j-1]);
mass[i, j] = System.Math.Min(System.Math.Min(mass[i - 1, j] + 1,
mass[i, j - 1] + 1),
mass[i - 1, j] + diff);
}
}
result = mass[etallon.Length, recognizing.Length];
return result;
}
43
5
ПРАКТИЧЕСКАЯ АПРОБАЦИЯ МОДУЛЯ РАСПОЗНАВАНИЯ ТЕКСТА И АНАЛИЗ РЕЗУЛЬТАТОВ
ЕГО РАБОТЫ
5.1 Программа испытаний алгоритма распознавания
текста
На завершающем этапе работы над модулем распознавания текста
было разработано небольшое приложение, служащее прототипом модуля автоматизации обработки паспортных данных для автоматизированного рабочего места сотрудника Министерства Иностранных Дел Республики Беларусь.
Данное приложение регистрируется в операционной системе пользователя там образом, что среда Lotus Notes, в которой разработано автоматизированное рабочее место, может обратиться к функционалу модуля распознавания текста.
В состав экспериментального стенда вошли следующие технические и
программные средства:
a) Персональный компьютер на базе двухъядерного процессора Intel Core 2 Duo E4200 с операционной системой Windows XP;
b) Планшетный сканер HP 3010;
c) Приложение, включающее модуль распознавания текста.
В ходе испытаний модуля было произведена обработка данных из порядка 20 паспортов 12 стран мира.
5.2 Результаты испытаний модуля
В ходе практического применение модуля распознавания текста в составе продукта по обработке документов для выдачи въездной визы была
продемонстрирована достаточно устойчивая работа модуля. К редактированию результатов операторы практически не приступали.
44
На данный момент модуль функционирует в Китае, Австрии, а также
в Великобритании.
Пользователями программного обеспечения были высказаны некоторые замечания по поводу качества распознавания. Разработанный алгоритм
оказался слабоустойчивым к распознаванию символов, схожих в написании
(например, буква «О» и цифра «0»). В результате анализа этих замечаний
можно прийти к выводу о необходимости включения в цепочку алгоритмов
распознавания дополнительный шаблонный алгоритм. Это позволит решить
проблему с распознаванием символов, схожих по топологическому описанию.
45
Заключение
В диссертации анализируется проблема обработки изображений символов, содержащих искажения и разрывы линий. Рассматриваются различные
подходы к решению вопроса распознавания текста. Даются характеристики
описанных подходов.
При решении поставленных задач автор диссертации разработал и реализовал алгоритм распознавания символов, предназначенный для обработки
искаженных символов. В ходе работы над алгоритмом была поставлена и
решена задача повышения устойчивости алгоритма к появлению разрывов
линий в изображениях символов.
Алгоритм был программно реализован с помощью технологии разработки приложений Microsoft .NET Framework 2.0. Для хранения эталонной
информации между моментами запуска приложения выбрана СУБД Microsoft
Access.
Программный модуль на базе разработанного алгоритма распознавания текста успешно внедрен в комплекс автоматизированного рабочего места
сотрудников Министерства Иностранных Дел Республики Беларусь, выполняющих задачи принятия документов от граждан и подачи заявок на оформления въездной визы.
46
Список использованных источников
1 Официальный сайт компании ABBY. Как работает ABBYY
FineReader
Банк
[Электрон.
ресурс].
–
Режим
доступа:
http://www.abbyy.ru/bank/?param=32683, свободный. – Загл. с экрана.
2 Платт, Д. С. Знакомство с Microsoft .NET: Пер. с англ. / Вшивцев В.
Г. – М.: Издательско-торговый дом «Русская Редакция», 2001. – 240 с. – ISBN
5-7502-0186-4.
3 Сеппа, Д. Microsoft ADO.NET: Пер. с англ. / Харламов А. П. – М.:
Издательско-торговый дом «Русская Редакция», 2003. – 640 с. – ISBN 5-75020223-2.
4 Шилдг, Г. Полный справочник по С#: Пер. с англ. – М. : Издательский дом "Вильямc", 2004. – 752 с. – ISBN 5-8459-0563-Х.
5 Официальный сайт компании СООО «АйТиСофт» [Электрон. ресурс]. – Режим доступа: www.itsoft.by, свободный. – Загл. с экрана.
6 Математическая морфология. Фильтрация [Электрон. ресурс]. –
Режим доступа: http://graphics.cs.msu.su/courses/cg02b/lectures/lection4/, свободный. – Загл. с экрана.
7 Общие подпоследовательности. Дистанция [Электрон. ресурс]. –
Режим доступа: http://algolist.manual.ru/search/lcs/, свободный. – Загл. с экрана.
47
Download