Исследование алгоритмов распознавания регистрационных номеров автомобилей

Обзор математических методов распознавания. Общая архитектура программы преобразования автомобильного номерного знака. Детальное описание алгоритмов: бинаризация изображения, удаление обрамления, сегментация символов и распознавание шаблонным методом.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.06.2011
Размер файла 4,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Сегментация проходит слева направо. Ищется точка, подозрительная на принадлежность символу. Изображение сканируется вертикальными полосами. Имея в виду вероятность тени, пропускаем точки связанные с верхом и низом растра. Точка, не имеющая такой связи, передается алгоритму выделения символа (рисунок 2.11). Подробный алгоритм приведен ниже.

Рисунок 2.11. Поиск подозрительной точки

Алгоритм поиска точки, подозрительной на принадлежность символу:

1. Стартовой становится самая левая вертикальная линия пикселей.

2. Начиная от верхнего пикселя, спускаемся вниз, пока не встретим белый пиксель. Так мы получаем верхнюю границу области поиска.

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

4. В выделенной области поиска ищем первую попавшуюся черную точку. Если таковой не найдется, то текущей становится следующая линия по направлению вправо. Переходим на шаг 2.

5. Найденная точка передается алгоритму выделения символа.

От выбранной точки строится четырехсвязная область. Таким образом, выделяется символ. Накладываются ограничения на ширину области, учитывая возможные сливания символов тенью и грязью. Далее следует описание алгоритма, основанного на методе наращивания границ. Метод доработан таким образом, что в нем учитывается вероятность появления тени на номерной пластине сверху или снизу.

Рекурсивный алгоритм выделения символа:

1. Точка помечается как принадлежащая символу.

2. Если верхняя соседняя точка является черной, то переход на шаг 1.

3. Если нижняя соседняя точка является черной, то переход на шаг 1.

4. Определяем возможность рассмотрения соседних точек слева и справа. Для этого исследуется вертикальная линия пикселей, в которой находится текущая точка.

4.1. Если верхний пиксель является белым, то переход на шаг 5.

4.2. Спускаемся вниз по линии, пока не встретим белую точку, если таковой не найдется, то переходим на шаг 5

4.3. Продолжаем движение вниз, пока не встретим черную точку, если таковой не найдется, то переходим на шаг 5

4.4. Если нижний пиксель является белым, то переход на шаг 5.

4.5. Поднимаемся вверх по линии, пока не встретим белую точку, если таковой не найдется, то переходим на шаг 5

4.6. Продолжаем движение вверх, пока не встретим черную точку, если таковой не найдется, то переходим на шаг 5

4.7. Если левая соседняя точка является черной, то переход на шаг 1.

4.8. Если правая соседняя точка является черной, то переход на шаг 1.

5. Выход из рекурсии.

Шаги 4.1-4.6 являются доработкой, и несут в себе следующий смысл. Боковые соседние точки рассматриваются только в том случае, если линия, в которой находится текущая точка, состоит более чем из двух отрезков разного цвета. В подавляющем большинстве случаев иная структура линии указывает на то, что черные точки принадлежат тени, и рассматривать их нет смысла.

На выходе получаем обрамление символа. Следующая подозрительная точка ищется от правой границы ранее выделенного символа. В итоге получаем набор обрамлений, не все из которых выделяют символ (рисунок 2.12). Мелкие обрамления удаляются.

Рисунок 2.12. Результат работы сегментации

Теперь рамки подгоняются к размерам, описанным в ГОСТе.

Для этого вычисляется средняя ширина символов. Первый и последний обрезаются соответственно справа и слева, т.к. могут сливаться с тенью или грязью. Остальные символы расширяются или сужаются до нужной ширины. В заключение, происходит выравнивание по высоте. В итоге получаем набор символов для распознавания (рисунок 2.13).

Рисунок 2.13. Результат уточнения сегментации

2.2.4 Распознавание символов шаблонным методом

Из положения символа на номере становится ясно буква это или цифра. Поэтому для символа, из сравнения его растра с эталоном, получаем 10 или 13 оценок для цифры или буквы соответственно. Принимаем решение в пользу символа с максимальной оценкой.

Эталоны символов хранятся в матрицах. Черный пиксель отмечается единицей. Фоновые пикселям соответствуют ячейки с записанными в них расстояниями до ближайшего черного пикселя со знаком минус. Расстояние считается по одной из следующих формул.

(9)

математический автомобильный номерной бинаризация обрамление

где x, y ? модули смещений до ближайшей черной точки.

Пример показан на рисунке 2.14.

Рисунок 2.14 ? Пример эталона буквы «Р»

Вычисление оценки происходит следующим образом. Растр символа трансформируется до размеров эталона, и они накладываются друг на друга. Соответствующие черным пикселям символа значения в ячейках эталона суммируются. Появление точки в ячейке символа, далекой от ближайшей черной точки в эталоне, существенно снижает значение оценки (рисунок 2.15).

Рисунок 2.15 ? а) оценка для символа «P» равна 15, б) оценка для символа «B» равна 6

Алгоритм сегментации не всегда выделяет символ минимальным охватывающим прямоугольником. Поэтому при наложении растров возникает необходимость смещать эталон относительно растра символа. Оценка вычисляется для исходного положения эталона на растре и для всех случаев смещения эталона относительно растра символа в восьми направлениях на три пикселя (рисунок 2.15).

Рисунок 2.16 ? Смещение эталона относительно растра символа

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

2.3 Резюме

В ходе работы были разработаны алгоритмы и на их основании реализованы методы предварительной обработки изображения автомобильного номерного знака, сегментации и распознавания символов.

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

Заключение

В результате курсовой работы был разработан и реализован алгоритм распознавания автомобильных номерных знаков. Метод имеет приемлемую точность распознавания и высокое быстродействие.

В ходе работы были изучены существующие математические методы распознавания символов. Результаты проведенного анализа использовались при разработке алгоритма.

В перспективе обобщение метода распознавания для нескольких типов автомобильных номерных знаков, объединение с программой локализации номерной пластины, тестирование совместной работы.

Список использованных источников

1. ГОСТ 50577-93. Знаки государственные регистрационные транспортных средств типы и основные размеры. Технические требования. Введен 01.01.94. - М.: Издательство стандартов. - 33 стр.

2. А.Л. Горелик, В.А. Скрипкин. Методы распознавания. М.: Высшая школа, 1989.

3. Арлазаров В.Л., Троянкер В.В., Котович Н.В. Адаптивное распознавание символов. [Электронный ресурс]. - http://www.ocrai.narod.ru/adaptive.html.

4. В.Н. Вапник, А.Я. Червоненкис. Теория распознавания образов. М.: Наука, 1974. -- 416 с.

5. Ш.-К. Чэн. Принципы проектирования систем визуальной информации М.: Мир, 1994.

6. Лукошенко Г.Н. Распознавание скелетных образов. [Электронный ресурс]. - http://www.ocrai.narod.ru/skeletrecognize.html

7. Саймон Хайкин. Нейронные сети. Полный курс. - М.: Вильямс, 2005. - 1104 стр.

Приложение 1

unit uMain;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Mask, ExtCtrls, Buttons;

type

TfmMain = class(TForm)

Bevel1: TBevel;

Image1: TImage;

SpeedButton1: TSpeedButton;

MaskEdit1: TMaskEdit;

dlgCommon: TOpenDialog;

Bevel2: TBevel;

Label1: TLabel;

SpeedButton2: TSpeedButton;

Button1: TButton;

Panel1: TPanel;

Image2: TImage;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

procedure MaskEdit1Change(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

procedure SpeedButton2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

procedure Draw(digit : Byte; X, Y : Integer);

function Parce1(X : Integer): Boolean;

function Parce2(Y , x1, x2 : Integer): Boolean;

function Parce3(x1, y1, x2, y2 : Integer): String;

function ParceBMP(Canvas1 : TCanvas): String;

public

{ Public declarations }

end;

var

mas: array[0..9, 0..8] of byte =

(((1),(1),(1),(0),(0),(1),(0),(1),(1)),

((0),(0),(1),(1),(0),(0),(0),(1),(0)),

((0),(1),(1),(0),(0),(0),(1),(0),(1)),

((0),(1),(0),(1),(1),(0),(1),(0),(0)),

((1),(0),(1),(0),(1),(0),(0),(1),(0)),

((1),(1),(0),(0),(1),(0),(0),(1),(1)),

((0),(0),(0),(1),(1),(1),(0),(1),(1)),

((0),(1),(0),(1),(0),(1),(0),(0),(0)),

((1),(1),(1),(0),(1),(1),(0),(1),(1)),

((1),(1),(1),(0),(1),(0),(1),(0),(0)));

var

fmMain: TfmMain;

implementation

{$R *.dfm}

{ TForm1 }

procedure TfmMain.Draw(digit: Byte; X, Y: Integer);

procedure DrawElement(index : Byte);

begin

with Image1.Canvas do

case index of

0:

begin

MoveTo(X, Y);

LineTo(X, Y + 20);

end;

1:

begin

MoveTo(X, Y);

LineTo(X + 20, Y);

end;

2:

begin

MoveTo(X + 20, Y);

LineTo(X + 20, Y+ 20);

end;

3:

begin

MoveTo(X + 20, Y);

LineTo(X, Y + 20);

end;

4:

begin

MoveTo(X, Y + 20);

LineTo(X + 20, Y + 20);

end;

5:

begin

MoveTo(X, Y + 20);

LineTo(X, Y + 40);

end;

6:

begin

MoveTo(X + 20, Y + 20);

LineTo(X, Y + 40);

end;

7:

begin

MoveTo(X + 20, Y + 20);

LineTo(X + 20, Y + 40);

end;

8:

begin

MoveTo(X, Y + 40);

LineTo(X + 20, Y + 40);

end;

end;

end;

var

i: Byte;

begin

for i := 0 to 8 do

begin

if mas[digit][i]=1

then DrawElement(i);

end;

end;

procedure TfmMain.MaskEdit1Change(Sender: TObject);

var

i: Byte;

begin

// стирание изображения

image1.Canvas.Brush.Color := clWhite;

image1.Canvas.FillRect(rect(0,0,image1.Width,image1.Height));

if length(MaskEdit1.Text) <> 0 then

for i := 1 to length(MaskEdit1.Text) do

begin

if MaskEdit1.Text[i] <> ' ' then

Draw(StrToInt(MaskEdit1.Text[i]),40 * i - 30 ,10);

end;

end;

///сохраниение в файле

procedure TfmMain.SpeedButton1Click(Sender: TObject);

begin

dlgCommon.Title := 'Save';

dlgCommon.Filter := 'BMP (*.bmp)|*.bmp';

dlgCommon.InitialDir := ExtractFileDir(ParamStr(0));

if dlgCommon.Execute then

begin

if AnsiUpperCase(ExtractFileExt(dlgCommon.FileName)) <> '.BMP'

then dlgCommon.FileName := dlgCommon.FileName + '.bmp';

Image1.Picture.SaveToFile(dlgCommon.FileName);

end;

end;

/////распознавание

procedure TfmMain.SpeedButton2Click(Sender: TObject);

begin

//открытие файла на рапознавание

dlgCommon.Title := 'Open';

dlgCommon.Filter := 'BMP (*.bmp)|*.bmp';

dlgCommon.InitialDir := ExtractFileDir(ParamStr(0));

if dlgCommon.Execute then

begin

Image2.Picture.LoadFromFile(dlgCommon.FileName);

end;

end;

function TfmMain.Parce1(X: Integer): Boolean;

var

i : Integer;

begin

Result := False;

with Image2.Picture do

for i := 0 to Bitmap.Height - 1 do

if Bitmap.Canvas.Pixels[x,i] = clBlack

then

begin

Result := True;

Break;

end;

end;

function TfmMain.Parce2(Y, x1, x2: Integer): Boolean;

var

i : Integer;

begin

Result := False;

with Image2.Picture do

for i := x1 to x2 do

if Bitmap.Canvas.Pixels[i,y] = clBlack

then

begin

Result := True;

Break;

end;

end;

procedure TfmMain.Button1Click(Sender: TObject);

var

i, q1, q2, j : Integer;

str1 : String;

begin

q1 := 0;

q2 := 0;

//сканирование картинки на предмет черной области (цифры)

with Image2.Picture do

for i := 2 to Bitmap.Width - 3 do

begin

if (not Parce1(i - 2)) and (not Parce1(i - 1)) and Parce1(i) and Parce1(i + 1) then q1 := i;

if Parce1(i - 1) and Parce1(i) and (not Parce1(i + 1)) and (not Parce1(i + 2))

then

for j := 2 to Bitmap.Height - 3 do

begin

if (not Parce2(j - 2,q1,i)) and (not Parce2(j - 1,q1,i)) and Parce2(j,q1,i) and Parce2(j + 1,q1,i) then q2 := j;

if Parce2(j - 1,q1,i) and Parce2(j,q1,i) and (not Parce2(j + 1,q1,i)) and (not Parce2(j + 2,q1,i))

then

str1 := str1 + Parce3(q1,q2,i,j);

end;

end;

MessageDlg('Распознанное число: '+str1, mtInformation, [mbOK], 0);

end;

function TfmMain.Parce3(x1, y1, x2, y2: Integer): string;

var

bmp : TBitmap;

begin

//распознавание конкретной области

//рисование красной рамки

Result := '';

with Image2.Picture.Bitmap do

begin

Canvas.Pen.Color := clRed;

Canvas.MoveTo(x1-1, y1-1);

Canvas.LineTo(x2+1, y1-1);

Canvas.LineTo(x2+1, y2+1);

Canvas.LineTo(x1-1, y2+1);

Canvas.LineTo(x1-1, y1-1);

end;

bmp := TBitmap.Create; //создание объекта картинки

bmp.Height := 40;

bmp.Width := 21;

//масштабирование картинки к 20х40

try

StretchBlt(bmp.Canvas.Handle, //<<<------- куда копировать

0,

0,

21,

40,

Image2.Picture.Bitmap.Canvas.Handle,

x1,

y1,

x2 - x1+1,

y2 - y1+1,

SRCCOPY);

Result := ParceBMP(bmp.Canvas);

finally

bmp.Free;

end;

end;

function TfmMain.ParceBMP(Canvas1: TCanvas): String;

var

tmpset : set of Byte; //множество

i, j : Byte;

tmp : Boolean;

begin

//распознавание картинки 20х40

tmpset := [];

Result := '';

with Canvas1 do

begin

if (Pixels[0,10] = clBlack) or

(Pixels[0,11] = clBlack) or

(Pixels[0,9 ] = clBlack) or

(Pixels[1,10] = clBlack)

then Include(tmpset,0);

if (Pixels[10,0] = clBlack) or

(Pixels[ 9,0] = clBlack) or

(Pixels[11,0] = clBlack) or

(Pixels[10,1] = clBlack)

then Include(tmpset,1);

if (Pixels[20,10] = clBlack) or

(Pixels[20, 9] = clBlack) or

(Pixels[20,11] = clBlack) or

(Pixels[19,10] = clBlack)

then Include(tmpset,2);

if (Pixels[10,10] = clBlack) or

(Pixels[11,10] = clBlack) or

(Pixels[ 9,10] = clBlack) or

(Pixels[10, 9] = clBlack) or

(Pixels[10,11] = clBlack)

then Include(tmpset,3);

if (Pixels[10,20] = clBlack) or

(Pixels[ 9,20] = clBlack) or

(Pixels[11,20] = clBlack) or

(Pixels[10,21] = clBlack) or

(Pixels[10,19] = clBlack)

then Include(tmpset,4);

if (Pixels[0,30] = clBlack) or

(Pixels[0,29] = clBlack) or

(Pixels[0,31] = clBlack) or

(Pixels[1,30] = clBlack)

then Include(tmpset,5);

if (Pixels[10,30] = clBlack) or

(Pixels[11,30] = clBlack) or

(Pixels[ 9,30] = clBlack) or

(Pixels[10,29] = clBlack) or

(Pixels[10,31] = clBlack)

then Include(tmpset,6);

if (Pixels[20,29] = clBlack) or

(Pixels[20,30] = clBlack) or

(Pixels[20,31] = clBlack) or

(Pixels[19,30] = clBlack)

then Include(tmpset,7);

if (Pixels[ 9,40] = clBlack) or

(Pixels[10,40] = clBlack) or

(Pixels[11,40] = clBlack) or

(Pixels[10,39] = clBlack)

then Include(tmpset,8);

end;

for i := 0 to 9 do

begin

tmp := True;

for j := 0 to 8 do

if (mas[i,j] = 0) and (j in tmpset)

then tmp := False;

if tmp then

begin

Result:=IntToStr(i); //результирующая цифра

Break;

end;

end;

end;

end.

Размещено на Allbest.ru


Подобные документы

  • Методы предобработки изображений текстовых символов. Статистические распределения точек. Интегральные преобразования и структурный анализ. Реализация алгоритма распознавания букв. Анализ алгоритмов оптического распознавания символов. Сравнение с эталоном.

    курсовая работа [2,1 M], добавлен 20.09.2014

  • Процессы распознавания символов. Шаблонные и структурные алгоритмы распознавания. Процесс обработки поступающего документа. Обзор существующих приложений по оптическому распознаванию символов. Определение фиксированного шага и сегментация слов.

    дипломная работа [3,3 M], добавлен 11.02.2017

  • Оптико-электронная система идентификации объектов подвижного состава железнодорожного транспорта. Автоматический комплекс распознавания автомобильных номеров. Принципы и этапы работы систем оптического распознавания. Особенности реализации алгоритмов.

    дипломная работа [887,3 K], добавлен 26.11.2013

  • Проектирование приложения на языке С# в среде Microsoft Visual Studio 2008: составление алгоритмов сегментации текста документа и распознавания слова "Указ" в нем, создание архитектуры и интерфейса программного обеспечения, описание разработанных классов.

    курсовая работа [2,4 M], добавлен 05.01.2011

  • Разработка программного приложения на С#, распознающее буквы и цифры с фотографии автомобильного номера. Алгоритм работы с изображением: коррекция яркости, избавление от шума камеры, повышение резкости границ, бинаризация, сегментация и распознавание.

    контрольная работа [942,6 K], добавлен 22.01.2015

  • Обзор существующих алгоритмов для обнаружения лиц. Выравнивание лица с помощью разнообразных фильтров. Использование каскадного классификатора Хаара для поиска лиц на изображении. Распознавание лиц людей с использованием локальных бинарных шаблонов.

    дипломная работа [332,4 K], добавлен 30.09.2016

  • Обзор основных алгоритмов и методов распознавания лиц. Архитектура средств динамического отслеживания лиц в видеопоследовательности. Результаты тестирования на больших объемах видеоданных. Разработка алгоритмов и методов динамического отслеживания лиц.

    дипломная работа [5,9 M], добавлен 20.07.2014

  • Понятие и особенности построения алгоритмов распознавания образов. Различные подходы к типологии методов распознавания. Изучение основных способов представления знаний. Характеристика интенсиональных и экстенсиональных методов, оценка их качества.

    презентация [31,6 K], добавлен 06.01.2014

  • Необходимость в системах распознавания символов. Виды сканеров и их характеристики. Оптимальное разрешение при сканировании. Программы распознавания текста. Получение электронного документа. FineReader - система оптического распознавания текстов.

    презентация [469,2 K], добавлен 15.03.2015

  • Оптическое распознавание символов как механический или электронный перевод изображений рукописного, машинописного или печатного текста в последовательность кодов. Компьютерные программы для оптического распознавания символов и их характеристика.

    презентация [855,2 K], добавлен 20.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.