Назад в библиотеку

Применение контурного анализа для распознавания образов на С#

Автор: Грэг Дункан
Источник: [Электронный ресурс]// Режим доступа: http://blogs.msdn.com/b/rucoding4fun/archive/2012/01/17/quot-contour-analysis-for-image-recognition-in-c-quot.aspx

Контурный анализ для распознавания образов на С#

Теория контурного анализа и ее практическое применение для распознавания образов и OCR.

Статья описывает теоретические основы контурного контуров и различные аспекты его практического применения для распознавания образов. Также в статью включена библиотека для выполнения операций контурного анализа и демонстрационные примеры.

Первая часть статьи содержит основные определения и теоремы контурного анализа. Я старался выбирать главные моменты, позволяющие быстро понять суть анализа, и начать применять его на практике. Также я добавил кое-что от себя. В основном это касается некоторых аспектов теории и проблем оптимизации алгоритмов контурного анализа. Этому посвящена вторая часть статьи. В том же месте приводятся результаты работы алгоритмов, обсуждаются проблемы и недостатки данного метода.

Часть 1. Основы контурного анализа

Что необходимо для контурного анализа (КА)

КА позволяет описывать, хранить сравнивать и находить объекты, находящиеся в форме внешних абрисов – контуров.

Предполагается, что контур содержит необходимую информацию о форме объекта. Внутренние точки объекта во внимание не принимаются. Это ограничивает область применимости алгоритмов КА, но рассмотрение лишь контуров позволяет перейти от двухмерного пространства образа к пространству контуров и, следовательно, уменьшить вычислительную и алгоритмическую сложность.

КА позволяет эффективно решать главные задачи распознавания шаблонов – перенос, поворот и масштабирование изображения объекта. Методы КА инвариантны относительно таких преобразований.

Основные концепции

Сначала мы определяем контур объекта. Контур – это граница объекта, множество точек (пикселей), отделяющих объект от фона.

В системах компьютерного зрения используются несколько форматов кодирования контуров – наиболее известны код Фримана, двухмерный код, полигональный код. Но все это форматы кодирования на используются в КА.

Вместо этого в КА контур кодируется последовательностью комплексных чисел. На контуре фиксируется точка, называемая стартовой. Затем контур обходится (например, по часовой стрелке), и каждый вектор смещения обозначается комплексным числом a+ib. Где a – смещение по оси x, а b – смещение по оси y. Смещение определяется относительно предыдущей точки.

Часть 2: Практическое применение контурного анализа

Главный алгоритм распознавания

Итак, приступим к решению задачи распознавания шаблона на изображении.

Последовательность операций распознавания выглядит следующим образом:

  1. Предварительная обработка изображения – сглаживание, фильтрация шума, повышение контраста
  2. Перевод изображения в двоичную форму и выбор контуров объектов
  3. Первоначальная фильтрация контуров по периметру, квадратам, фактору пересечений, фрактальности и т. п.
  4. Приведение контуров к одинаковой длине, сглаживание
  5. Поиск всех выявленных контуров, поиск шаблонов, максимально похожих на заданный контур

Мы не будем рассматривать пункты 1 и 3, они характерны для прикладной области и имеют небольшое отношение к КА.

Далее мы рассмотрим тело алгоритма – поиск и сравнение контуров с шаблонами. А затем мы немного остановимся на переводе в двоичную форму, приведению к одной длине и сглаживании.

Часть 3: Библиотека ContourAnalysis

Библиотека включает два проекта. Первый – ContourAnalysis – реализует основные функции контурного анализа – создание контуров, скалярные произведения контуров, коррекция, оценка ICF и ACF, сравнение и поиск шаблонов.

Класс Contour – создает и хранит контуры. Он содержит основные операции для контуров – скалярное произведение, масштабирование, коррекция, нормализация оценка спектра, оценка ICF и ACF.

Класс Template используется для создания базы шаблонов. Он хранит контур, его ACF, дескрипторы ACF, линейные параметры начального контура (области), нормы контура. Также шаблон содержит переменную name , в которой содержится узнаваемое значение.

Класс TemplateFinder реализует быстрый поиск шаблона для заданного контура. Результатом операции этого класса является переменная FoundTemplateDesc, которая содержит начальный контур, и соответствующий ему шаблон. Кроме того, в ней содержатся параметр соответствия, угол поворота и масштаб контура по отношению к шаблону.

Второй проект – ContourAnalysisProcessing – содержит методы предварительной обработки изображений, выбора контура его фильтрации и распознавания. Также он содержит инструменты для автоматической генерации шаблонов для распознавания печатных символов.

Проект ContourAnalysisProcessing использует библиотеку OpenCV (.NET- обертку EmguCV) для операций с изображениями.

Класс ImageProcessor используется для управления изображениями. Он также хранит базу шаблонов.

Метод ImageProcessor.ProcessImage() получает на входе изображение. На выходе он предоставляет список обнаруженных контуров (ImageProcessor.samples) и список распознанных контуров (ImageProcessor.foundTemplates).

Класс ImageProcessor также содержит настройки для поиска контуров.

Что меня восхищает в этом проекте, так это как его можно использовать в других проектах… подумайте о роботе, вместе с Kinect, который действительно будет читать знаки мимо которых будет проезжать? Или использовать это с приложениях WP7? Или…или…или…