
- •Научно исследовательская работа студента На тему
- •Оглавление
- •Глоссарий
- •Введение
- •1.Цель и задачи
- •2.Предпроектное исследование
- •2.1 Анализ объектной среды
- •3.Концептуальная модель
- •4.Требования
- •4.1Название программы(модуля)
- •4.2 Функции программы(модуля)
- •4.7 Критерий качества системы.
- •5.Проектное решение
- •5.3Разработка структуры данных
- •6.Реализация
- •6.1 Реализация программы
- •7.Проведение эксперимента и тестирования системы
- •7.1 Тестирование системы
- •7.2 Эксперимент системы
- •1 Этап.
- •8. Заключение
- •Список литературы
- •Приложение а
4.7 Критерий качества системы.
-Главный критерий качества – эффективность.
Наряду с главным критерием качества системы можно выделить второстепенные:
- быстродействие.
- надежность
5.Проектное решение
5.1 Разработка требований к среде и языку разработки
Среда разработки – Microsoft Visual Studio 10/12
Язык разработки – С++
Наличие сторонних библиотек, не идущих в комплекте с основным дистрибутивом среды - Layer
5.2 Разработка алгоритмов
загрузка изображения private: System::Void openToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
pin_ptr<const wchar_t> wch = PtrToStringChars(ofd->FileName);// получение имени картинки
HWND a=static_cast<HWND>(cell_panel->Handle.ToPointer());//загрузка изображения в панель
win_con.Info(a).Settings.DrawMode=lyr::dmSyncStretch;
win_con.Info(a).Settings.TreatBackground=false;
win_con.UpdateAll();
//очистка элемента интерфейса
this->prop_cnt->Visible = true;
this->prop_panel->Visible = false;
this->class_sel->Visible = true;
}
}
Выделение области на изображение void draw_area(lyr::TLayer32& dest, int x1, int y1, int x2, int y2)
{
if(x1 > x2)//проверка условия
{
x2 += x1;
x1 = x2 - x1;
x2 = x2 - x1;
}
if(y1 > y2)//проверка условия
{
y2 += y1;
y1 = y2 - y1;
y2 = y2 - y1;
}
if(x1 < 0)//проверка условия
x1 = 0;
if(x2 > dest.W)//проверка условия
x2 = dest.W;
if(y1 < 0)//проверка условия
y1 = 0;
if(y2 > dest.H)//проверка условия
y2 = dest.H;
for(int i = x1; i < x2; ++i)//занесения полученных данных
{
dest(i,y1) = p;
dest(i,y2) = p;
dest(i,y1+1) = p;
dest(i,y2-1) = p;
}
for(int i = y1; i < y2; ++i)//занесения полученных данных
{
dest(x1,i) = p;
dest(x2,i) = p;
dest(x1+1,i) = p;
dest(x2-1,i) = p;
}
}
Построение матрицы смежности
Суть алгоритма построения матрицы смежности заключается в следующем:
1) Берется матрица H размера LxL, состоящих из нулей
2) Идем последовательно по строкам и столбцам исходного изображения a(x,y) (x = 1..M, y= 1..N); при этом значение a(x,y) принимаем за значение индекса элемента матрицы H (LxL, 0≤a(x,y)≤L-1)
3)Для каждого очередного элемента a(x,y) исходного изображения увеличиваем на 1 значение каждого элемента матрицы H с такими индексами (см Рис 4)
|
|
|
|
(x,y) |
(x+1,y) |
(x−1,y+1) |
(x,y+1) |
(x+1,y+1) |
Рис 4
(a(x,y), a(x+1,y))
(a(x,y), a(x+1,y+1))
(a(x,y), a(x,y+1))
(a(x,y),a(x-1,y+1))
а также каждого элемента, расположенного симметрично относительно главной диагонали матрицы H (индексы меняются местами)
(a(x+1,y), a(x,y))
(a(x+1,y+1), a(x,y))
(a(x,y+1), a(x,y))
(a(x-1,y+1), a(x,y))
4)Каждый элемент полученной матрицы H делим на сумму всех ее элементов
Расчет признаков по матрице смежности
- степень однородности или энергия
- энтропия
-момент инерции
- максимальная вероятность max Pij
- локальная вероятность
Отображение матрицы смежности void matrix_paint(TLayer32& dest, float (&matrix)[256][256], const float prop)
{
//инициирование верхних и нижних границ значений, prop - максимальная вероятность
float top_count = 0, bott_count = 0, top_el = 0, bott_el = prop, curr_top = prop, curr_bott = 0;
for(size_t t = 0; t < 10; ++t)
{
top_el = 0;
for (size_t i = 0; i < 256; ++i)
for(size_t j = 0; j < 256; ++j)
{
if((top_el < matrix[i][j]) && (matrix[i][j] < curr_top))
top_el = matrix[i][j];
}
if(top_el)
curr_top = top_el;
top_count = 0;
for (size_t i = 0; i < 256; ++i)
for(size_t j = 0; j < 256; ++j)
{
if(top_el < matrix[i][j])
++top_count;
}
}
top_el = curr_top;
Сохранение признаков private: System::Void saveToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
StreamWriter^ sw = File::CreateText(sfd->FileName + ".txt");// созданеие и записывание полученных признаков в txt формат
try
{
sw->WriteLine("Class \t ASM(R) \t CON(R) \t ENT(R) \t LUN(R) \t MPR(R) \t ASM(G) \t CON(G) \t ENT(G) \t LUN(G) \t MPR(G) \t ASM(B) \t CON(B) \t ENT(B) \t LUN(B) \t MPR(B) \t ASM(C) \t CON(C) \t ENT(C) \t LUN(C) \t MPR(C) \t ASM(M) \t CON(M) \t ENT(M) \t LUN(M) \t MPR(M) \t ASM(Y) \t CON(Y) \t ENT(Y) \t LUN(Y) \t MPR(Y) \t ASM(L) \t CON(L) \t ENT(L) \t LUN(L) \t MPR(L) \t ASM(La) \t CON(La) \t ENT(La) \t LUN(La) \t MPR(La) \t ASM(Lb) \t CON(Lb) \t ENT(Lb) \t LUN(Lb) \t MPR(Lb)");// прописываются название признаков в колонку
for(int i = 0; i < pr_cnt; ++i)
{
String^ cell = pr[i].obj_class + "\t" + pr[i].R[0] + "\t" + pr[i].R[1] + "\t" + pr[i].R[2] + "\t" + pr[i].R[3] + "\t" + pr[i].R[4] + "\t" + pr[i].G[0] + "\t" + pr[i].G[1] + "\t" + pr[i].G[2] + "\t" + pr[i].G[3] + "\t" + pr[i].G[4] + "\t" + pr[i].B[0] + "\t" + pr[i].B[1] + "\t" + pr[i].B[2] + "\t" + pr[i].B[3] + "\t" + pr[i].B[4] + "\t" + pr[i].C[0] + "\t" + pr[i].C[1] + "\t" + pr[i].C[2] + "\t" + pr[i].C[3] + "\t" + pr[i].C[4] + "\t" + pr[i].M[0] + "\t" + pr[i].M[1] + "\t" + pr[i].M[2] + "\t" + pr[i].M[3] + "\t" + pr[i].M[4] + "\t" + pr[i].Y[0] + "\t" + pr[i].Y[1] + "\t" + pr[i].Y[2] + "\t" + pr[i].Y[3] + "\t" + pr[i].Y[4] + "\t" + pr[i].L[0] + "\t" + pr[i].L[1] + "\t" + pr[i].L[2] + "\t" + pr[i].L[3] + "\t" + pr[i].L[4] + "\t" + pr[i].La[0] + "\t" + pr[i].La[1] + "\t" + pr[i].La[2] + "\t" + pr[i].La[3] + "\t" + pr[i].La[4] + "\t" + pr[i].Lb[0] + "\t" + pr[i].Lb[1] + "\t" + pr[i].Lb[2] + "\t" + pr[i].Lb[3] + "\t" + pr[i].Lb[4];//
sw->WriteLine(cell);//прописываются полученные значения признаков
}
}
finally
{
if(sw)
delete(IDisposable^)(sw);//закрытие меню
}
}
}