Курсовая работа: Распознавание графических символов
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)
pictureBoxMain.Image = b;
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);
}
}
// <summary>
/// Состояния изображения
/// </summary>
enum FormState
{
/// <summary>
/// изображение не открыто
/// </summary>
Empty,
/// <summary>
/// Изображение открыто
/// </summary>
Open,
/// <summary>
/// Сегментировано
/// </summary>
Segmented,
/// <summary>
/// Персептрон обучен
/// </summary>
Teached,
/// <summary>
/// Параметры персептрона сохранены
/// </summary>
Serialized,
/// <summary>
/// Параметры персептрона загружены
/// </summary>
Deserialized,
/// <summary>
/// Распознано
/// </summary>
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
{
/// <summary>
/// Реализует распозноание изображений
/// на базе персептрона
/// </summary>
class Recognizer
{
/// <summary>
/// матрица знаков входов персептрона
/// </summary>
private int[,] xa;
/// <summary>
/// Массив лямд
/// </summary>
private int[,] l;
/// <summary>
/// Массив имен классов
/// </summary>
private string[] classes = {"Указ",
"Не указ"};
/// <summary>
/// Массив имен классов
/// </summary>
public string[] ClassesList
{
get { return classes; }
}
/// <summary>
/// Инициализирует xa-матрицу
/// </summary>
/// <param name="sz">размер
изображения</param>
/// <param name="aCount">количесвто
а-элементов</param>
/// <param name="lCount">количесвто
классов</param>
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));
}
}
/// <summary>
/// Обучение персептрона
/// </summary>
/// <param name="b">битмап для обучения</param>
/// <param name="classindex">имя
класса к ккоторому относиться изображение</param>
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)
{
//перебор всех классов
for (int j = 0; j < l.GetLength(0); j++)
{
//Увеличение на 1 лямд для класса который обучается
//и уменьшение для всех осатльных
if (classindex == j)
l[j, i]++;
else
l[j, i]--;
}
}
}
}
/// <summary>
/// Распознавание изобржения
/// </summary>
/// <param name="b">битмап изображения</param>
/// <returns>имя класса к которому отнесено
изображение</returns>
public string Recognize(Bitmap b)
{
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;
}
//Создание масива значений сумматоров
//каждый для отдельного класса
int[] sum = new int[l.GetLength(0)];
//Нахождение значений сумматоров для каждого класса
for (int i = 0; i < sum.Length; i++)
{
for (int j = 0; j < xa.GetLength(1);
j++)
{
sum[i] += outa[j] * l[i, j];
}
}
//нахождение максимального значения сумматор
//именно оно соответствует распознанному классу
int max = sum[0];
int maxindex = 0;
for (int i = 1; i < sum.Length; i++)
{
if (max < sum[i])
{
max = sum[i];
maxindex = i;
}
}
//Возвращается имя класса с максимальным значением
сумматора
return classes[maxindex];
}
/// <summary>
/// Сериализация массива лямд(сохранение в файл) для
сохранения обученяи персептрона
Страницы: 1, 2, 3, 4, 5 |