Ask Learn
Preview
Ask Learn is an AI assistant that can answer questions, clarify concepts, and define terms using trusted Microsoft documentation.
Please sign in to use Ask Learn.
Sign inThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Сегодняшний проект относится сразу к двум типам: «Ух ты, так вот как это работает» и «Ой! Математика повреждает мой мозг». В глубинах статьи можно встретить потрясающие вещи и если вы удержитесь там, то получите намного больше понимания … и, конечно, код.
Контурный анализ для распознавания образов на С#
Теория контурного анализа и ее практическое применение для распознавания образов и OCR.
Статья описывает теоретические основы контурного контуров и различные аспекты его практического применения для распознавания образов. Также в статью включена библиотека для выполнения операций контурного анализа и демонстрационные примеры.
Первая часть статьи содержит основные определения и теоремы контурного анализа. Я старался выбирать главные моменты, позволяющие быстро понять суть анализа, и начать применять его на практике. Также я добавил кое-что от себя. В основном это касается некоторых аспектов теории и проблем оптимизации алгоритмов контурного анализа. Этому посвящена вторая часть статьи. В том же месте приводятся результаты работы алгоритмов, обсуждаются проблемы и недостатки данного метода.
Третья часть описывает библиотеку ContourAnalysis на C#.
...
Часть 1. Основы контурного анализа
Что необходимо для контурного анализа (КА)
КА позволяет описывать, хранить сравнивать и находить объекты, находящиеся в форме внешних абрисов – контуров.
Предполагается, что контур содержит необходимую информацию о форме объекта. Внутренние точки объекта во внимание не принимаются. Это ограничивает область применимости алгоритмов КА, но рассмотрение лишь контуров позволяет перейти от двухмерного пространства образа к пространству контуров и, следовательно, уменьшить вычислительную и алгоритмическую сложность.
КА позволяет эффективно решать главные задачи распознавания шаблонов – перенос, поворот и масштабирование изображения объекта. Методы КА инвариантны относительно таких преобразований.
Основные концепции
Сначала мы определяем контур объекта. Контур – это граница объекта, множество точек (пикселей), отделяющих объект от фона.
В системах компьютерного зрения используются несколько форматов кодирования контуров – наиболее известны код Фримана, двухмерный код, полигональный код. Но все это форматы кодирования на используются в КА.
Вместо этого в КА контур кодируется последовательностью комплексных чисел. На контуре фиксируется точка, называемая стартовой. Затем контур обходится (например, по часовой стрелке), и каждый вектор смещения обозначается комплексным числом a+ib. Где a – смещение по оси x, а b – смещение по оси y. Смещение определяется относительно предыдущей точки.
...
Часть 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 также содержит настройки для поиска контуров.
...
Вот снимок работающего изображения. Да он выполняет обработку изображений в реальном времени, используя веб-камеру. Насколько это здорово?
Что мне кажется удивительным, так это как мало для этого нужно. Вы думали будут тонны файлов и т. п.?
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? Или…или…или…
Anonymous
December 25, 2013
habrahabr.ru/.../118486
вот перевод на рус.
Anonymous
January 02, 2014
Кто-нибудь пробовал использовать это в WP7? (успешно)
Anonymous
April 28, 2015
Можно ли выложить проект с исходниками, для ознакомления с кодом?
Ask Learn is an AI assistant that can answer questions, clarify concepts, and define terms using trusted Microsoft documentation.
Please sign in to use Ask Learn.
Sign in