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

Функциональная структура автоматизированной интеллектуальной информационной системы сортировки грибов. Вербальная и формальная постановки задач, описание методов решения, примеры решения задач. Рассмотрение технологического процесса обработки данных.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 12.12.2018
Размер файла 1,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Полученные данные были использованы в программе для вычисления признаков, в которой для каждой точки были найдены заданные признаки изображения.

Найденные признаки изображения были загружены MSExcel для дальнейшего анализа по формированию выборки данных. После формирования выборки был проведен корреляционный анализ для выделения информационных признаков. Из выбранных информационных признаков были сформированы обучающая и тестовая выборки.

На основании обучающей выборки были найдены коэффициенты полинома первой и второй степени и рассчитаны ошибки первого и второго рода.

Коэффициенты полинома второй степени были получены с использованием программы для вычисления коэффициентов полинома. На вход программе подавалась обучающая выборка, на выходе программы получались коэффициенты полинома и ошибка аппроксимации. Проанализировав полученные результаты, был выбран полином для использования в принятии решений.

5.2 Программные средства принятия решений

Для принятия решения используется программное решение на языке программирования C#. Процесс принятия решения состоит из двух этапов:

· поиска границы изображения, изображенного на рисунке 5.1. На рисунках 5.2, 5.3, 5.4, 5.5 представлена детализация блоков;

· определения вида гриба, изображенного на рисунка5.6 и 5.7.

Рис. 5.1. Алгоритм поиска границы

Рис. 5.2. Алгоритм Собеля

Рис. 5.3. Алгоритм ЛБШ

Рис. 5.4. Вычисление Мат. Ожидания

Рис. 5.5. Вычисление Дисперсии

Рис. 5.6. Алгоритм определения вида гриба

Рис. 5.7. Алгоритм выделения границы

Пример использования программного средства представлен на рисунках 5.8 - 5.11.

Рис. 5.8. Общий вид программы

На рисунке 5.8. представлен общий вид программного средства. Для загрузки изображений (формат .bmp) необходимо нажать клавишу «Загрузить». Загрузка изображения показана на рисунке 5.9. После загрузки и обработки изображений у пользователя есть возможность просмотреть изображения и их параметры. Для перехода от одного изображения выборки к другому, необходимо воспользоваться клавишами перехода, изображенных на рисунке 5.10. После загрузки изображения, пользователь может вывести на экран акт и накладную для данной выборки, изображенных на рисунках 5.11 и 5.12 соответственно.

Рис. 5.9. Выбор изображения

Рис. 5.10. Просмотр изображения

Рис. 5.11. Закупочный акт

Рис. 5.12. Накладная

ЗАКЛЮЧЕНИЕ

В данном проекте была разработана автоматизированная интеллектуальная информационная система сортировки грибов.

В процессе работы был произведен анализ предметной области и определены цели и задачи АИИС.

Был разработан технологический процесс обработки данных, концептуальное и логическое проектирование реляционной БД.

Была разработана программа для сортировки грибов.

Внедрение АИИС позволит сортировать грибы с минимальным привлечением человеческих ресурсов, что позволит в перспективе уменьшить затраты на сортировку, так же увеличится качество и скорость сортировки.

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. Листинг Программы

namespaceKurceWork

{

publicpartialclassForm1 : Form

{

privateBitmapimageBitmap;

privateMyImage image;

privateMyImage[] images;

privateboolisLoad = false;

privatebyte position = 0;

//private List<Nakladnaya>listNa = new List<Nakladnaya>();

privateNakladnayana, act;

privateList<Int32>goodBox = newList<Int32>();

privateList<Int32>badBox = newList<Int32>();

privatedoublebadMas = 0;

privatedoublegoodMas = 0;

privateintidNa = -1;

privateintidAct = -1;

public Form1()

{

InitializeComponent();

openFileDialog1.Filter = "Image Files(*.BMP)|*.BMP";

folderBrowserDialog1.SelectedPath = "D:\\Program\\C Sharp\\Kurse_Work_IIS\\KurceWork\\KurceWork\\bin\\Debug\\images";

}

//загрузкаизображения (старое)

privatevoidoldLoadImage()

{

if (openFileDialog1.ShowDialog() == DialogResult.Cancel)

return;

//читаемизображениевбитмап

imageBitmap = newBitmap(openFileDialog1.FileName);

pictureBox1.Image = imageBitmap;

string name = openFileDialog1.FileName;

int t = name.LastIndexOf("\\");

Text = name.Substring(t + 1);

//исходное изображение в объект типа MyImage

image = newMyImage((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());

}

privatevoid groupBox1_Enter(object sender, EventArgs e)

{

}

privatevoid groupBox2_Enter(object sender, EventArgs e)

{

}

privatevoid label1_Click(object sender, EventArgs e)

{

}

privatevoid label5_Click(object sender, EventArgs e)

{

}

//загрузкапапкисизображениями

privatevoid button2_Click(object sender, EventArgs e)

{

if (folderBrowserDialog1.ShowDialog() == DialogResult.Cancel)

return;

//путькпапке

string folder = folderBrowserDialog1.SelectedPath;

//пути всех изображений в папке

string[] images = Directory.GetFiles(@folder, "*.bmp");

MyImage[] imagesFromFolder = newMyImage[images.Length];

goodBox.Clear();

badBox.Clear();

TestDBtdb = newTestDB();

//читаем изображение в битмап и устанавливаем преобразования

for (inti = 0; i<images.Length; i++)

{

Text = string.Format("Загрузка {0} изображенияиз {1}", (i+1), images.Length);

//загрузкаоригинальногоизображения

imagesFromFolder[i] = newMyImage(newBitmap(images[i]));

//сохранениепервогопреобразования

imagesFromFolder[i].setFirstTransform(Transform.sobelTransform(newBitmap(images[i])));

//сохранениевторогопреобразования

imagesFromFolder[i].setSecondTransform(Transform.robertsTransform(newBitmap(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 (intidBoxingoodBox)

{

tdb.save_Box_in_Na(idNa, idBox);

}

foreach (intidBoxinbadBox)

{

tdb.save_Box_in_Act(idAct, idBox);

}

//передачанакладнойвформу

na = newNakladnaya(idNa, "Белыйгриб", "шт.", goodBox.Count, 150, 150 * goodMas * goodBox.Count, goodMas);

//передачаактавформу

act = newNakladnaya(idAct, "Маслята", "", badBox.Count, 40, 40 * badMas * badBox.Count, badMas);

this.images = imagesFromFolder;

}

//показать следующее изображение

privatevoidnext_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());

}

//показатьпредыдущееизображение

privatevoidprev_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());

}

//печатьнакладной

privatevoid button3_Click(object sender, EventArgs e)

{

if (!isLoad)

return;

Form2form2 = newForm2(na);

form2.Show();

}

//печатьакта

privatevoid button1_Click(object sender, EventArgs e)

{

if (!isLoad)

return;

Form3form3 = newForm3(act);

form3.Show();

}

privatevoid button4_Click(object sender, EventArgs e)

{

TestDBdbt = newTestDB();

//dbt.go2();

}

privatevoid label2_Click(object sender, EventArgs e)

{

}

}

}

using System;

usingSystem.Collections.Generic;

usingSystem.Drawing;

usingSystem.Drawing.Imaging;

usingSystem.Linq;

usingSystem.Runtime.InteropServices;

usingSystem.Text;

usingSystem.Threading.Tasks;

namespaceKurceWork

{

classTransform

{

publicstaticBitmapsobelTransform(Bitmapsrc)

{

Bitmapbitmap = (Bitmap) src.Clone();

Color Pixel;

int R = 0;

int G = 0;

int B = 0;

//Создание массива массивов яркостей пикселей изображения по размеру высоты битовой матрицы

float[][] result = newfloat[bitmap.Height][];

//Сохранение яркости изображения в массиве

for (int y = 0; y <bitmap.Height; y++) //Для каждой строки

{

result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы

for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки

{

Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы

result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив

}

}

//Собель

int[,] gx = newint[,] {

{ -1, 0, 1 },

{ -2, 0, 2 },

{ -1, 0, 1 }

};

int[,] gy = newint[,] {

{ 1, 2, 1 },

{ 0, 0, 0 },

{ -1, -2, -1 }

};

floatnew_x = 0, new_y = 0;

floatrc;

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 (intwi = -1; wi< 2; wi++)

{

for (inthw = -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;

}

publicstaticBitmaprobertsTransform(Bitmapsrc)

{

Bitmapbitmap = (Bitmap)src.Clone();

Color Pixel;

int R = 0;

int G = 0;

intB = 0;

//Создание массива массивов яркостей пикселей изображения по размеру высоты битовой матрицы

float[][] result = newfloat[bitmap.Height][];

//Сохранение яркости изображения в массиве

for (int y = 0; y <bitmap.Height; y++) //Для каждой строки

{

result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы

for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки

{

Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы

result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив

}

}

//ЛБШ

floatroberts = 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;

}

publicstaticint[,] getDispers(Bitmapsrc)

{

Bitmapbitmap = (Bitmap)src.Clone();

float[][] result = newfloat[bitmap.Height][];//Созданиемассивамассивов result

Color Pixel;

for (int y = 0; y <bitmap.Height; y++) //Длякаждойстроки

{

result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы

//Сохранение яркости точки в массиве

for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки

{

Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы

result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив

}

}

int s = 5 / 2; //Ширина и высота полуокна

intleft = 0; //Левая граница окна

intfloor = 0; //Нижняя граница окна

intright = 0; //Правая граница окна

intceil = 0; //Верхняя граница окна

int k = 0;

int[,] M = newint[bitmap.Height - 10, bitmap.Width - 10];

int[,] D = newint[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 (intyy = 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 (intyy = 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;

}

publicstaticint[,] getMat(Bitmapsrc)

{

Bitmapbitmap = (Bitmap)src.Clone();

float[][] result = newfloat[bitmap.Height][];//Созданиемассивамассивов result

Color Pixel;

for (int y = 0; y <bitmap.Height; y++) //Длякаждойстроки

{

result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы

//Сохранение яркости точки в массиве

for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки

{

Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы

result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив

}

}

int s = 5 / 2; //Ширина и высота полуокна

intleft = 0; //Левая граница окна

intfloor = 0; //Нижняя граница окна

intright = 0; //Правая граница окна

intceil = 0; //Верхняя граница окна

int k = 0;

int[,] M = newint[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 (intyy = 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;

}

publicstaticint[,] getModa(Bitmapsrc)

{

Bitmapbitmap = (Bitmap)src.Clone();

float[][] result = newfloat[bitmap.Height][];//Созданиемассивамассивов result

Color Pixel;

for (int y = 0; y <bitmap.Height; y++) //Длякаждойстроки

{

result[y] = newfloat[bitmap.Width];//Создание массивов по ширине битовой матрицы

//Сохранение яркости точки в массиве

for (int x = 0; x <bitmap.Width; x++) //Для каждого пикселя строки

{

Pixel = bitmap.GetPixel(x, y); //Определяем атрибут пикселя из битовой матрицы

result[y][x] = Pixel.GetBrightness();//Записываем яркость точки в массив

}

}

int s = 5 / 2; //Ширина и высота полуокна

intleft = 0; //Левая граница окна

intfloor = 0; //Нижняя граница окна

intright = 0; //Правая граница окна

intceil = 0; //Верхняя граница окна

//int k = 0;

//int[,] M = new int[bitmap.Height - 10, bitmap.Width - 10];

int[,] Moda = newint[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;

//мода

intkk = 0;

Dictionary<float, int>mapModa = newDictionary<float, int>();

for (intyy = ceil; yy<= floor; yy++)

for (int xx = left; xx <= right; xx++)

{

//мода

intfreq = 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++;

}

//Мода

intmo = 0;

foreach (KeyValuePair<float, int>modainmapModa)

{

if (moda.Value>mo)

{

Moda[y,x] = (int)moda.Key;

mo = moda.Value;

}

}

}

returnModa;

}

publicstaticBitmap calculate(MyImage image)

{

//загрузкаизображений

Bitmapsrc = image.getSrc();

BitmapfirstT = image.getFirstTransform();

BitmapsecondT = image.getSecondTransform();

//загружканужныхпреобразований

float[,] x1 = normalization( getMat(firstT) );

float[,] x2 = normalization(getDispers(firstT));

float[,] x3 = normalization(getModa(firstT));

float[,] polynom = newfloat[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;

}

publicstaticBitmapanotherWay(MyImage image)

{

//загрузкаизображений

Bitmapsrc = image.getSrc();

BitmapfirstT = image.getFirstTransform();

BitmapsecondT = image.getSecondTransform();

//загружканужныхпреобразований

float[,] x1 = normalization(getMat(firstT));

float[,] x2 = normalization(getDispers(firstT));

float[,] x3 = normalization(getModa(firstT));

//db

TestDBtdb = newTestDB();

//запись в бдПризнаков_Изображения

/*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 = newfloat[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();

Bitmapdest = (Bitmap)src.Clone();

int lx = 500, rx = 0;

#regionmark_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);

}

}

}

intvy = 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 = newMyPoint(lx, rx, 40+vy, ny);

getParameters(point, dest, image);

//res.Save("counter.bmp");

return res;

}

publicstaticfloat[,] 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;

}

publicstaticintmaxM(int[,] a)

{

int max = -10000;

for (inti = 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;

}

publicstaticintminM(int[,] a)

{

int min = 10000;

for (inti = 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;

}

publicstaticfloat[,] getFloatMas(int[,] a)

{

float[,] b = newfloat[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;

}

privatestaticvoidgetParameters(MyPoint point, Bitmapdest, 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++)

{

ColorcurrentPix = dest.GetPixel(x, y);

if (currentPix != Color.Blue&&currentPix != Color.Black)

{

floatff = currentPix.GetBrightness() * 255f;

if (ff< 100f) t++;

Mat = Mat + currentPix.GetBrightness()*255f;

k++;

}

}

Mat = Mat / k;

//2. Disp

doubleDisp = 0;

for (int y = point.getMinY(); y <point.getMaxY(); y++)

for (int x = point.getMinX(); x <point.getMaxX(); x++)

{

ColorcurrentPix = 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");

}

}

} Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.