- •Введение
- •1. Обзор предметной области
- •1.1 Методы бинаризации
- •1.2 Способы сегментации
- •1.3 Способы распознавания
- •2. Постановка задачи
- •3. Адаптация и описание используемых алгоритмов
- •3.1 Сегментация изображения методом выделения краев
- •3.2 Бинаризация пороговым методом
- •3.3 Выделение контуров (метод «Жук»)
- •3.4 Распознавание
- •4. Программная реализация
- •4.1 Схема программного обеспечения
- •4.2 Описание функций и методов
- •4.3 Тестирование и руководство для пользователя
- •15 Заключение
- •16 Литература
15 Заключение
В процессе работы над курсовым проектом были опробованы различные методы обработки изображения и распознавания из изображения чертежа.
Было разработано приложение под OS Windows с помощью среды разработки Visual Studio 2015 на объектно-ориентированном языке программирования C#. Проанализировав полученные результаты, можно сделать вывод о том, что данная программа позволяет распознавать такие обозначения сборочного чертежа как вид и габаритные размеры на изображении чертежа.
Тестирование приложения позволило сделать следующие выводы:
1. Метод бинаризации с заданием порога подходит для перевода полутонового изображения в бинарное.
2. Персептрон работает неплохо, так как результат его работы зависит от качества бинаризации.
Разработанное приложение работает не на 100%, так как результат зависит от подаваемого на вход изображения.
Результат распознавания зависит от качества сканирования чертежа. Улучшить результат распознавания можно путем комбинирования порога бинаризации.
Разработанное приложение для оцифровки чертежей актуально в настоящее время, так как это связано с развитием систем автоматизированного проектирования, которые способны интерпретировать векторный формат. Данное приложение позволяет распознавать такие обозначения сборочного чертежа как вид и габаритные размеры, что может быть весьма полезным в случае возникновения необходимости учета этой информации в базе данных.
16 Литература
- Конспект лекций по дисциплине «Методы распознавания образов». Ковалёва И.Л., 2015 г.
- Методические указания к лабораторным работам «ПЕРСЕПТРОННЫЕ НЕЙРОСЕТИ» Ковалёва И.Л., 2009 г.
- Горелик А.Л. Методы распознавания: учеб. пособие для вузов / А.Л.Горелик, В.А.Скрипкин. – 3-е изд., перераб. и доп. – М.: Высш.шк., 1989 – 234 с.
- Гренандер У. Лекции по теории образов: в 3-х т./ У. Гренандер; под ред. Ю.И. Журавлева. – М.: Мир, 1979-1983 – 1267 с.
- Реализация метода «Жук» - http://wiki.technicalvision.ru/
17
Приложение 1. Схема IDEF трех уровней и UML диаграмма классов.
Загрузка изображения чертежа
Сегментация методом краев
Бинаризация пороговым методом
Оконтуривание (метод «Жук»)
Персептрон или метод ближайшего соседа
Центрирование контуров
Сканированное изображение чертежа
Распознавание обозначения вида и габаритных размеров на изображении сборочного чертежа
Результат распознавания
Набор эталонных изображений
Windows приложение
Рис. 1 – Схема IDEF (первый уровень)
Диалоговое окно
Сегментация
Сегментация методом краев
Бинаризация
Бинаризация пороговым методом
Сканированное изображение чертежа
Загрузка изображения
Загрузка изображения (*.bmp)
Сегментированное изображение
Бинарное изображение
Кнопка Open
Кнопка Find Areas
Кнопка Binarization
Оконтуривание
Кнопка Bug
Массив
контуров
Кнопка Centering
Оконтуривание (метод «Жук»)
Метод центрирования
Распознавание контуров
Персептрон или метод ближайшего соседа
Массив центрированных контуров
Центрирование контуров
Ответ
Кнопка Full answer или Next neighbor
Рис. 2 – Схема IDEF (второй уровень)
18
Загруженное изображение (*.bmp)
Сегментация методом краев
Сегментация
Подсчет количества перепадов внизу, справа и вверху от краев чертежа
Две координаты по вертикали и одна по горизонтали
Выделение областей интереса
Области для дальнейшей обработки
Кнопка Find Areas
Нахождения координат крайних точек символов слева, справа, вверху и внизу
Обрезка
Кнопка Centering
Вставка контура в картинку 50х50
Центрирование
Массив центрированных контуров
Массив контуров
Обрезанные контуры
Рис. 3 – Схема IDEF (третий уровень)
Рисунок 4 — UML диаграмма классов
19
Приложение 2. Исходный код класса Recognition
public class Recognition
{
private Bitmap Picture { get; set; }
private PictureBox PicBox { get; set; }
private Bitmap[] Areas = new Bitmap[3];
private int top;
private int right;
private int bottom;
public Bitmap Symbol;
public List<Bitmap> Bottom = new List<Bitmap>();
public List<Bitmap> Right = new List<Bitmap>();
public Recognition(PictureBox pic)
{
this.PicBox = pic;
}
public void OpenPicture()
{
using (OpenFileDialog openDialog = new OpenFileDialog())
{
openDialog.Filter = "All files (*.bmp)|*.bmp;";
openDialog.Multiselect = false;
if (openDialog.ShowDialog() == DialogResult.OK)
{
Picture = new Bitmap(openDialog.FileName);
PicBox.Image = Picture;
}
GC.Collect();
}
GC.WaitForPendingFinalizers();
}
public void FindArea() {…}
public void Binarization() {…}
public void Bug2() {…}
public Bitmap Bug3(int ii, int jj, Bitmap bmp, ref int delt) {…}
public void Centering() {…}
private Bitmap Center(Bitmap bmp) {…}
public void SavePicture()
{
using (SaveFileDialog saveDialog = new SaveFileDialog())
{
saveDialog.Filter = "All files (*.bmp)|*.bmp;";
if (saveDialog.ShowDialog() == DialogResult.OK)
{
PicBox.Image.Save(saveDialog.FileName);
}
GC.Collect();
}
GC.WaitForPendingFinalizers();
}
}
20
Приложение 3. Исходный код класса Perseptron
public class Perseptron
{
public List<Bitmap> StandardN = new List<Bitmap>();
public List<Bitmap> StandardS = new List<Bitmap>();
public int[,] TableSN = new int[2512, 120];
public int[,] TableSS = new int[2512, 120];
public string[] cla = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
public string[] clA = { "А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "К" };
XMLINFO changesN = new XMLINFO();
XMLINFO changesS = new XMLINFO();
public XMLINFO CreateXML() {…}
public XMLINFO UseXML(string xml)
{
XMLINFO x = new XMLINFO();
var reader = new System.Xml.Serialization.XmlSerializer(typeof(XMLINFO));
var file = new System.IO.StreamReader(xml);
x = (XMLINFO)reader.Deserialize(file);
file.Close();
if (xml == "N.xml")
{
changesN.massivA = x.massivA;
changesN.massivL = x.massivL;
}
else
{
changesS.massivA = x.massivA;
changesS.massivL = x.massivL;
}
return x;
}
public void SaveChanges()
{
var writer = new System.Xml.Serialization.XmlSerializer(typeof(XMLINFO));
var wfile1 = System.IO.File.Create("N.xml");
var wfile2 = System.IO.File.Create("S.xml");
writer.Serialize(wfile1, changesN);
writer.Serialize(wfile2, changesS);
wfile1.Close();
wfile2.Close();
}
public void Preparation(XMLINFO x) {…}
public void LoadStanart() {…}
public string YesNo(Bitmap bmp, string[] e, ref int[,] Table) {…}
public void Studying() {…}
public void StudyingN(string s, string[] e, ref int[][] l, ref int[,] Table) {…}
}
21
Приложение 4. Исходный код класса Next neighbor
public class Next_neighbor
{
private double[] distance;
public string Distance(List<Bitmap> bmp, Bitmap bp, string[] ans)
{
distance = new double[bmp.Count];
for (byte k = 0; k < bmp.Count; k++)
{
double r = 0;
for (byte i = 0; i < bmp[k].Height; i++)
for (byte j = 0; j < bmp[k].Width; j++)
r += Math.Pow(bmp[k].GetPixel(i, j).R - bp.GetPixel(i, j).R, 2);
distance[k] = Math.Pow(r, 0.5);
}
return ans[Array.IndexOf(distance, distance.Min())];
}
}
22