Распознавание графических символов

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

gnize.Enabled = true;

else

buttonRecognize.Enabled = false;

buttonTeach.Enabled = true;

buttonLoadTeaching.Enabled = true;

buttonSaveTeaching.Enabled = false;

break;

case FormState.Teached:

buttonOpen.Enabled = true;

buttonSegment.Enabled = false;

buttonRecognize.Enabled = true;

buttonTeach.Enabled = false;

buttonLoadTeaching.Enabled = false;

buttonSaveTeaching.Enabled = true;

enableRecognize = true;

break;

case FormState.Deserialized:

buttonOpen.Enabled = true;

buttonSegment.Enabled = false;

buttonRecognize.Enabled = true;

buttonTeach.Enabled = false;

buttonLoadTeaching.Enabled = false;

buttonSaveTeaching.Enabled = true;

enableRecognize = true;

break;

case FormState.Recognized:

buttonOpen.Enabled = true;

buttonSegment.Enabled = false;

buttonRecognize.Enabled = true;

buttonTeach.Enabled = false;

buttonLoadTeaching.Enabled = true;

buttonSaveTeaching.Enabled = true;

break;

}

}

public FormMain()

{

InitializeComponent();

}

private void buttonOpen_Click(object sender, EventArgs e)

{

try

{

Bitmap b;

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

{

//Если изобраение имеет индексированный формат

//то переводим его в обычный, потомутчо с индексировнным не работат

//setpixel

b = new Bitmap(openFileDialog1.FileName);

if (b.PixelFormat == System.Drawing.Imaging.PixelFormat.Format1bppIndexed ||

b.PixelFormat == System.Drawing.Imaging.PixelFormat.Format4bppIndexed ||

b.PixelFormat == System.Drawing.Imaging.PixelFormat.Format8bppIndexed)

b = new Bitmap(b);

pictureBoxMain.Image = b;

this.ButtonsEnabled(FormState.Open);

}

else

{

this.ButtonsEnabled(FormState.Empty);

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

private void buttonSegment_Click(object sender, EventArgs e)

{

//Получаем набор битмапов соответствующих словам текста

words = Segmentation.GetWords((Bitmap)pictureBoxMain.Image);

dataGridViewSegments.RowCount = words.Count;

int i =0;

//Перебираем слов и отображаем в таблице

foreach (Bitmap word in words)

{

dataGridViewSegments.Rows[i].Cells[0].Value = word;

i++;

}

ButtonsEnabled(FormState.Segmented);

}

private void buttonRecognize_Click(object sender, EventArgs e)

{

int i = 0;

foreach (Bitmap word in words)

{

dataGridViewSegments.Rows[i].Cells[1].Value = r.Recognize(Recognizer.NormalizeBitmap(word,imSize));

i++;

}

ButtonsEnabled(FormState.Recognized);

}

private void buttonTeach_Click(object sender, EventArgs e)

{

//Перебираем слова и обучаем ими

//т.к. класса для распознаваня два то

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

//а второй обучаем противопорложным изображение(т.е инвертируем цвета исходного изображения)

for (int i = 0; i < 5; i++)

{

foreach (Bitmap word in words)

{

r.Teach(Recognizer.NormalizeBitmap(word, imSize), 0);

r.Teach(Recognizer.InverseBitmap(Recognizer.NormalizeBitmap(word, imSize)), 1);

}

}

ButtonsEnabled(FormState.Teached);

}

private void buttonSaveTeaching_Click(object sender, EventArgs e)

{

r.SerializeParams();

ButtonsEnabled(FormState.Serialized);

}

private void buttonLoadTeaching_Click(object sender, EventArgs e)

{

r.DeserializeParams();

ButtonsEnabled(FormState.Deserialized);

}

private void FormMain_Load(object sender, EventArgs e)

{

this.ButtonsEnabled(FormState.Empty);

}

}

//

/// Состояния изображения

///

enum FormState

{

///

/// изображение не открыто

///

Empty,

///

/// Изображение открыто

///

Open,

///

/// Сегментировано

///

Segmented,

///

/// Персептрон обучен

///

Teached,

///

/// Параметры персептрона сохранены

///

Serialized,

///

/// Параметры персептрона загружены

///

Deserialized,

///

/// Распознано

///

Recognized

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;

using System.Windows.Forms;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

namespace WordSearcher

{

///

/// Реализует распозноание изображений

/// на базе персептрона

///

class Recognizer

{

///

/// матрица знаков входов персептрона

///

private int[,] xa;

///

/// Массив лямд

///

private int[,] l;

///

/// Массив имен классов

///

private string[] classes = {"Указ",

"Не указ"};

///

/// Массив имен классов

///

public string[] ClassesList

{

get { return classes; }

}

///

/// Инициализирует xa-матрицу

///

///

///

///

public Recognizer(Size sz, int aCount, int lCount)

{

Random r = new Random();

//Создание матрцы ха

xa = new int[sz.Height * sz.Width, aCount];

//Создание матрицы лямд

l = new int[lCount,aCount];

//Первоначальная

//иницализация лямд еденицами

for (int i = 0; i < l.GetLength(0); i++)

{

for (int j = 0; j < l.GetLength(1); j++)

{

l[i, j] = 1;

}

}

//заполнение матрицы

//для каждого рецептора(строчки)

//назначаетя только один а-элемент(столбец) со знаком + или -

for (int i = 0; i < xa.GetLength(0); i++)

{

xa[i, r.Next(aCount)] = (int)Math.Pow(-1, r.Next(1, 3));

}

}

///

/// Обучение персептрона

///

///

///

public void Teach(Bitmap b, int classindex)

{

int[] x = new int[b.Height * b.Width];

int k = 0;

//Инициализация входных рецепторов

for (int i = 0; i < b.Width; i++)

{

for (int j = 0; j < b.Height; j++)

{

if (b.GetPixel(i, j) == Color.FromArgb(0, 0, 0))

x[k] = 1;

k++;

}

}

//Вектор сумм рецепторов

int[] sumx = new int[xa.GetLength(1)];

//Вектор выходов А-элементов

int[] outa = new int[xa.GetLength(1)];

//суммирование сигналов от рецепторов

for (int i = 0; i < xa.GetLength(1); i++)

{

for (int j = 0; j < xa.GetLength(0); j++)

{

sumx[i] += x[j] * xa[j, i];

}

//Если сумма больше нуля выход а элемента 1

if (sumx[i] > 0)

outa[i] = 1;

}

//изменение коэфициетов лямда

for (int i = 0; i < outa.Length; i++)

{

//Если а-элемент возбужден то изменяем лямды

if (outa[i] == 1)<