288386 (Распознавание графических символов), страница 2
Описание файла
Документ из архива "Распознавание графических символов", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "288386"
Текст 2 страницы из документа "288386"
После открытия изображения становится активным кнопка "Сегментация", после нажатия на которую, текст на изображении разбивается на слова.
Результат сегментации представлен на рисунке 3.6.
Рисунок 3.6 – Результат сегментации
Перед непосредственным распознаванием текста необходимо произвести обучение персептрона, нажав кнопку "обучить", либо загрузить ранее сохраненные параметры, нажав кнопку "загрузить". Обучение персептрона осуществляется изображением содержащим слово "Указ", написанное разными шрифтами. После обучения, можно сохранить параметры персептрона в файл, нажав "сохранить", и прочитать их при следующем распознавании.
После обучения, либо загрузки параметров персептрона, можно производить распознавание изображений. Результат распознавания показан на рисунке 3.7.
Рисунок 3.7 – Результат распознавания
При углубленном тестировании также не было найдено ошибок. Интерфейс программы разработан таким образом, что пользователю на каждом этапе обработки изображения может выполнить только определенные действия, что значительно снижает риск появления ошибок выполнения.
Результат работы программы при загрузке не файла изображения представлен на рисунке 3.8.
Рисунок 3.8 – Результат работы приложения при неверно формате файла
ВЫВОДЫ
В результате выполнения данного курсового проекта было разработано приложение, позволяющее распознавать слово "Указ" в тексте на изображении. Размеры изображения и шрифта текста может быть практически любым, что дает гибкие возможности для применения приложения.
Для распознавания применяется персептрон. Качество распознавания изображения зависит от количества предложенных образов для обучения и количество А-элементов. Количество поддерживаемых шрифтов зависит от шрифтов, которым написаны слова на изображениях для обучения.
Перед непосредственным распознаванием, как правило, необходимо выполнять сегментацию изображения. Сегментация является неотъемлемой частью при распознавании образов, в общем случае, и непосредственно в данном проекте, так как ее результатом являются изображения, содержащие только необходимые для распознания объекты (слова текста).
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
-
Microsoft Developer Network (MSDN) [Электрон. ресурс]. ‑ Режим доступа: http://msdn.ru/
-
Ковалева И.Л., "Алгоритмы обработки изображений", БНТУ, 2007
ПРИЛОЖЕНИЕ A
Небольшой мануал по проге:
- Текст должен быть черным по белому
- Картинки для теста есть в архиве.
- Ориентация текста не под углом.
- Размер картинки желательно не меньше чем, те, что лежат в архиве, потому что при маленьком изображении плохо распознается из-за сливания пикселей.
- Распознавание персептроном с несколькими сумматорами и алгоритмом обучения без учета правильности ответа (она может это спросить=)
- Для обучения персептрона надо открыть изображение "Картинка для обучения.png" из папки "тестовые изображения" или создать аналогичную самостоятельно и открыть ее. Потом нажать "сегментация", Потом "Обучить", можно сохранить обучение, нажав "сохранить". Теперь можно открывать изображение, которое будет распознаваться. Для распознавания надо нажать "сегментация", потом "распознать".
- Если проводилось сохранение обучения, то можно не обучать. Для распознавания в таком случае надо делать следующие: открываешь распознаваемое изображение, нажимаешь "Сегментация", нажимаешь "загрузить", нажимаешь "распознать".
- В записке в графической части нужно вставить некоторые свои данные, я их отметил красным.
- путь к EXE-шнику: \WordSearcher\WordSearcher\bin\Debug\ WordSearcher.exe
Если будут какие-то баги или вопросы, сообщай - исправлю.
С уважением, Свирко Юрий
Mail: sv1r4.sd@gmail.com
Phone: 8-033-63-123-60
ЛИСТИНГ ПРОГРАММЫ
using 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 WordSearcher
{
public partial class FormMain : Form
{
///
/// Флаг разрешения распознавания
///
bool enableRecognize = false;
///
/// Размер битмапа со словом "Указ"
/// к этому размеру подгоняются все отсалдьные распознаваемые битмапы
///
private static Size imSize = new Size(65, 25);
///
/// Состояние формы
///
private FormState formState = FormState.Empty;
///
/// Масив битмапов сос словами текста
///
private List words;
///
/// Объект класса для распознавания(персептрон)
///
private Recognizer r = new Recognizer(imSize, 750, 2);
///
/// Метод для делания активными неактивными кнопок управления
/// в зависимости от этапа обработк изображения
///
/// текущее состояние
private void ButtonsEnabled(FormState fs)
{
formState = fs;
switch (fs)
{
case FormState.Empty:
buttonOpen.Enabled = true;
buttonSegment.Enabled = false;
buttonRecognize.Enabled = false;
buttonTeach.Enabled = false;
buttonLoadTeaching.Enabled = false;
buttonSaveTeaching.Enabled = false;
pictureBoxMain.Image = null;
dataGridViewSegments.Rows.Clear();
break;
case FormState.Open:
buttonOpen.Enabled = true;
buttonSegment.Enabled = true;
buttonRecognize.Enabled = false;
buttonTeach.Enabled = false;
buttonLoadTeaching.Enabled = false;
buttonSaveTeaching.Enabled = false;
dataGridViewSegments.Rows.Clear();
break;
case FormState.Segmented:
buttonOpen.Enabled = true;
buttonSegment.Enabled = true;
if (enableRecognize)
buttonRecognize.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];
//Первоначальная
//иницализация лямд еденицами