Распознавание графических символов
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
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)<