Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МОЙ ДИПЛОМ.doc
Скачиваний:
140
Добавлен:
17.05.2015
Размер:
1.16 Mб
Скачать

2.2. Распознавание линий

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

Для начала найдем все объекты на карте и с помощью специальной функции пронумеруем их:

clearvars labeled num stats;

[labeled,num] = bwlabel(gray,8);

stats = regionprops(labeled, 'Area','BoundingBox');

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

У каждого объекта есть своя область, в которой он находится (Рис. 3.). Мы будем очень часто использовать их в своей работе.

Рис. 3. Области различных объектов.

У каждого объекта также есть свой объем. После рассуждений можно прийти к выводу, что линия занимает очень малый объем в своей области. По этому свойству ее можно легко определить. Но есть мы будем уже выделенный нами элемент (например первый), затем вычисляем его площадь и сравниваем эту площадь с площадью его области. Если это отношение большое, то перед нами линия, если маленькое, то цифра. Линии мы стираем и образуем матрицу чисел.

for i=1:num

if (stats(i).Area/(stats(i).BoundingBox(3)*stats(i).BoundingBox(4)))<0.1

for xx=min(ceil(stats(i).BoundingBox(1)),Nx):min(ceil(stats(i).BoundingBox(1)+stats(i).BoundingBox(3)-1),Nx)

for yy=min(ceil(stats(i).BoundingBox(2)),Ny):min(ceil(stats(i).BoundingBox(2)+stats(i).BoundingBox(4)-1),Ny)

if labeled(yy,xx)==i

grayN(yy,xx)=0;

end

end

end

end

end

Затем получаем карту линий, из общей карты вычитаем карту цифр.

grayL=gray.*~grayN;

[labeledL,numL] = bwlabel(grayL,8);

statsL = regionprops(labeledL, 'EulerNumber');

enumL=zeros(numL,1);

for i=1:numL

enumL(i)=statsL(i).EulerNumber;

end

2.2. Распознавание цифр

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

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

Лучше применим метод ................................ Все цифры - 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 разные. Они имеют разные свойства, по разному нарисованы, каждая из ни индивидуальна, поэтому для каждой можно придумать свойство, которое отличало бы ее от других, причем эти свойства не должны зависеть от угла наклона цифры.

Среда программирования MatLab имеет множество функций, которые бы помогут нам в реализации задуманного. А сейчас выявим эти свойства.

Во первых стоит заметить цифру 8, ее можно легко определить из ряда других чисел по числу Эйлера. Число Эйлера равно числу объектов на изображении минус количество дыр в этих объектах. В цифре 8 две дыры и больше таких цифр нет. Для определения числа Эйлера в MatLab есть специальные функции:

enum(i)=stats(i).EulerNumber;

if (enum(i)==-1)

definenum=8; sign=1;

end

Из части кода мы видим, что если программа вычислила число Эйлера и оно равно -1, то перед ней цифра 8.

Далее будем работать с теми цифрами, число Эйлера у которых 0, то есть 1 дыра - это 4, 6, 9, 0. У каждой из цифр есть своя область, в которой она находится, в зависимости от наклона эти области меняются (Рис 3.).

Рис. 3. Области цифр, в зависимости от наклона.

Далее мы будем использовать области ццифр для выявления индивидуальных свойств 4 и 0, у этих цифр разное отношение заполненной части к незаполненной в своей области, в которой находится цифра.

if (enum(i)==0)&&(extent(i)>0.72)&&(sign==0)

definenum=4; sign=1;

end

if (enum(i)==0)&&(extent(i)<0.62)&&(sign==0)

definenum=0; sign=1;

end

Из кода мы видим, что у 4 это отношение не зависимо от угла наклона больше 0.72, а у 0 меньше 0.62.

Самое сложное - это найти отличия 6 от 9. Эти числа абсолютно одинаковые по форме, объему и прочим показателям. 6 есть перевернутая 9. Поэтому мы придумаем новый способ. У 6 и 9 заполенность входит в границы от 0.63 до 0.71. И если компьютер вычислил место на карте с числом Эйлера 0 и входящией в границы заполненностью, то мы будем рисовать в области цифры круг (Рис. 4.).

Рис. 4. Свойства 9 и 6.

После этой операции, как мы видим на рисунке, у 9 остается число Эйлера равным 0, а у 6 оно изменяется и становиться -1, то есть дырка пропадает.

Для рисования круга мы используем код:

if (enum(i)==0)&&(extent(i)>0.63)&&(extent(i)<0.71)&&(sign==0)

[rr cc] = meshgrid(1:Nx,1:Ny);

centrx=xx(i)+cos(orient(i))*rad(i)/3.5;

centry=yy(i)-sin(orient(i))*rad(i)/3.5;

C2 = (sqrt((rr-centrx).^2+(cc-centry).^2)<=(rad(i)/2.5));

newnumb=C2|numb;

[labeled3,num3] = bwlabel(newnumb,8);

stats3 = regionprops(labeled3, 'EulerNumber');

А затем, с помощью нового числа Эйлера мы определим что за цифра перед нами - 6 или 9.

if stats3(i).EulerNumber==1

definenum=6; sign=1;

end

if stats3(i).EulerNumber<1

definenum=9; sign=1;

end

Следующие цифры, которые мы будем искать на карте - это 1, 7, 5, 3, то есть те, у кого число Эйлера = -1, нет дыр.

С помощью эксцентриситета из оставшихся цифр выделим 1 и 7. Эксцентриситет — числовая характеристика объекта, показывающая степень его отклонения от окружности. У окружности эксцентриситет равен 0, а у линии 1. 1 и 7 очень вытянутые цифры. Далее, чтобы отличить их между собой мы ???? бред

if (enum(i)==1)&&(eccen(i)>0.93)&&(meanN(i)==-1)

meanN(i)=1;orient(i)=orient(i)-0.1015;

end

if (enum(i)==1)&&(eccen(i)>0.85)&&(convex(i)>0.44)&&(meanN(i)==-1)

meanN(i)=7; orient(i)=orient(i)+0.1881;

end

Остались только 2, 3 5. 2 и 3 также круглишочками. в уголке 2ки рисуем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]