Вход

Алгоритмы поиска контура и их реализация в с#

Рекомендуемая категория для самостоятельной подготовки:
Курсовая работа*
Код 289545
Дата создания 03 сентября 2014
Страниц 56
Мы сможем обработать ваш заказ (!) 27 декабря в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
1 050руб.
КУПИТЬ

Описание

Приведены описания алгоритмов поиска контуров и образов и их практическая реализация в проектах на языке программирования с# ...

Содержание

Оглавление
Введение 2
1. Алгоритмы волнового поиска контуров 3
1.1. Алгоритм волнового поиска контуров. Вариант 1. 3
1.2. Алгоритм волнового поиска контуров. Вариант 2. 4
2. Алгоритмы волнового поиска образов 6
2.1. Алгоритм волнового поиска образа. Вариант 1. 6
2.2. Алгоритм волнового поиска образа. Вариант 2. 7
2.3. Алгоритм волнового поиска образа. Вариант 3 8
2.4. Алгоритм волнового поиска образа. Вариант 4 10
2.5. Проект WindowsFormsApplication1_0_8 11
3. Последовательный поиск контура 30
3.1. Алгоритм последовательного волнового поиска контуров 30
3.2. Проект WindowsFormsApplication2_0_4 33
Список использованной литературы 56

Введение

Существует множество методов распознавания образов. Данные методы подробно рассматриваются во всех учебниках по искусственному интеллекту и распознаванию образов. Поэтому не будем останавливаться на них подробно и перечислять. Данные методы хорошо известны. Однако ни один из данных методов не дает достаточно удовлетворительных результатов для применения на практике в силу тех или иных ограничений. Наша задача найти новые методы распознавания образов и попытаться избавиться от ограничений, с которыми сталкиваются известные методы распознавания образов.
Главными целями исследования являются:
• разработка методов распознавания образов, имеющих максимальную самостоятельность агента в принятии решений;
• обучаемость агента на основе накопления опыта практического распознавания образов, с исп ользованием меры успешности выполнения задания;
• выработка агентом новых решающих правил и обобщения своей деятельности на основе опыта и накопления знаний.

Фрагмент работы для ознакомления

GetLength(0); int acol = a.GetLength (1); int[,] targetArray = new int[astr, acol]; int k = 1; int count; for (int i = 0; i < astr; i++) { for (int j = 0; j < acol; j++) { targetArray[i, j] = noneValue; } } for (int i = 0; i < acol; i++) { count = 0; for (int n = 0; n < k; n++) { if (a[0, i] == targetArray[0, n] && a[1, i] == targetArray[1, n]) { count++; } } if (count == 0) { targetArray[0, k - 1] = a[0, i];targetArray[1, k - 1] = a[1, i]; k++; } } return targetArray; } //Метод поиска первого заполненного элемента массива //Массив вида [2,m] public int SeachFastFillElementArray(int[,] souceArray) { int souceArrayCol = souceArray.GetLength(1); bool endWhile = false; int i = 0; int j = 0; while (i < souceArrayCol && endWhile == false) { if (souceArray[0,i] == noneValue) { i++; j = noneValue; } else { i++; j = i - 1; endWhile = true; } } /*while (i < souceArrayCol) { if (souceArray[0, i] == noneValue) { i++; } }*/ /*if (i == souceArrayCol) { i = noneValue; }*/ return j; } //Метод волнового поиска //Обработка массива Ми //Массив вида [2,m] //count - количество пикселей черного цвета, не являющихся элементами массива пикселей //Фигуры Мф //sauceArray - массив пикселей поиска вокруг базовой точки Ми //countBlack - количество пикселей черного цвета //Mf - массив пикселей фигуры //Mp - массив точек пересечения //tbX - координата х базовой точки //tbY - координата у базовой точки //seach - при значении true происходит полное обнаружение всех пикселей фигуры public int[] SeachSortArray(int[,] sauceArray, int[,] Mf, int[,] Mp, int[] tb, ref bool seach) { int mpStr = Mp.GetLength(0); int mpCol = Mp.GetLength(1); //Определение размера массива sauceArray int sauceArrayCol = sauceArray.GetLength(1); //Определение количества заполненных элементов массива targetMt int countTotal = HaveElementArray(sauceArray); //Удаление повторяющихся элементов из массива //int [,] targetArray = SortOdinakovElementArray(sauceArray); //Удаление элементов массива А1 совпадающих с элементами массива А2 //targetArray = PoiskElementMassiv(targetArray, Mf); //Удаление элементов массива А1 совпадающих с элементами массива А2 int[,] targetArray = PoiskElementMassiv(SortOdinakovElementArray(sauceArray), Mf); //Количество заполненных элементов массива //Количество пикселей черного цвета массива targetArray, не являющихся элементами массива //Пикселей фигуры Мf int count = HaveElementArray(targetArray); //MessageBox.Show("count = " + count); //Количество заполненных элементов массива Мр int mpColFill = HaveElementArray(Mp); //Количество заполненных элементов массива Мf int mfColFill = HaveElementArray(Mf); //MessageBox.Show("mfCollFill = " + mfColFill); //Первый найденный заполненный элемент массива Ми не являющийся элементом массива Мф int g = SeachFastFillElementArray(targetArray); //MessageBox.Show("g = " + g); //Первый найденный заполненный элемент массива Мр int h = SeachFastFillElementArray(Mp); //Количество пикселей черного цвета, не являющихся элементами массива пикселей //Фигуры Мf //int count = HaveElementArray(PoiskElementMassiv(SortOdinakovElementArray(sauceArray), Mf)); //int[] resArray = new int[2]; //GetArray(targetArray); //Количество пикселей черного цвета массива Ми, не являющихся элементами массива Мф, //Равно 0 if (count == 0 && h != noneValue) { tb[0] = Mp[0, h]; tb[1] = Mp[1, h]; Mp[0, h] = noneValue; Mp[1, h] = noneValue; } //Окончание поиска пикселей фигуры /*if (count == 0 && h == noneValue) { seach = true; }*/ //Количество пикселей черного цвета массива Ми, не являющихся элементами массива Мф, //Равно 1 /*if (count == 1 && g != noneValue) { tbX = targetArray[0, g]; tbY = targetArray[1, g]; Mf[0, mfColFill] = targetArray[0, g]; Mf[1, mfColFill] = targetArray[1, g]; }*/ //Количество пикселей черного цвета массива Ми, не являющихся элементами массива Мф, //более 1 if (count > 0 && g != noneValue) { if (count > 1) { Mp[0, mpColFill] = tb[0]; Mp[1, mpColFill] = tb[1]; } tb[0] = targetArray[0, g]; tb[1] = targetArray[1, g]; Mf[0, mfColFill] = targetArray[0, g]; Mf[1, mfColFill] = targetArray[1, g]; /*int i = 0; while (i < count) { Mf[0, mfColFill + i] = targetArray[0, g+i]; Mf[1, mfColFill + i] = targetArray[1, g+i]; i++; }*/ } //Завершение поиска контура //Количества заполненных элементов массива mp равно 0 //Количество заполненных элементов массива sauceArray равно 0 //Количество заполненных элементов массива sauceArray равно второму размеру массива sauceArray //if ((mpColFill == 0) && (count == 0 || count == sauceArrayCol || countTotal == sauceArrayCol)) if ((mpColFill == 0) && (count == 0 || count == sauceArrayCol)) { //Конец поиска seach = true; } return tb; } //Метод сплошного поиска до обнаружения пикселя черного цвета public int[] TotalSeachImage(Bitmap bitmap) { int[] tbArray = new int[2]; int i = 0; int j = 0; while (i < bitmap.Width - 1 && bitmap.GetPixel(i, j) != Color.FromArgb(0, 0, 0)) { i++; j = 0; while (j < bitmap.Height - 1 && bitmap.GetPixel(i, j) != Color.FromArgb(0, 0, 0)) { j++; } } tbArray[0] = i; tbArray[1] = j; return tbArray; } //Метод заполнения массива пустыми значениями //Массив вида [m,n] public int[,] FillPustArray(int[,] sauceArray) { int Ni = sauceArray.GetLength(0); int Nj = sauceArray.GetLength(1); for (int i = 0; i < Ni; i++) { for (int j = 0; j < Nj; j++) { sauceArray[i, j] = noneValue; } } return sauceArray; } //Метод получения значения массива public void GetArray(int[,] sauceArray) { int[,] targetArray = sauceArray; String temp = ""; int str = targetArray.GetLength(0); int col = targetArray.GetLength(1); for (int i = 0; i < col; i++) { temp += Convert.ToString(targetArray[0, i]) + ", " + Convert.ToString(targetArray[1, i]) + "\t"; } MessageBox.Show(temp); } //Метод получения значения переменной public bool GetValue(bool value) { return value; } }}3. Последовательный поиск контура3.1. Алгоритм последовательного волнового поиска контуровАлгоритм последовательного волнового поиска контуров применяется для поиска контуров замкнутой залитой одним цветом фигуры без пересекающих контур элементов. Также метод можно применять для поиска контуров замкнутой контурной фигуры без пересекающих контур элементов.Алгоритм поиска контура пикселей фигуры. Вариант 1.M1 - Метод сплошного поиска в изображении (bitmap).Начало цикла С1. Поиск пикселя черного цвета в изображении.Производим поиск пикселя черного цвета в изображении методом сплошного поиска.Найденный пиксель является пикселем контура и обозначается базовой точкой tB. Конец поиска. Выход из цикла С1.Конец цикла С1.M2 – Метод поиска вокруг базовой точки tB (tB).Начало цикла C1 поиск пикселей вокруг базовой точки tB.Производим поиск вокруг tB радиусом в 1 пиксель по часовой стрелке (против часовой стрелки) начиная с пикселя в левом верхнем углу в порядке следования. В результате поиска находим максимально 8 пикселей. Все найденные пиксели черного цвета заносим в массив временный mT в порядке их обнаружения.mT[0,0] = {tBy-1, tBx-1}mT[0,1] = {tBy - 1, tBx}mT[0,2] = {tBy-1, tBx+1}mT[1,2] = {tBy, tBx+1}mT[2,2] = {tBy+1, tBx+1}mT[2,1] = {tBy+1, tBx}mT[2,0] = {tBy+1, tBx-1}mT[1,0] = {tBy, tBx-1}Конец цикла С1.Возвращает массив mT.М3 – метод проверки и сортировки массива mT (mT).Начало цикла С1. Сортировка и проверка элементов массива mT (mT).Удаляем из массива mT повторяющиеся элементы используя метод SortOdinakovElementArray(int[,] a). Удаляем из массива mT пустые элементы, используя метод DelPustElementArray(int[,]sauseArray).Удаляем из массива mT элементы совпадающие с элементами массива пикселей контура mK, используя метод PoiskElementMassiv(int[,] a1, int[,] a2).Конец цикла С1 Возвращает массив отсортированный и проверенный массив mT.М4 метод получения массива mT, сортировка и проверка массива (tB).M2 (tB). Получение массива mT.M3 (mT). Сортировка и проверка элементов массива mT.Возвращает отсортированный и проверенный массив mTM5 метод поиска базовой точки tB (mT).Определяем количество элементов отсортированного массива mT методом HaveElementArray(int[,] a).Если нет элементов массива mT, то поиск закончен.Если есть элементы массива mT, то Начало цикла С2. Цикл по массиву mT.Назначаем точкой tBn i элемент массива mT. Где i принимает значения от 0 до n.M4 (tBn). Записываем результат в массив mTn.Метод Количество заполненных элементов массива (mTn)..Если нет элементов массива mTn, то i++. Если i < n, цикл не прошел по всем элементам массива mT, то возврат к началу цикла.Если i = n, цикл прошел по всем элементам массива mT, то выход из цикла С2. Конец поиска.Если есть элементы массива mTn, то найдена новая базовая точка tB = tBn. Выход из цикла С2.Конец цикла С2.Возвращает значение новой базовой точки tB.M5 метод поиска базовой точки tB. SeachBaseDot(int[] sauceTb).M4 (tB).Определяем количество заполненных элементов отсортированного массива mT методом HaveElementArray(int[,] a).Если нет элементов массива mT, то поиск закончен.Если есть элементы массива mT, то Начало цикла С2. Цикл по массиву mT.Назначаем точкой tBn i элемент массива mT. Где i принимает значения от 0 до n.M4 (tBn). Записываем результат в массив mTn.Метод HaveElementArray(int[,] a).Если нет элементов массива mTn, то i++. Если i < n, цикл не прошел по всем элементам массива mT, то возврат к началу цикла.Если i = n, цикл прошел по всем элементам массива mT, то выход из цикла С2. Конец поиска.Если есть элементы массива mTn, то найдена новая базовая точка tB = tBn. Выход из цикла С2.Конец цикла С2.Возвращает значение новой базовой точки tB.Практическая реализация алгоритма последовательного волнового поиска контуров вариант 1 представлена в проекте WindowsFormsApplication2_0_4.3.2. Проект WindowsFormsApplication2_0_4Form1.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication2_0_4{ public partial class Form1 : Form { Element element; CreaterImage createrImage; SeachKontur seachKontur; Bitmap bitmap; int[,] mt; int[,] mk; int[,] mp; int[] tbArray; Bitmap bitmapMf; Color color; //bool seachEnd; public Form1() { InitializeComponent(); createrImage = new CreaterImage(); element = new Element(); seachKontur = new SeachKontur(); mt = new int[0, 0]; mk = new int[2, 10000]; mp = new int[2, 10000]; tbArray = new int[0]; color = Color.FromArgb(0, 0, 0); } private void button1_Click(object sender, EventArgs e) { bitmap = new Bitmap(createrImage.DrawGreadRot()); bitmapMf = new Bitmap(bitmap.Width, bitmap.Height); pictureBox1.Image = bitmap; } private void button2_Click(object sender, EventArgs e) { bool seachEnd = false; //Поиск фигуры обший tbArray = seachKontur.TotalSeachImage(bitmap); //Заполнение массивов пустыми элементами mk = element.FillPustArray(mk); mp = element.FillPustArray(mp); //Занесение первой базовой точки Тб в массив mF mk[0, 0] = tbArray[0]; //Y mk[1, 0] = tbArray[1]; //X while (seachEnd == false) { //Поиск вокруг базовой точки mt = seachKontur.SeachVaweDot(bitmap, tbArray[0], tbArray[1]); //Удаление пустых элементов массива mp mp = element.DelPustElementArrayPure(mp); //Поиск волновой всех пикселей фигуры tbArray = seachKontur.SeachBaseDot(tbArray, mk, mp, mt, ref seachEnd); } int[,] targetMk = element.DelPustElementArray(mk); int acol = targetMk.GetLength(1); pictureBox2.Refresh(); for (int i = 0; i < acol; i++) { bitmapMf.SetPixel(targetMk[0, i], targetMk[1, i], color); } pictureBox2.Image = bitmapMf; } }}CreaterImage.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication2_0_4{ public class CreaterImage { Pen pen; int lineX1; int lineY1; int lineX2; int lineY2; int lineX3; int lineY3; int lineX4; int lineY4; int lineX5; int lineY5; int lineX6; int lineY6; int bitmapWidth; int bitmapHeight; //Bitmap bitmapS; public CreaterImage() { pen = new Pen(Color.Black, 1); lineX1 = 2; lineY1 = 2; lineX2 = 10; lineY2 = 8; lineX3 = 10; lineY3 = 2; lineX4 = 2; lineY4 = 8; lineX5 = 14; lineY5 = 6; lineX6 = 6; lineY6 = 12; bitmapWidth = 100; bitmapHeight = 100; } public Bitmap DrawImage() { Bitmap bitmapS = new Bitmap(bitmapWidth, bitmapHeight); Graphics graphics = Graphics.FromImage(bitmapS); graphics.DrawLine(pen, lineX1, lineY1, lineX2, lineY2); graphics.DrawLine(pen, lineX3, lineY3, lineX4, lineY4); graphics.DrawLine(pen, lineX5, lineY5, lineX6, lineY6); graphics.Dispose(); return bitmapS; } public Bitmap DrawGread() { Bitmap bitmap = new Bitmap(bitmapWidth, bitmapHeight); Graphics graphics = Graphics.FromImage(bitmap); int n = 10; int dX = 0; int dY = 10; int sX1 = 5; int sY1 = 5; int sX2 = 95; int sY2 = 5; int sX3 = 5; int sY3 = 95; for (int j = 0; j < n; j++) { for (int i = 0; i < n; i++) { graphics.DrawLine(pen, sX1 + i * dX, sY1 + j * dY, sX2 + i * dX, sY2 + j * dY); graphics.DrawLine(pen, sX1 + i * dY, sY1 + j * dX, sX3 + i * dY, sY3 + j * dX); } } graphics.Dispose(); return bitmap; } public Bitmap DrawGreadRot() { Bitmap bitmap = new Bitmap(bitmapWidth, bitmapHeight); Graphics graphics = Graphics.FromImage(bitmap); int n = 5; int dX = 0; int dY = 10; int sX1 = 30; int sY1 = 60; int sX2 = 70; int sY2 = 20; int sX3 = 80; int sY3 = 90; for (int j = 0; j < n; j++) { for (int i = 0; i < n; i++) { graphics.DrawLine(pen, sX1 + i * dX, sY1 + j * dY, sX2 + i * dX, sY2 + j * dY); graphics.DrawLine(pen, sX1 + i * dY, sY1 + j * dX, sX3 + i * dY, sY3 + j * dX); } } graphics.Dispose(); return bitmap; } public int GetBitmapWidth() { int width = bitmapWidth; return width; } public int GetBitmapHeight() { int height = bitmapHeight; return height; } //public Bitmap GetBitmap() //{ //Bitmap targetBitmap = bitmapS; //return targetBitmap; //} }}Element.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.

Список литературы

1. Визильтер Ю. В., Желтов С. Ю., Бондаренко А. В., Ососков M.B. Mopжин А. В. Обработка и анализ изображений в задачах машинного зрения. — М.: Физматкнига, 2010. — 689 с.
2. Гонсалес Рафаэл С. Цифровая обработка изображений / Гонсалес Рафаэл С., Вудс Ричард Е.; Чочиа П.А. (науч. ред. пер.); Рубанова Л.И., Чочиа П.А. (пер. с англ.). — 3-е изд., испр. и доп. — М.: Техносфера, 2012. — 1103 с.: ил., табл. — (Мир цифровой обработки).
3. Гридин В.Н., Титов В.С., Труфанов М.И. Адаптивные системы технического зрения, — СПб.: Наука, 2009. — 442 с.
4. Дворкович Виктор Павлович. Цифровые видеоинформационные системы (теория и практика) / Дворкович В.П., Дворкович Александр Викторович. — М.: Техносфера, 2012. — 1007 с.: ил., табл. — (Мир цифровой обработки).
5. Захаров Алексей Александрович. Методы и алгоритмы представления и генерации изображений в графических системах / Захаров А.А.; Муром. ин-т (фил.) Гос. образоват. учреждения высш. проф. образования, Владим. гос. ун-т. - Муром, 2010. - 75 с. : ил.

Очень похожие работы
Найти ещё больше
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00689
© Рефератбанк, 2002 - 2024