Описание функций и методов
Класс Recognition имеет следующие методы:
- OpenPicture – выполняет загрузку изображения;
- FindArea – позволяет получить области для распознавания;
- Binarization – выполняет бинаризацию полученных областей;
- Bug – выполняет выделение контура;
- Centering – выполняет центрирование контуров.
Класс Perseptron имеет следующие методы:
- Preparation – подготовка таблиц А-элементов и λ;
- Studying – обучение персептрона;
- SaveChanges – запись настроенных λ в XML файл.
Класс Next neighbor имеет следующие методы:
- Distance – производит расчет евклидового расстояния.
Тестирование и руководство для пользователя
После запуска приложения пользователь увидит главное окно приложения на рисунке 4.1.
Рис 4.1 – Главное окно
Рис 4.2 – Открытие изображения чертежа с помощью кнопки Open
Затем пользователь увидит, что изображение загружено в главное окно. Результат выполнения приведен на рисунке 4.3.
Рис 4.3 – Изображение загружено в главное окно
Далее необходимо выполнить последовательную обработку этого изображения, нажав следующие кнопки: Find Areas, Binarization, Bug, Centering.
Пользователь увидит в PictureBox полученные и обработанные контуры, которые осталось распознать. Это можно сделать двумя способами: с помощью персептрона, нажав кнопку Full Answer или с помощью метода ближайшего соседа, нажав Next neighbor. Также персептрон можно предварительно обучить на основании эталонов, нажав Perseptron.
Результат работы приведен на рисунке 4.4.
Рис 4.4 – Результат распознавания
Результат работы программы можно сбросить, нажав Reset и загрузить изображение чертежа снова.
ЗАКЛЮЧЕНИЕ
В процессе работы над курсовым проектом были опробованы различные методы обработки изображения и распознавания из изображения чертежа.
Было разработано приложение под OS Windows с помощью среды разработки Visual Studio 2015 на объектно-ориентированном языке программирования C#. Проанализировав полученные результаты, можно сделать вывод о том, что данная программа позволяет распознавать такие обозначения сборочного чертежа как вид и габаритные размеры на изображении чертежа.
Тестирование приложения позволило сделать следующие выводы:
1. Метод бинаризации с заданием порога подходит для перевода полутонового изображения в бинарное.
2. Персептрон работает неплохо, так как результат его работы зависит от качества бинаризации.
Разработанное приложение работает не на 100%, так как результат зависит от подаваемого на вход изображения.
Результат распознавания зависит от качества сканирования чертежа. Улучшить результат распознавания можно путем комбинирования порога бинаризации.
Разработанное приложение для оцифровки чертежей актуально в настоящее время, так как это связано с развитием систем автоматизированного проектирования, которые способны интерпретировать векторный формат. Данное приложение позволяет распознавать такие обозначения сборочного чертежа как вид и габаритные размеры, что может быть весьма полезным в случае возникновения необходимости учета этой информации в базе данных.
ЛИТЕРАТУРА
- Конспект лекций по дисциплине «Методы распознавания образов». Ковалёва И.Л., 2015 г.
-Методические указания к лабораторным работам «ПЕРСЕПТРОННЫЕ НЕЙРОСЕТИ» Ковалёва И.Л., 2009 г.
- Горелик А.Л. Методы распознавания: учеб. пособие для вузов / А.Л.Горелик, В.А.Скрипкин. – 3-е изд., перераб. и доп. – М.: Высш.шк., 1989 – 234 с.
- Гренандер У. Лекции по теории образов: в 3-х т./ У. Гренандер; под ред. Ю.И. Журавлева. – М.: Мир, 1979-1983 – 1267 с.
- Реализация метода «Жук» - http://wiki.technicalvision.ru/
Приложение 1. Схема IDEF трех уровней и UML диаграмма классов.
Рис. 1 – Схема IDEF (первый уровень)
Рис. 2 – Схема IDEF (второй уровень)
Рис. 3 – Схема IDEF (третий уровень)
Рисунок 4 — UML диаграмма классов
Приложение 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();
}
}
Приложение 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) {…}
}
Приложение 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())];
}
}
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|