Смекни!
smekni.com

Распознавание графических символов (стр. 2 из 4)

public static List<Bitmap> GetStrings(Bitmap text)– выделение растров, соответствующих строкам текста;

public static List<Bitmap> GetStringWords(Bitmap str) –сегментирование одной строки на слова;

public staticList <Bitmap> GetWords(Bitmap text) – выделение слов из всего текста;

public staticBitmap TrimBitmap(Bitmap bmp) – обрезка белых полей вокруг изображения набитмапе.

Recognizer – класс, реализующий персептрон для распознавания образов.

Методы :

public voidTeach(Bitmap b, int classindex) – обучение персептрона;

public stringRecognize(Bitmap b) – распознавание изображения b;

public voidSerializeParams() – сохранение параметров персептрона на диске;

public void DeserializeParams() – чтение параметров персептрона с диска;

public static Bitmap NormalizeBitmap(Bitmap b, Size sz) –подгонка битмапа b по размеру sz.На выходе бинаризованное изображение размера sz;

public static Bitmap InverseBitmap(Bitmap b) –инверсия цвета изображения b.


4.ТЕСТИРОВАНИЕ ПО

Требования к установленному ПО:

- .Net Framework 3.5

Целью проведения испытанийявляется проверка работоспособности (надежности) программы при различныхусловиях ее функционирования и настройках. Для демонстрации работоспособностипрограммы необходимо провести ряд испытаний с различными начальными условиями.

Тестовые примеры выполнялись всреде операционной системы Windows 7 Ultimate при использовании процессора AMD Athlon3600+ 1.9 ГГц, 1 Гб RAM и разрешении экрана 1280x1024.

Приложениеподверглось критическому и углубленному тестированию.

Припроведении критического тестирования не было выявлено ошибок и некорректнойработы приложения.

4.1Запуск приложения

Длязапуска приложения необходимо запустить исполняемый файл WordSearcher.exe. Окно приложения после запуска показано на рисунке3.4

Рисунок3.4 – Главное окно приложения


Для начала работы необходимозагрузить исходное изображение, для чего необходимо нажать кнопку "Открыть".В диалоге выбора файла необходимо выбрать изображение. Окно программы после открытияисходного изображения представлено на рисунке 3.5

Рисунок3.5 – Окно программы с открытым изображением

Послеоткрытия изображения становится активным кнопка "Сегментация", посленажатия на которую, текст на изображении разбивается на слова.

Результатсегментации представлен на рисунке 3.6.

Рисунок3.6 – Результат сегментации


Переднепосредственным распознаванием текста необходимо произвести обучение персептрона,нажав кнопку "обучить", либо загрузить ранее сохраненные параметры,нажав кнопку "загрузить". Обучение персептрона осуществляетсяизображением содержащим слово "Указ", написанное разными шрифтами.После обучения, можно сохранить параметры персептрона в файл, нажав "сохранить",и прочитать их при следующем распознавании.

Послеобучения, либо загрузки параметров персептрона, можно производить распознаваниеизображений. Результат распознавания показан на рисунке 3.7.

Рисунок3.7 – Результат распознавания

При углубленном тестированиитакже не было найдено ошибок. Интерфейс программы разработан таким образом, чтопользователю на каждом этапе обработки изображения может выполнить только определенныедействия, что значительно снижает риск появления ошибок выполнения.

Результат работы программы призагрузке не файла изображения представлен на рисунке 3.8.


Рисунок3.8 – Результат работы приложения при неверно формате файла


ВЫВОДЫ

В результате выполнения данногокурсового проекта было разработано приложение, позволяющее распознавать слово "Указ"в тексте на изображении. Размеры изображения и шрифта текста может бытьпрактически любым, что дает гибкие возможности для применения приложения.

Для распознавания применяетсяперсептрон. Качество распознавания изображения зависит от количествапредложенных образов для обучения и количество А-элементов. Количествоподдерживаемых шрифтов зависит от шрифтов, которым написаны слова наизображениях для обучения.

Перед непосредственнымраспознаванием, как правило, необходимо выполнять сегментацию изображения. Сегментацияявляется неотъемлемой частью при распознавании образов, в общем случае, инепосредственно в данном проекте, так как ее результатом являются изображения,содержащие только необходимые для распознания объекты (слова текста).


СПИСОКИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1.        Microsoft DeveloperNetwork (MSDN) [Электрон. ресурс]. ‑ Режим доступа: http://msdn.ru/

2.        Ковалева И.Л., "Алгоритмыобработки изображений", БНТУ, 2007


ПРИЛОЖЕНИЕA

Небольшой мануал по проге:

- Текст должен быть черным побелому

- Картинки для теста есть вархиве.

- Ориентация текста не подуглом.

- Размер картинки желательно неменьше чем, те, что лежат в архиве, потому что при маленьком изображении плохораспознается из-за сливания пикселей.

- Распознавание персептроном снесколькими сумматорами и алгоритмом обучения без учета правильности ответа(она может это спросить=)

- Для обучения персептрона надооткрыть изображение "Картинка для обучения.png" из папки"тестовые изображения" или создать аналогичную самостоятельно иоткрыть ее. Потом нажать "сегментация", Потом "Обучить",можно сохранить обучение, нажав "сохранить". Теперь можно открыватьизображение, которое будет распознаваться. Для распознавания надо нажать"сегментация", потом "распознать".

- Если проводилось сохранениеобучения, то можно не обучать. Для распознавания в таком случае надо делатьследующие: открываешь распознаваемое изображение, нажимаешь"Сегментация", нажимаешь "загрузить", нажимаешь"распознать".

- В записке в графической частинужно вставить некоторые свои данные, я их отметил красным.

- путь к EXE-шнику:&bsol;WordSearcher&bsol;WordSearcher&bsol;bin&bsol;Debug&bsol; 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

{

/// <summary>

/// Флаг разрешения распознавания

/// </summary>

bool enableRecognize = false;

/// <summary>

/// Размер битмапа со словом "Указ"

/// к этому размеру подгоняются все отсалдьныераспознаваемые битмапы

/// </summary>

private static Size imSize = new Size(65,25);

/// <summary>

/// Состояние формы

/// </summary>

private FormState formState =FormState.Empty;

/// <summary>

/// Масив битмапов сос словами текста

/// </summary>

private List<Bitmap> words;

/// <summary>

/// Объект класса для распознавания(персептрон)

/// </summary>

private Recognizer r = newRecognizer(imSize, 750, 2);

/// <summary>

/// Метод для делания активными неактивными кнопокуправления

/// в зависимости от этапа обработк изображения

/// </summary>

/// <param name="fs">текущее состояние</param>

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(objectsender, 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(objectsender, 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(objectsender, 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(objectsender, EventArgs e)

{

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

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

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

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

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

{

foreach (Bitmap word in words)