
- •Федеральное агентство железнодорожного транспорта
- •Дипломный проект
- •Реферат
- •Содержание введение
- •1. Теоретические сведения и методы решения задачи
- •1.2. Среда программирования matlab
- •1.3. Распознавание образов
- •2. Разработка и написание программы
- •2.1. Алгоритмы работы программы
- •2.2. Обработка изображения
- •2.2. Распознавание линий
- •2.2. Распознавание цифр
- •2.3. Сопоставление данных
- •2.4. Построение 3d моделей
- •2.5. Разработка интерфейса
- •6 Расчёт экономической эффективности
- •6.1 Расчёт единовременных затрат
- •6.2 Текущие (эксплуатационные) затраты по «старой» технологии.
- •6.2 Текущие (эксплуатационные) затраты по «новой» технологии.
- •6.3 Годовой приток денежных средств
- •6.3 Расчет оценочных показателей проекта
- •Заключение приложение а
2. Разработка и написание программы
2.1. Алгоритмы работы программы
Перед написанием программы необходимо продумать алгоритм ее работы, построить соответствующие блок-схемы (Рис.10).
Для начала необходимо загрузить изображение карты в программу. Любое изображение в MatLab представляется в виде массива с числами. После получения этого массива нам необходимо нужным образом его обработать. Топографическая карта обычно выполнена в полно цветном варианте, линии рельефа и все цифры выполнены одним цветом. Поэтому, зная цвета линий и цифр, мы можем их выделить из числа других объектов на карте, и преобразовать наше растровое изображение в логический формат, то есть в новую матрицу. Эта матрица будет представлять собой значения только 1 и 0 – там, где находиться линия или число – 1, а там, где остальные объекты 0.
Картинку вставить
Далее очистим новую матрицу от шумов. Это необходимо сделать, так как до преобразования на ней было множество посторонних элементов, ненужных нам, и которые могли остаться на карте.
Далее, из этой новой матрицы, с помощью специальных функций MatLab, мы определим все отдельные объекты и пронумеруем их. Затем выделим из всех найденных объектов линии по их свойствам (например, малая площадь самого объекта в области этого объекта). И если вычесть получившуюся матрицу линий из нашей первоначальной матрицы – получим матрицу цифр.
Распознаем каждую цифру по ее особенным свойствам (например, число Эйлера, эксцентриситет, центр масс и так далее), а затем соединим все полученные цифры в числа, составим новую матрицу чисел.
Следующим шагом, необходимо сопоставить все полученные нами данные – линии и числа, и также сформировать новую матрицу Z. Эта матрица будет содержать все высоты на карте.
По полученной матрице можно будет построить 3-D модель.
Рис. 10. Блок-схема работы программы
2.2. Обработка изображения
Для начала нам потребуется загрузить карту в MatLab для дальнейшей работы с ней. Для этого используем функцию imread.
f=imread('топографическая карта 1.jpg');
Теперь наша карта представлена с помощью массива f, в каждой ячейке которого указана интенсивность каждого пикселя. Топографические карты выполняются в цветном варианте, но рельеф и цифры изображаются черным цветом. Компьютеру в данном случае будет намного проще работать с черно-белым изображением, поэтому с помощью специальных функций программы переведем изображение в черно-белый вариант:
fR = f(:, : , 1);
fG = f(: , : , 2);
fB = f(:, : , 3);
gray=((fR>150)&(fG<150)&(fB<150));
Мы просто исключили красный, зеленый и синий цвета и сохранили новый массив. Далее с помощью функции size мы определяем размер изображения, который нам пригодиться в будущем. И найдем отдельные объекты на изображении используя специальную функцию bwlabel и найдем свойства этих объектов с помощью regionprops, то есть площадь Area и область объекта BoundingBox. только второй раз через пару страниц
[Ny,Nx]=size(gray);
[labeled,num] = bwlabel(gray,8);
stats = regionprops(labeled, 'Area','BoundingBox');
Очистим изображение от шума. Если есть в нашем изображении отдельные пиксели, вокруг которых нет других элементов, то он их удалит. И сохраним новый массив без шумов.
for i=1:num
if stats(i).Area<15
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
gray(yy,xx)=0;
end
end
end
end
end
grayN=gray;