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

КАЗАНСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ А.Н. ТУПОЛЕВА – КАИ

Кафедра автоматизированных систем обработки информации и управления

КУРСОВАЯ РАБОТА

по дисциплине

«ТЕХНОЛОГИЯ РАЗРАБОТКИ

ИНТЕЛЛЕКТУАЛЬНЫХ ИНФОРМАЦИОННЫХ СИСТЕМ »

Интеллектуальная информационная система

Сбором грибов

Руководитель:                                                                    Исполнитель:

Доцент каф. АСОиУ                                              Студент группы 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

Несмещенная оценка дисперсии в окрестностях точки 5х5 (LBP (ЛБШ)) -

[0,14739]

1 Целое

Х 9

Мода в окрестностях точки 5х5 (LBP (ЛБШ)) -

[0,]

1 Целое                

 


 


Технология принятия решения

 

Технологический процесс принятия решений представлен на рисунке 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, просмотров: 374.