Грэг Дункан
Сегодняшний проект относится сразу к двум типам: «Ух ты, так вот как это работает» и «Ой! Математика повреждает мой мозг». В глубинах статьи можно встретить потрясающие вещи и если вы удержитесь там, то получите намного больше понимания … и, конечно, код.
Контурный анализ для распознавания образов на С#
Теория контурного анализа и ее практическое применение для распознавания образов и OCR. Статья описывает теоретические основы контурного контуров и различные аспекты его практического применения для распознавания образов. Также в статью включена библиотека для выполнения операций контурного анализа и демонстрационные примеры. Первая часть статьи содержит основные определения и теоремы контурного анализа. Я старался выбирать главные моменты, позволяющие быстро понять суть анализа, и начать применять его на практике. Также я добавил кое-что от себя. В основном это касается некоторых аспектов теории и проблем оптимизации алгоритмов контурного анализа. Этому посвящена вторая часть статьи. В том же месте приводятся результаты работы алгоритмов, обсуждаются проблемы и недостатки данного метода. Третья часть описывает библиотеку ContourAnalysis на C#. ...
Теория контурного анализа и ее практическое применение для распознавания образов и OCR.
Статья описывает теоретические основы контурного контуров и различные аспекты его практического применения для распознавания образов. Также в статью включена библиотека для выполнения операций контурного анализа и демонстрационные примеры.
Первая часть статьи содержит основные определения и теоремы контурного анализа. Я старался выбирать главные моменты, позволяющие быстро понять суть анализа, и начать применять его на практике. Также я добавил кое-что от себя. В основном это касается некоторых аспектов теории и проблем оптимизации алгоритмов контурного анализа. Этому посвящена вторая часть статьи. В том же месте приводятся результаты работы алгоритмов, обсуждаются проблемы и недостатки данного метода.
Третья часть описывает библиотеку ContourAnalysis на C#.
...
Часть 1. Основы контурного анализа Что необходимо для контурного анализа (КА) КА позволяет описывать, хранить сравнивать и находить объекты, находящиеся в форме внешних абрисов – контуров. Предполагается, что контур содержит необходимую информацию о форме объекта. Внутренние точки объекта во внимание не принимаются. Это ограничивает область применимости алгоритмов КА, но рассмотрение лишь контуров позволяет перейти от двухмерного пространства образа к пространству контуров и, следовательно, уменьшить вычислительную и алгоритмическую сложность. КА позволяет эффективно решать главные задачи распознавания шаблонов – перенос, поворот и масштабирование изображения объекта. Методы КА инвариантны относительно таких преобразований. Основные концепции Сначала мы определяем контур объекта. Контур – это граница объекта, множество точек (пикселей), отделяющих объект от фона. В системах компьютерного зрения используются несколько форматов кодирования контуров – наиболее известны код Фримана, двухмерный код, полигональный код. Но все это форматы кодирования на используются в КА. Вместо этого в КА контур кодируется последовательностью комплексных чисел. На контуре фиксируется точка, называемая стартовой. Затем контур обходится (например, по часовой стрелке), и каждый вектор смещения обозначается комплексным числом a+ib. Где a – смещение по оси x, а b – смещение по оси y. Смещение определяется относительно предыдущей точки. ...
Часть 1. Основы контурного анализа
Что необходимо для контурного анализа (КА)
КА позволяет описывать, хранить сравнивать и находить объекты, находящиеся в форме внешних абрисов – контуров.
Предполагается, что контур содержит необходимую информацию о форме объекта. Внутренние точки объекта во внимание не принимаются. Это ограничивает область применимости алгоритмов КА, но рассмотрение лишь контуров позволяет перейти от двухмерного пространства образа к пространству контуров и, следовательно, уменьшить вычислительную и алгоритмическую сложность.
КА позволяет эффективно решать главные задачи распознавания шаблонов – перенос, поворот и масштабирование изображения объекта. Методы КА инвариантны относительно таких преобразований.
Основные концепции
Сначала мы определяем контур объекта. Контур – это граница объекта, множество точек (пикселей), отделяющих объект от фона.
В системах компьютерного зрения используются несколько форматов кодирования контуров – наиболее известны код Фримана, двухмерный код, полигональный код. Но все это форматы кодирования на используются в КА.
Вместо этого в КА контур кодируется последовательностью комплексных чисел. На контуре фиксируется точка, называемая стартовой. Затем контур обходится (например, по часовой стрелке), и каждый вектор смещения обозначается комплексным числом a+ib. Где a – смещение по оси x, а b – смещение по оси y. Смещение определяется относительно предыдущей точки.
Часть 2: Практическое применение контурного анализа Главный алгоритм распознавания Итак, приступим к решению задачи распознавания шаблона на изображении. Последовательность операций распознавания выглядит следующим образом: Предварительная обработка изображения – сглаживание, фильтрация шума, повышение контраста Перевод изображения в двоичную форму и выбор контуров объектов Первоначальная фильтрация контуров по периметру, квадратам, фактору пересечений, фрактальности и т. п. Приведение контуров к одинаковой длине, сглаживание Поиск всех выявленных контуров, поиск шаблонов, максимально похожих на заданный контур Мы не будем рассматривать пункты 1 и 3, они характерны для прикладной области и имеют небольшое отношение к КА. Далее мы рассмотрим тело алгоритма – поиск и сравнение контуров с шаблонами. А затем мы немного остановимся на переводе в двоичную форму, приведению к одной длине и сглаживании. ...
Часть 2: Практическое применение контурного анализа
Главный алгоритм распознавания
Итак, приступим к решению задачи распознавания шаблона на изображении.
Последовательность операций распознавания выглядит следующим образом:
Мы не будем рассматривать пункты 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 также содержит настройки для поиска контуров. ...
Часть 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 также содержит настройки для поиска контуров.
Вот снимок работающего изображения. Да он выполняет обработку изображений в реальном времени, используя веб-камеру. Насколько это здорово?
Что мне кажется удивительным, так это как мало для этого нужно. Вы думали будут тонны файлов и т. п.?
private void ProcessFrame(){ try { if (captureFromCam) frame = _capture.QueryFrame(); frameCount++; // processor.ProcessImage(frame); // if(cbShowBinarized.Checked) ibMain.Image = processor.binarizedFrame; else ibMain.Image = frame; } catch (Exception ex) { Console.WriteLine(ex.Message); }}public void ProcessImage(Image<Gray, byte> grayFrame){ if (equalizeHist) grayFrame._EqualizeHist();//autocontrast //smoothed Image<Gray, byte> smoothedGrayFrame = grayFrame.PyrDown(); smoothedGrayFrame = smoothedGrayFrame.PyrUp(); //canny Image<Gray, byte> cannyFrame = null; if (noiseFilter) cannyFrame = smoothedGrayFrame.Canny(new Gray(cannyThreshold), new Gray(cannyThreshold)); //smoothing if (blur) grayFrame = smoothedGrayFrame; //binarize CvInvoke.cvAdaptiveThreshold(grayFrame, grayFrame, 255, Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, adaptiveThresholdBlockSize + adaptiveThresholdBlockSize % 2 + 1, adaptiveThresholdParameter); // grayFrame._Not(); // if (addCanny) if (cannyFrame != null) grayFrame._Or(cannyFrame); // this.binarizedFrame = grayFrame; //dilate canny contours for filtering if (cannyFrame != null) cannyFrame = cannyFrame.Dilate(3); //find contours var sourceContours = grayFrame.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST); //filter contours contours = FilterContours(sourceContours, cannyFrame, grayFrame.Width, grayFrame.Height); //find templates lock (foundTemplates) foundTemplates.Clear(); samples.Clear(); lock (templates) Parallel.ForEach<Contour<Point>>(contours, (contour) => { var arr = contour.ToArray(); Template sample = new Template(arr, contour.Area, samples.templateSize); lock (samples) samples.Add(sample); if (!onlyFindContours) { FoundTemplateDesc desc = finder.FindTemplate(templates, sample); if (desc != null) lock (foundTemplates) foundTemplates.Add(desc); } } ); // FilterByIntersection(ref foundTemplates);}
Что меня восхищает в этом проекте, так это как его можно использовать в других проектах… подумайте о роботе, вместе с Kinect, который действительно будет читать знаки мимо которых будет проезжать? Или использовать это с приложениях WP7? Или…или…или…