КАЗАНСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ А.Н. ТУПОЛЕВА – КАИ
Кафедра автоматизированных систем обработки информации и управления
КУРСОВАЯ РАБОТА
по дисциплине
«ТЕХНОЛОГИЯ РАЗРАБОТКИ
ИНТЕЛЛЕКТУАЛЬНЫХ ИНФОРМАЦИОННЫХ СИСТЕМ »
Интеллектуальная информационная система
Сбором грибов
Руководитель: Исполнитель:
Доцент каф. АСОиУ Студент группы 4165
Зарайский С.А. Фазылзянов А.И.
_____________20__ ____________20__
Казань 2018 г.
Education and Science Ministry of Russian Federation
Kazan National Research Technical University
Named A. N. Tupolev
Department of Automated Systems for Information Processing & Control
COURSE WORK
Discipline: «RESEARCH PROJECT»
Theme: Intelligent information system for mushroom picking
Head of the work: Developer:
associate Professor of ASOIU student of group 4165
Zaraysjkiy S.A. Fazylzyanov A.I.
_____________20__ _____________20__
Kazan, 2018
ЗАДАНИЕ КУРСОВОЙ РАБОТЫ ПО ДИСЦИПЛИНЕ
«ТЕХНОЛОГИЯ РАЗРАБОТКИ
ИНТЕЛЛЕКТУАЛЬНЫХ ИНФОРМАЦИОННЫХ СИСТЕМ»
Фамилия, имя, отчество студента: Фазылзянов Айрат Илшатович, группа 4165.
Фамилия, имя, отчество руководителя: Зарайский С.А.
Тема курсовой работы и задачи: Интеллектуальная информационная система управления сбором грибов.
1. Построение классификатора граничных точек изображения грибов;
2. Управление системой сбором грибов.
Разработать функциональную структуру ИИС или ее части. Разработать или выбрать форму представления знаний, методы приобретения знаний и принятия решений. Определить структуру базы знаний. Разработать технологический процесс обработки информации. Разработать и отладить программные средства извлечения знаний и принятия решений (использовать С#). Подготовить контрольный пример базы знаний на магнитном носителе (использовать СУБД Access -2003).
СРОКИ КОНТРОЛЯ ВЫПОЛНЕНИЯ ПРОЕКТА
Срок завершения работы - 21.05.2018
Пояснительная записка предоставляется руководителю не позднее, чем за три дня до защиты для получения отзыва.
Дата выдачи задания ...............................
Подпись руководителя.............................
Подпись студента..................................
Содержание
ВВЕДЕНИЕ. 5
1. ФУНКЦИИ ИИС. 8
1.1. Внешние объекты и диаграммы окружения. 8
1.2. Данные, результаты, хранилища и логическая модель. 10
1.3. Задачи, функции и модель поведения. 12
2. ПОСТАНОВКИ ЗАДАЧ И МЕТОДЫ РЕШЕНИЯ. 14
2.1. Получение правил выделения границы грибов на изображении. 14
2.2. Использование системы для определения границ изображения. 17
2.3. Формирование сигналов для автомата сортировки грибов. 18
2.4. Формирование накладных и актов. 19
3. ИНФОРМАЦИОННОЕ ОБЕСПЕЧЕНИЕ ИИС. 22
3.1. Концептуальное проектирование базы данных. 22
3.2. Логическое проектирование базы знаний. 24
3.3. Создание базы знаний. 29
3.3.1. Определение показателя. 29
3.3.2. Определение факторов. 30
3.3.3. Проведение экспериментов и построение выборки значений. 32
3.3.4. Удаление признаков с неизвестными значениями. 34
3.3.5. Удаление факторов с постоянными значениями. 34
3.3.6. Устранение одинаковых элементов выборки. 35
3.3.7. Контроль значений признаков и восстановление ошибочных данных 37
3.3.8. Нормирование значений признаков. 38
3.3.9. Выбор информационных признаков. 40
3.3.10. Формирование обучающей и контролирующей выборок. 41
3.4. Формирование правил принятия решений. 44
4. ТЕХНОЛОГИЧЕСКИЙ ПРОЦЕСС ОБРАБОТКИ ДАННЫХ.. 52
4.1. Технология приобретения знаний. 52
4.2. Технология принятия решения. 53
5. ПРОГРАММНЫЕ СРЕДСТВА.. 54
5.1. Программные средства приобретения знаний. 54
5.2. Программные средства принятия решений. 55
Заключение. 66
Conclusion. 67
Приложение 1. Словарь терминов. 68
Приложение 2. Контрольный пример базы данных. 70
Приложение 3. Листинг Программы. 73
ВВЕДЕНИЕ
На современном этапе развития в грибном хозяйстве на новый уровень выходят автоматизированные системные решения, которые способны заменить трудовые ресурсы при проведении сбора урожая. Участие роботизированных машин в сельском хозяйстве позволяет повысить эффективность и производительность сбора урожая. Данная проблема актуальна, так как необходимо разработать такую систему, которая идентифицирует и классифицирует цели для роботизированных машин.
Разрабатываемая интеллектуальная информационная система предназначена для управления процессом сбора грибов в грибном хозяйстве для работников сборки грибов.
Рассматриваемая организация осуществляет деятельность по сборке грибов в лесах, примыкающих к пункту заготовки грибов артели заготовителей, вручную. Заготовители осуществляют сбор белых грибов и маслят в лесу без предварительной сортировки и доставляют грибы в корзинах на пункт заготовки грибов артели заготовителей. В одной корзине могут находиться грибы нескольких видов. Заготовители укладывают грибы на транспортер, который доставляет их в пункт сортировки. Далее определяются вес грибов каждого вида и сумма, которая будет выплачена заготовителю за сбор грибов.
Проблема деятельности организации заключается в необходимости большого количества заготовителей для сбора грибов, так как сезон появления грибов непродолжителен. Недостаток трудовых ресурсов приводит к тому, что часть грибов портится или остается не собранной. В связи с этим организация теряет часть своей прибыли, которую она могла бы получить, если бы вовремя успела собрать урожай. Чтобы решить данную проблему, необходимо усовершенствовать процесс организации сбора грибов путем процесса обработки информации изображения каждого собранного гриба и оценки его параметров по изображению для дальнейшей транспортировки до пункта сортировки грибного хозяйства.
Для многих культур уже есть решения по автоматизированной уборке урожая. Например, одним из самых крупных заготовителей овощей в России является компания ООО «СИТИ-сад», Краснодарский край. Для автоматизированной сортировки используется линия AWETA с мощностью до 4,5 т/ч.
Интеллектуальная информационная система управления сбором грибов приведет к существенной экономии времени и трудозатрат, а также повысит прибыль организации от уменьшения значительной части заготовителей (персонала). В данной работе используется именно интеллектуальная информационная система, потому что не существует формального четкого алгоритма определения границ объекта, в связи с этим необходимо производить обучение и применять методы искусственного интеллекта.
Таким образом, целью курсовой работы является разработка ИИС управления сбором грибов для увеличения прибыли заготовительного предприятия за счет повышения качества сортировки грибов. Для реализации данного решения необходимо решить следующие задачи:
1. Построение классификатора граничных точек изображения гриба;
2. Управление сбором грибов.
В первом разделе курсовой работы представлена функциональная структура автоматизированной интеллектуальной информационной системы сортировки грибов.
Во втором разделе представлены вербальная и формальная постановки задач, описание методов решения, примеры решения задач.
В третьем разделе описаны проектирование информационного обеспечения, концептуальное и логическое проектирование базы данных, кардинальность и избирательность связей, кодирование информации, классификаторы и кодификаторы информации, определение задач ведения базы данных, состав задач, операторы, документы, источники, расчет трудоемкости ведения базы данных.
В четвертом разделе представлен технологический процесс обработки данных, задачи принятия решения и ведения базы данных.
В пятом разделе представлена разработка программных средств, выбор системного программного обеспечения, инструментальные средства разработки прикладных программ, прикладное программное обеспечение, алгоритмы прикладных программ: алгоритмы пользовательского интерфейса, алгоритмы принятия решений.
ФУНКЦИИ ИИС
В данной главе представлены DFD диаграммы для модели окружения, логической модели и модели поведения.
Создание базы знаний
Выборка значений необходима для проведения аппроксимации неизвестной функции:
y = f ( x ).
Значение функции y определяет показатель, а аргументы, представленные вектором x - факторы.
Формирование обучающей и контролирующей выборки включает выполнение следующих этапов:
1. Определение показателя и его характеристик: единица измерения, точность, тип значений показателя и определить вариацию значений.
2. Установление факторов (связанных зависимостью с показателем) и их характеристики (единица измерения, точность, тип значений факторов); определить вариацию значений факторов.
3. Проведение экспериментов и построение выборки значений факторов и показателя.
4. Удаление признаков с неизвестными значениями.
5. Удаление признаков с постоянными значениями.
6. Устранение одинаковых элементов выборки и подсчетом их частоты.
7. Контроль значений признаков.
8. Нормирование факторов.
9. Определение множества наиболее информационных признаков.
10. Разбиение выборки на обучающую и тестирующую выборку.
Определение показателя
Показатель задается в задании курсовой работы или выбирается самостоятельно по согласованию с руководителем. Пример оформления выполнения этапа приведен в таблице 10.
Таблица 10. Характеристики целевого показателя
Целевой показатель | Обозначение | Единица измерения | Вариации и пояснение значений | Точность измерений | Тип |
Граница гриба | Y | - | {0, 1}, 0 – фон изображения, 1 – гриб. | - | Бинарный |
Определение факторов
Факторы, влияющие на значение показателя, задаются в задании курсовой работы или выбираются самостоятельно по согласованию с руководителем. Пример оформления выполнения этапа приведен в таблице 11.
Таблица 11. Характеристики факторов
Обозначение | Фактор | Единица измерения | Вариации | Точность измерений | Тип |
Х1 | Оценка мат. ожидания в окрестностях точки 5х5 без преобразования | - | [77; 255] | 1 | Целое |
Х2 | Несмещенная оценка дисперсии в окрестностях точки 5х5 без преобразования | - | [0;7001] | 1 | Целое |
Х3 | Мода в окрестностях точки 5х5 без преобразования | - | [82; 255] | 1 | Целое |
Таблица.11. Окончание
Х4 | Оценка мат. ожидания в окрестностях точки 5х5 (преобразование Собеля) | - | [0,134] | 1 | Целое | ||
Х5 | Несмещенная оценка дисперсии в окрестностях точки 5х5 (преобразование Собеля) | - | [0;15963] | 1 | Целое | ||
Х6 | Мода в окрестностях точки 5х5 (преобразование Собеля) | - | [0; 255] | 1 | Целое | ||
Х 7 | Оценка мат. ожидания в окрестностях точки 5х5 (LBP (ЛБШ)) | - | [0; 99] | 1 | Целое | ||
Х 8
[0,14739]
Х 9
[0,]
Технология принятия решения
Технологический процесс принятия решений представлен на рисунке 4.2.
Рис. 4.2. Технология принятия решения
ПРОГРАММНЫЕ СРЕДСТВА
Заключение
В данном проекте была разработана автоматизированная интеллектуальная информационная система сортировки грибов.
В процессе работы был произведен анализ предметной области и определены цели и задачи АИИС.
Был разработан технологический процесс обработки данных, концептуальное и логическое проектирование реляционной БД.
Была разработана программа для сортировки грибов.
Внедрение АИИС позволит сортировать грибы с минимальным привлечением человеческих ресурсов, что позволит в перспективе уменьшить затраты на сортировку, так же увеличится качество и скорость сортировки.
Conclusion
In this project, an automated intellectual information system for sorting mushrooms has been developed.
In the process of work, the domain was analyzed and AIIS goals and objectives were defined.
The technological process of data processing was developed, the conceptual and logical design of a relational database.
A program for sorting mushrooms was developed.
The introduction of AIIS will make it possible to sort the mushrooms with minimal human resources, which will in the long run reduce the cost of sorting, as will the quality and speed of sorting.
Приложение 1. Словарь терминов
Таблица «Словарь терминов»
Код понятия | Наименование понятия | Определение, пояснение |
0001 | Артель | Добровольное объединение людей для совместной работы или иной коллективной деятельности, часто с участием в общих доходах и общей ответственностью на основе круговой поруки. |
0002 | Белый гриб | Гриб из рода Боровик. |
0003 | Вид | Совокупность близких по происхождению организмов, относительно схожих в морфофизиологическом отношении |
0004 | Выплата | Выплаченные деньги. Очередные выплаты. |
0005 | Граница | Реальная или воображаемая линия в пространстве или во времени, отделяющая один объект (тело, процесс или состояние) от другого. |
0006 | Грибы | Царство живой природы, объединяющее эукариотические организмы, сочетающие в себе некоторые признаки как растений, так и животных. |
0007 | Доставка | Подача, поставка, снабжение, обеспечение. |
0008 | Заготовитель | Лицо, организация, производящие государственные или кооперативные заготовки чего-нибудь |
0009 | Закупочный акт | Составляется в двух экземплярах в момент совершения закупки сельхозпродуктов у населения (продавца) представителем организации. Подписывается лицом, закупившим продукты, и продавцом. Утверждается руководителем организации. |
0010 | Изображение | Одна из разновидностей информационной модели, в которой используется картинный (наглядный) способ представления информации оператору. |
0011 | Маслята | Род трубчатых съедобных грибов семейства Болетовые (лат. Boletaceae). Своё название получил из-за маслянистой, скользкой на ощупь шляпки. |
0012 | Накладная | Документ, используемый при передаче товарно-материальных ценностей от одного лица другому. |
0013 | Параметр | Величина, значения которой служат для различения элементов некоторого множества между собой. |
0014 | Получить | Взять, приобрести вручаемое, предлагаемое, искомое |
0015 | Процесс | Совокупность взаимосвязанных действий, приводящих к смене состояний |
0016 | Регистрировать | Записывать, отмечать с целью учёта, придания законной силы, научного наблюдения и т. п. |
0017 | Сбор грибов | Деятельность человека, направленная на поиск грибов. Является разновидностью собирательства. |
0018 | Сортировка | Процесс перегруппировки заданного множества объектов в некотором определенном порядке.Сортировка предпринимается для того, чтобы облегчить последующий поиск элементов в отсортированноммножестве. |
0019 | Сортировщик | Работник, отвечающий за работу конвейера. |
0020 | Сумма | Общее количество чего-нибудь. |
0021 | Транспортёр | Конвейер для перемещения грузов. |
0022 | Формирование | Создание, составление. |
0023 | Холодильная камера | Теплоизолированный контейнер, поддерживающий низкую температуру для хранения скоропортящихся продуктов питания и других веществ. |
Приложение 2. Контрольный пример базы данных
Рис. 1. Таблица «Выборка входных данных»
Рис. 2. Таблица «Признаки изображения»
Рис. 3. Таблица «Правила принятия решения»
Рис. 4. Таблица «Товар»
Рис. 5. Таблица «Контейнер»
Рис. 6. Таблица «Контейнеры в накладной»
Рис. 7. Таблица «Накладная»
Рис. 8. Таблица «Акт»
Рис. 9. Таблица «Контейнеры в Актах»
Приложение 3. Листинг Программы
namespace KurceWork
{
public partial class Form1 : Form
{
private Bitmap imageBitmap;
private MyImage image;
private MyImage[] images;
private bool isLoad = false;
private byte position = 0;
//private List<Nakladnaya> listNa = new List<Nakladnaya>();
private Nakladnaya na, act;
private List<Int32> goodBox = new List<Int32>();
private List<Int32> badBox = new List<Int32>();
private double badMas = 0;
private double goodMas = 0;
private int idNa = -1;
private int idAct = -1;
public Form1()
{
InitializeComponent();
openFileDialog1.Filter = "Image Files(*.BMP)|*.BMP";
folderBrowserDialog1.SelectedPath = "D:\\Program\\C Sharp\\Kurse_Work_IIS\\KurceWork\\KurceWork\\bin\\Debug\\images";
}
//загрузка изображения (старое)
private void oldLoadImage()
{
if (openFileDialog1.ShowDialog() == DialogResult.Cancel)
return;
//читаем изображение в битмап
imageBitmap = new Bitmap(openFileDialog1.FileName);
pictureBox1.Image = imageBitmap;
string name = openFileDialog1.FileName;
int t = name.LastIndexOf("\\");
Text = name.Substring(t + 1);
//исходное изображение в объект типа MyImage
image = new MyImage((Bitmap)pictureBox1.Image);
//устанавливаем первое преобразование (собель)
image.setFirstTransform(Transform.sobelTransform(image.getSrc()));
//устанавливаем второе преобразование (робертс)
image.setSecondTransform(Transform.robertsTransform(image.getSrc()));
//pictureBox1.Image = Transform.calculate(image);
pictureBox1.Image = Transform.anotherWay(image);
//pictureBox1.Image = Transform.secondAnotherWay(image);
//pictureBox1.Image = Transform.carrot();
//d
label1.Text = string.Format("D = {0:0.####}", image.getD());
//v
label2.Text = string.Format("V = {0:0.####}", image.getV());
//mas
label3.Text = string.Format("Mas = {0:0.####}", image.getMas());
//disp
label4.Text = string.Format("Disp = {0:0000}", image.getDisp());
//rotten
bool rotten = image.getDisp() > 1380 ? true : false;
label5.Text = string.Format("Rotten = {0}", rotten.ToString());
}
private void groupBox1_Enter(object sender, EventArgs e)
{
}
private void groupBox2_Enter(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void label5_Click(object sender, EventArgs e)
{
}
//загрузка папки с изображениями
private void button2_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.Cancel)
return;
//путь к папке
string folder = folderBrowserDialog1.SelectedPath;
//пути всех изображений в папке
string[] images = Directory.GetFiles(@folder, "*.bmp");
MyImage[] imagesFromFolder = new MyImage[images.Length];
goodBox.Clear();
badBox.Clear();
TestDB tdb = new TestDB();
//читаем изображение в битмап и устанавливаем преобразования
for (int i = 0; i < images.Length; i++)
{
Text = string.Format("Загрузка {0} изображения из {1}", (i+1), images.Length);
//загрузка оригинального изображения
imagesFromFolder[i] = new MyImage(new Bitmap(images[i]));
//сохранение первого преобразования
imagesFromFolder[i].setFirstTransform(Transform.sobelTransform(new Bitmap(images[i])));
//сохранение второго преобразования
imagesFromFolder[i].setSecondTransform(Transform.robertsTransform(new Bitmap(images[i])));
//сохранение результата
imagesFromFolder[i].setResult(Transform.anotherWay(imagesFromFolder[i]));
//установка id
imagesFromFolder[i].setId(i);
if (imagesFromFolder[i].getDisp() > 1450)
{
badMas += imagesFromFolder[i].getMas();
}
else
{
goodMas += imagesFromFolder[i].getMas();
}
}
Text = "";
pictureBox1.Image = imagesFromFolder[0].getResult();
position = 0;
isLoad = true;
//d
label1.Text = string.Format("Диаметр: {0:0.####}", imagesFromFolder[0].getD());
//v
label2.Text = string.Format("Объем: {0:0.####}", imagesFromFolder[0].getV());
//mas
label3.Text = string.Format("Вес: {0:0.####}", imagesFromFolder[0].getMas());
//disp
label4.Text = string.Format("Дисперсия: {0:0000}", imagesFromFolder[0].getDisp());
//rotten
string rotten = imagesFromFolder[0].getDisp() > 1450 ? "Белый" : "Маслята";
label5.Text = string.Format(rotten.ToString());
///////////////////////////////////////////////////////
//ящики
badBox.Add(tdb.save_Box(2, badMas));
goodBox.Add(tdb.save_Box(1, goodMas));
//создание новой накладной
idNa = tdb.save_Na(1, goodBox.Count);
//создание нового акта
idAct = tdb.save_Act(2, badBox.Count);
//создание записей ЯщикиВнакладной
foreach (int idBox in goodBox)
{
tdb.save_Box_in_Na(idNa, idBox);
}
foreach (int idBox in badBox)
{
tdb.save_Box_in_Act(idAct, idBox);
}
//передача накладной в форму
na = new Nakladnaya(idNa, "Белый гриб", "шт.", goodBox.Count, 150, 150 * goodMas * goodBox.Count, goodMas);
//передача акта в форму
act = new Nakladnaya(idAct, "Маслята", "", badBox.Count, 40, 40 * badMas * badBox.Count, badMas);
this.images = imagesFromFolder;
}
//показать следующее изображение
private void next_Click(object sender, EventArgs e)
{
if (!isLoad)
return;
position++;
if (position >= images.Length)
position = 0;
pictureBox1.Image = images[position].getResult();
//d
label1.Text = string.Format("Диаметр: {0:0.####}", images[position].getD());
//v
label2.Text = string.Format("Объем: {0:0.####}", images[position].getV());
//mas
label3.Text = string.Format("Вес: {0:0.####}", images[position].getMas());
//disp
label4.Text = string.Format("Дисперсия: {0:0000}", images[position].getDisp());
//rotten
string rotten = images[position].getDisp() > 1450 ? "Белый" : "Маслята";
label5.Text = string.Format(rotten.ToString());
}
//показать предыдущее изображение
private void prev_Click(object sender, EventArgs e)
{
if (!isLoad)
return;
if (position - 1 >= 0)
position--;
else
position = (byte) (images.Length - 1);
pictureBox1.Image = images[position].getResult();
//d
label1.Text = string.Format("Диаметр: {0:0.####}", images[position].getD());
//v
label2.Text = string.Format("Объем: {0:0.####}", images[position].getV());
//mas
label3.Text = string.Format("Вес: {0:0.####}", images[position].getMas());
//disp
label4.Text = string.Format("Дисперсия: {0:0000}", images[position].getDisp());
//rotten
string rotten = images[position].getDisp() > 1450 ? "Белый" : "Маслята";
label5.Text = string.Format(rotten.ToString());
}
//печать накладной
private void button3_Click(object sender, EventArgs e)
{
if (!isLoad)
return;
Form2 form2 = new Form2(na);
form2.Show();
}
//печать акта
private void button1_Click(object sender, EventArgs e)
{
if (!isLoad)
return;
Form3 form3 = new Form3(act);
form3.Show();
}
private void button4_Click(object sender, EventArgs e)
{
TestDB dbt = new TestDB();
//dbt.go2();
}
private void label2_Click(object sender, EventArgs e)
{
}
}
}
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace KurceWork
{
class Transform
{
public static Bitmap sobelTransform(Bitmap src)
{
Bitmap bitmap = (Bitmap) src.Clone();
Color Pixel;
int R = 0;
int G = 0;
int B = 0;
//Создание массива массивов яркостей пикселей изображения по размеру высоты битовой матрицы
float[][] result = new float[bitmap.Height][];
//Сохранение яркости изображения в массиве
for (int y = 0; y < bitmap.Height; y++) //Для каждой строки
{
result[y] = new float[bitmap.Width];//Создание массивов по ширине битовой матрицы
for (int x = 0; x < bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
//Собель
int[,] gx = new int[,] {
{ -1, 0, 1 },
{ -2, 0, 2 },
{ -1, 0, 1 }
};
int[,] gy = new int[,] {
{ 1, 2, 1 },
{ 0, 0, 0 },
{ -1, -2, -1 }
};
float new_x = 0, new_y = 0;
float rc;
for (int y = 1; y < bitmap.Height - 1; y++)
for (int x = 1; x < bitmap.Width - 1; x++)
{
new_x = 0;
new_y = 0;
rc = 0;
for (int wi = -1; wi < 2; wi++)
{
for (int hw = -1; hw < 2; hw++)
{
rc = result[y + wi][x + hw];
new_x += gx[hw + 1, wi + 1] * rc;
new_y += gy[hw + 1, wi + 1] * rc;
}
}
//1. Способ (он без порога, ограничение (255) только из-за того,
//что Color принимает на вход параметры от 0 до 255)
new_x *= 25;
new_y *= 25;
if (new_x * new_x + new_y * new_y > 255)
{
R = 255;
G = 255;
B = 255;
}
else
{
R = (int)((float)new_x * new_x + new_y * new_y);
G = (int)((float)new_x * new_x + new_y * new_y);
B = (int)((float)new_x * new_x + new_y * new_y);
}
Pixel = Color.FromArgb(0, R, G, B);
bitmap.SetPixel(x, y, Pixel);
}
//bitmap.Save("sobel.bmp"); //Сохраняем изображение в файле
return bitmap;
}
public static Bitmap robertsTransform(Bitmap src)
{
Bitmap bitmap = (Bitmap)src.Clone();
Color Pixel;
int R = 0;
int G = 0;
int B = 0;
//Создание массива массивов яркостей пикселей изображения по размеру высоты битовой матрицы
float[][] result = new float[bitmap.Height][];
//Сохранение яркости изображения в массиве
for (int y = 0; y < bitmap.Height; y++) //Для каждой строки
{
result[y] = new float[bitmap.Width];//Создание массивов по ширине битовой матрицы
for (int x = 0; x < bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
//ЛБШ
float roberts = 0;
float a = 0, b = 0;
for (int y = 1; y < bitmap.Height - 1; y++)
for (int x = 1; x < bitmap.Width - 1; x++)
{
a = 255 * (result[y][x] - result[y + 1][x + 1]);
b = 255 * (result[y][x + 1] - result[y + 1][x]);
roberts = (float)Math.Sqrt(a * a + b * b);
if (roberts > 255)
{
R = 255;
G = 255;
B = 255;
}
else
{
R = (int)(roberts);
G = (int)(roberts);
B = (int)(roberts);
}
Pixel = Color.FromArgb(0, R, G, B);
bitmap.SetPixel(x, y, Pixel);
}
//Сохраняем преобразованное изображение в файле
//bitmap.Save("roberts.bmp"); //Сохраняем изображение в файле
return bitmap;
}
public static int[,] getDispers(Bitmap src)
{
Bitmap bitmap = (Bitmap)src.Clone();
float[][] result = new float[bitmap.Height][];//Создание массива массивов result
Color Pixel;
for (int y = 0; y < bitmap.Height; y++) //Для каждой строки
{
result[y] = new float[bitmap.Width];//Создание массивов по ширине битовой матрицы
//Сохранение яркости точки в массиве
for (int x = 0; x < bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
int s = 5 / 2; //Ширина и высота полуокна
int left = 0; //Левая граница окна
int floor = 0; //Нижняя граница окна
int right = 0; //Правая граница окна
int ceil = 0; //Верхняя граница окна
int k = 0;
int[,] M = new int[bitmap.Height - 10, bitmap.Width - 10];
int[,] D = new int[bitmap.Height - 10, bitmap.Width - 10];
for (int y = 5; y < bitmap.Height-10; y++)
for (int x = 5; x < bitmap.Width-10; x++)
{
k = 0;
//Вычисление границ окна особой точки
left = x - s; if (left < 5) left = 5;
right = x + s; if (right >= bitmap.Width-5) right = bitmap.Width - 5;
ceil = y - s; if (ceil < 5) ceil = 5;
floor = y + s; if (floor >= bitmap.Height-5) floor = bitmap.Height - 5;
//вычисление Мат. Ожидания
for (int yy = ceil; yy <= floor; yy++)
for (int xx = left; xx <= right; xx++)
{
//Console.WriteLine("M = {0}; res = {1};", M[i], result[y][x]);
M[y,x] = M[y,x] + (int)((float)255 * result[yy][xx]);
k++;
}
M[y,x] = (int)((float)M[y,x] / (float)k);
//Вычисление Дисперсии
for (int yy = ceil; yy <= floor; yy++)
for (int xx = left; xx <= right; xx++)
{
D[y,x] = D[y,x] + ((int)((float)255 * result[yy][xx]) * (int)((float)255 * result[yy][xx])) - (M[y,x] * M[y,x]);
}
D[y,x] = (int)((float)D[y,x] / (float)(k - 1));
}
return D;
}
public static int[,] getMat(Bitmap src)
{
Bitmap bitmap = (Bitmap)src.Clone();
float[][] result = new float[bitmap.Height][];//Создание массива массивов result
Color Pixel;
for (int y = 0; y < bitmap.Height; y++) //Для каждой строки
{
result[y] = new float[bitmap.Width];//Создание массивов по ширине битовой матрицы
//Сохранение яркости точки в массиве
for (int x = 0; x < bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
int s = 5 / 2; //Ширина и высота полуокна
int left = 0; //Левая граница окна
int floor = 0; //Нижняя граница окна
int right = 0; //Правая граница окна
int ceil = 0; //Верхняя граница окна
int k = 0;
int[,] M = new int[bitmap.Height - 10, bitmap.Width-10];
for (int y = 5; y < bitmap.Height - 10; y++)
for (int x = 5; x < bitmap.Width - 10; x++)
{
//Вычисление границ окна особой точки
left = x - s; if (left < 5) left = 5;
right = x + s; if (right >= bitmap.Width - 5) right = bitmap.Width - 6;
ceil = y - s; if (ceil < 5) ceil = 5;
floor = y + s; if (floor >= bitmap.Height - 5) floor = bitmap.Height - 6;
k = 0;
//вычисление Мат. Ожидания
for (int yy = ceil; yy <= floor; yy++)
for (int xx = left; xx <= right; xx++)
{
//Console.WriteLine("x = {0}; y = {1}; xx = {2}; yy = {3}", x, y, xx, yy);
M[y,x] = M[y,x] + (int)((float)255 * result[yy][xx]);
k++;
}
M[y,x] = (int)((float)M[y,x] / (float)k);
}
return M;
}
public static int[,] getModa(Bitmap src)
{
Bitmap bitmap = (Bitmap)src.Clone();
float[][] result = new float[bitmap.Height][];//Создание массива массивов result
Color Pixel;
for (int y = 0; y < bitmap.Height; y++) //Для каждой строки
{
result[y] = new float[bitmap.Width];//Создание массивов по ширине битовой матрицы
//Сохранение яркости точки в массиве
for (int x = 0; x < bitmap.Width; x++) //Для каждого пикселя строки
{
Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы
result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив
}
}
int s = 5 / 2; //Ширина и высота полуокна
int left = 0; //Левая граница окна
int floor = 0; //Нижняя граница окна
int right = 0; //Правая граница окна
int ceil = 0; //Верхняя граница окна
//int k = 0;
//int[,] M = new int[bitmap.Height - 10, bitmap.Width - 10];
int[,] Moda = new int[bitmap.Height - 10, bitmap.Width - 10];
for (int y = 5; y < bitmap.Height - 10; y++)
for (int x = 5; x < bitmap.Width - 10; x++)
{
//Вычисление границ окна особой точки
left = x - s; if (left < 5) left = 5;
right = x + s; if (right >= bitmap.Width - 5) right = bitmap.Width - 5;
ceil = y - s; if (ceil < 5) ceil = 5;
floor = y + s; if (floor >= bitmap.Height - 5) floor = bitmap.Height - 5;
//мода
int kk = 0;
Dictionary<float, int> mapModa = new Dictionary<float, int>();
for (int yy = ceil; yy <= floor; yy++)
for (int xx = left; xx <= right; xx++)
{
//мода
int freq = 0;
if (mapModa.ContainsKey((float)255 * result[yy][xx]))
{
freq = mapModa[(float)255 * result[yy][xx]];
mapModa[(float)255 * result[yy][xx]] = freq + 1;
}
else
{
mapModa.Add((float)255 * result[yy][xx], 1);
}
kk++;
}
//Мода
int mo = 0;
foreach (KeyValuePair<float, int> moda in mapModa)
{
if (moda.Value > mo)
{
Moda[y,x] = (int)moda.Key;
mo = moda.Value;
}
}
}
return Moda;
}
public static Bitmap calculate(MyImage image)
{
//загрузка изображений
Bitmap src = image.getSrc();
Bitmap firstT = image.getFirstTransform();
Bitmap secondT = image.getSecondTransform();
//загружка нужных преобразований
float[,] x1 = normalization( getMat(firstT) );
float[,] x2 = normalization(getDispers(firstT));
float[,] x3 = normalization(getModa(firstT));
float[,] polynom = new float[src.Height, src.Width];
float a00 = -0.01f;
float a01 = 1.7f;
float a02 = -0.3f;
float a03 = 0.25f;
/*
float a00 = -0.01f;
float a01 = 1.7f;
float a02 = -0.3f;
float a03 = 0.25f;
*/
for (int y = 5; y < src.Height-10; y++)
for (int x = 5; x < src.Width-10; x++)
{
polynom[y,x] = a00 + a01 * x1[y,x] + a02 * x2[y,x] + a03 * x3[y,x];
polynom[y,x] = polynom[y,x] > 0.2f? 1f:0f;
}
Color pixel;
Bitmap res = (Bitmap) src.Clone();
for (int y = 0; y < src.Height; y++)
for (int x = 0; x < src.Width; x++)
{
if (polynom[y, x] == 1f)
{
pixel = Color.Black;
}
else
pixel = src.GetPixel(x, y);
res.SetPixel(x, y, pixel);
}
res.Save("counter.bmp");
return res;
}
public static Bitmap anotherWay(MyImage image)
{
//загрузка изображений
Bitmap src = image.getSrc();
Bitmap firstT = image.getFirstTransform();
Bitmap secondT = image.getSecondTransform();
//загружка нужных преобразований
float[,] x1 = normalization(getMat(firstT));
float[,] x2 = normalization(getDispers(firstT));
float[,] x3 = normalization(getModa(firstT));
//db
TestDB tdb = new TestDB();
//запись в бд Признаков_Изображения
/*for(int y = 0; y < src.Height-10; y++)
for (int x = 0; x < src.Width-10; x++)
{
tdb.save_PriznakiIzobr(image.getId(), x, y, 0, x1[y,x]);
}*/
//загрузить коэфы полинома из бд
List<float> poly = tdb.get_Poly();
float[,] polynom = new float[src.Height, src.Width];
float a00 = poly[0];
float a01 = poly[1];
float a02 = poly[2];
float a03 = poly[3];
float a04 = poly[4];
float a05 = poly[5];
float a06 = poly[6];
float a07 = poly[7];
float a08 = poly[8];
float a09 = poly[9];
for (int y = 5; y < src.Height - 10; y++)
for (int x = 5; x < src.Width - 10; x++)
{
//polynom[y, x] = a00 + a01 * x1[y, x] + a02 * x2[y, x] + a03 * x3[y, x];
polynom[y, x] = a00 + a01 * x1[y, x] + a02 * x2[y, x] + a03 * x3[y, x] + a04 * x1[y, x] * x1[y, x] + a05 * x1[y, x] * x2[y, x] + a06 * x1[y, x] * x3[y, x] + a07 * x2[y, x] * x2[y, x] + a08 * x2[y, x] * x3[y, x] + a09 * x3[y, x] * x3[y, x];
polynom[y, x] = polynom[y, x] > 0.5f ? 1f : 0f;
//db
tdb.save_VybVhD(image.getId(), x, y, polynom[y,x]);
//tdb.save_PrResh(0, 1, 2, polynom[y, x]);
}
//left + rigth side
Color pixel;
Bitmap res = (Bitmap)src.Clone();
Bitmap dest = (Bitmap)src.Clone();
int lx = 500, rx = 0;
#region mark_border
for (int y = 0; y < src.Height; y++)
{
//left
for (int x = 0; x < src.Width; x++)
{
if (polynom[y, x] == 1f)
{
pixel = Color.Black;
res.SetPixel(x, y, pixel);
if (x < lx) lx = x;
break;
}
else
{
pixel = Color.Blue;
dest.SetPixel(x, y, pixel);
}
}
//right
for (int x = src.Width-1; x > 0 ; x--)
{
if (polynom[y, x] == 1f)
{
pixel = Color.Black;
res.SetPixel(x, y, pixel);
if (x > rx) rx = x;
break;
}
else
{
pixel = Color.Blue;
dest.SetPixel(x, y, pixel);
}
}
}
int vy = 500, ny = 0;
for (int x = 0; x < src.Width; x++)
{
//top
for (int y = 0; y < src.Height; y++)
{
if (polynom[y, x] == 1f)
{
pixel = Color.Black;
res.SetPixel(x, y, pixel);
if (y < vy) vy = y;
break;
}
else
{
pixel = Color.Blue;
dest.SetPixel(x, y, pixel);
}
}
//bottom
for (int y = src.Height-1; y > 0; y--)
{
if (polynom[y, x] == 1f)
{
pixel = Color.Black;
res.SetPixel(x, y, pixel);
if (y > ny) ny = y;
break;
}
else
{
pixel = Color.Blue;
dest.SetPixel(x, y, pixel);
}
}
}
#endregion
MyPoint point = new MyPoint(lx, rx, 40+vy, ny);
getParameters(point, dest, image);
//res.Save("counter.bmp");
return res;
}
public static float[,] normalization(int[,] b)
{
//(x-min)/(max-min)
int min = minM(b);
int max = maxM(b);
float[,] a = getFloatMas(b);
for (int y = 0; y < a.GetLength(0); y++)
for (int x = 0; x < a.GetLength(1); x++)
{
a[y, x] = (float)(a[y, x] - min) / (max - min);
}
return a;
}
public static int maxM(int[,] a)
{
int max = -10000;
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
if (a[i,j] > max)
{
max = a[i,j];
}
}
return max;
}
public static int minM(int[,] a)
{
int min = 10000;
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
if (a[i, j] < min)
{
min = a[i, j];
}
}
return min;
}
public static float[,] getFloatMas(int[,] a)
{
float[,] b = new float[a.GetLength(0), a.GetLength(1)];
for (int y = 0; y < a.GetLength(0); y++)
for (int x = 0; x < a.GetLength(1); x++)
b[y, x] = (float)a[y, x];
return b;
}
private static void getParameters(MyPoint point, Bitmap dest, MyImage image)
{
//Dispersia
//1. Mat
double Mat = 0;
int k = 0;
int t = 0;
for (int y = point.getMinY(); y < point.getMaxY(); y++)
for (int x = point.getMinX(); x < point.getMaxX(); x++)
{
Color currentPix = dest.GetPixel(x, y);
if (currentPix != Color.Blue && currentPix != Color.Black)
{
float ff = currentPix.GetBrightness() * 255f;
if (ff < 100f) t++;
Mat = Mat + currentPix.GetBrightness()*255f;
k++;
}
}
Mat = Mat / k;
//2. Disp
double Disp = 0;
for (int y = point.getMinY(); y < point.getMaxY(); y++)
for (int x = point.getMinX(); x < point.getMaxX(); x++)
{
Color currentPix = dest.GetPixel(x, y);
if (currentPix != Color.Blue && currentPix != Color.Black)
{
Disp = Disp + (currentPix.GetBrightness() * 255f) * (currentPix.GetBrightness() * 255f) - Mat * Mat;
}
}
Disp = Disp / (k - 1);
image.setDisp(Disp);
//diametr = max_x - min_x
double d = (point.getMaxX() - point.getMinX()) / 2000.0; //20 пикс = 1см -> /100 перевод в метры
d = d > 0.20 ? d - 0.06 : d;
d = d > 0.15 ? d - 0.02 : d;
image.setD(d);
//V = (pi*D^3)/6
double v = (Math.PI * Math.Pow(d, 3)) / 6.0;
image.setV(v);
//m = V * ro
double mas = 0;
if (Disp < 1450)
{
mas = v * 420.0;
}
else
{
mas = v * 320.0;
}
image.setMas(mas);
//dest.Save("blue.bmp");
}
}
}
КАЗАНСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ А.Н. ТУПОЛЕВА – КАИ
Кафедра автоматизированных систем обработки информации и управления
КУРСОВАЯ РАБОТА
по дисциплине
«ТЕХНОЛОГИЯ РАЗРАБОТКИ
Дата: 2018-12-28, просмотров: 423.