Реферат по предмету "Информатика, программирование"


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

СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. ПОСТАНОВКА ЗАДАЧИ
2. ОПИСАНИЕ ИСПОЛЬЗОВАННЫХ АЛГОРИТМОВ
2.1 Алгоритм сегментации текста
2.2 Алгоритм распознавания слова. Персептрон
3. РАЗРАБОТКА И РЕАЛИЗАЦИЯ ПО
3.1 Архитектура программы
3.2 Интерфейс программы
3.3 Описание разработанных классов
4. ТЕСТИРОВАНИЕПО
4.1 Запуск приложения
ВЫВОДЫ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ A ЛИСТИНГ ПРОГРАММЫ
ОПИСЬ ЛИСТОВ ГРАФИЧЕСКОЙ ЧАСТИ

/>ВВЕДЕНИЕ
Впоследние годы распознавание образов находит все большее применение вповседневной жизни. Распознавание речи и рукописного текста значительноупрощает взаимодействие человека с компьютером, распознавание печатного текстаиспользуется для перевода документов в электронную форму.
Реализацияметодов распознавания необходима в автоматизированных системах, предназначенныхдля использования в криминалистике, медицине, военном деле.
Особоследует отметить распознавание полноценных изображений. Область примененияданного раздела многогранна. Например, на современных заводах контроль качествапроизводимой продукции зачастую производят с использованием системраспознавания, которые отсеивают брак. Распознавание полноценных изображенийприменяется также на дорогах, для определения и распознавания номеровавтомобилей, контроль их скорости. Обработка изображений актуальна и прианализе снимков из космоса и с самолётов. Таким образом, видно, что областьприменения распознавания изображений широка и многогранна и позволяет намногосократить и упростить рабочий процесс и вместе с тем повысить его качество.Однако, возможности интеллектуального анализа изображений с помощью компьютеровоставляют желать лучшего. Можно с уверенностью отметить лишь успехи враспознавании букв и цифр в документах и текстах, а также анализе изображенийспециального вида. Такая область как распознавание текстур, исследование вкоторой проводятся не одно десятилетие, пока не имеет универсальных методов.
Задачейраспознавания изображенийявляется применение методов, позволяющих либополучить некоторое описание изображения, поданного на вход системы, либо отнестиэто изображение к некоторому определенному классу. Процедура распознавания применяетсяк некоторому изображению и обеспечивает преобразование его в некотороеабстрактное описание: набор чисел, цепочку символов или граф. Последующая обработкатакого описания позволяет отнести исходное изображение к одному из несколькихклассов.
Новозникает ряд трудностей и проблем. Чаще всего это связано с тем, чтоизображения предъявляются на сложном фоне или изображения эталона и входныеизображения отличаются положением в поле зрения, или входные изображения несовпадают с эталонами за счет случайных помех.
Вданном курсовом проекте разработано приложение, позволяющие на изображениикакого либо документа, либо просто текста находить слово «Указ». Входноеизображение может быть любого размера, ориентация текста должна бытьгоризонтальной.
Приложениереализовано в среде программирования MS Visual Studio 2008 на языке C#. Платформа .Netдает широкий набор классов для работы с изображениями и обработки результатов.
/>1. ПОСТАНОВКА ЗАДАЧИ
Согласно заданию к курсовомупроекту необходимо спроектировать приложение, реализованное на языке C# в среде разработки Microsoft Visual Studio 2008, реализующее распознавание слова «Указ»на изображении документа.
Исходныеданные:
1.        Растровое изображение документа.
2.        Текст документа должен бытьнаписан на белом фоне, черным шрифтом.
3.        Шрифт текста не должен бытькурсивным либо полужирным.
4.        Размер изображения может бытьлюбым.
5.        Положение текста на изображении горизонтальное.
Приложениедолжно выполнять следующие задачи:
1.        Загрузка изображения в приложение.
2.        Сегментация текста на слова.
3.        Распознавание среди слов слово «Указ».
Выходныеданные:
1.        Таблица найденных слов «Указ».
2.ОПИСАНИЕ ИСПОЛЬЗОВАННЫХ АЛГОРИТМОВ2.1Алгоритм сегментации текста
Процесс сегментации текстасостоит из двух этапов: выделение строк текста и выделение слов в строках.
Поиск строк осуществляется путемпросмотра пикселей изображения сверху вниз. При проходе запоминаютсявертикальные координаты всех полностью белых полос на изображении (рисунок2.1).
/>
Рисунок2.1 – Разбиение текста на строки
После нахождения всех белыхгоризонтальных полос анализируются их индексы. Для исключения соседних линий,строкой текста считается растр находящийся между двумя последовательными всписке, но не соседними белыми полосками.
Процесспоиска слов в строке заключается в анализировании вертикальных полос наизображении строки. При нахождении первой не полностью бело линии координатазапоминается и считается начальной координатой слова, затем анализируютсярасстояния между буквами. При превышении некоторого порога слово «вырезается»из строки. Процесс продолжается до конца строки.
Алгоритмсегментации текста представлен в графической части2.2Алгоритм распознавания слова. Персептрон
Распознаваниеслова «Указ» в разработанном приложении, реализовано на базеперсептрона. Алгоритм обучения персептрона – без учета правильности ответа.Персептрон построен по схеме «Несколько сумматоров». Общая схемаперсептрона представлена на рисунке 2.2
/>
Рисунок2.2 – Схема персептрона с несколькими сумматорами
Каждый А-элемент имеет нескольковходов и один выход.
А-элементы производяталгебраическое суммирование сигналов, поступивших на их входы, и полученнуюсумму сравнивают с одинаковой для всех А-элементов величиной ϑ. Если сумма больше ϑ, А-элементвозбуждается и выдает на выходе сигнал, равный единице. Если сумма меньше ϑ, А-элемент остаетсяневозбужденным и выходной его сигнал равен нулю. Таким образом, выходной сигналj-го Α-элемента:
yj= />/>
где величина rij принимаетзначение +1, если i -й рецептор подключен ко входу j-го Α-элемента сознаком плюс; и значение -1, если рецептор подключен со знаком минус, и значение0, если i-ый рецептор к j-му Α-элементу не подключается (j = 1, 2, …, m,где m – число Α-элементов).
Выходные сигналы Α-элементовумножаются на переменные коэффициенты λj.
После умножения на λ выходныесигналы поступают на сумматоры Σ, количество которых также равно числуразличаемых образов.
σ = />
Предъявленный объект относится ктому образу, сумматор которого имеет наибольший сигнал.
В данной работе есть двараспознаваемых класса условно из можно обозначить «Указ» и «Неуказ». При обучении класса «Указ» на вход персептрона поступаютизображения слова «Указ» написанное разными шрифтами. При обучениикласса «Не указ», для повышения надежности работы персептрона,поступают те же изображения с текстом «Указ», но с инвертированнымицветом.    
В каждом такте персептронотвечает на предъявленный ему объект возбуждением некоторых А-элементов.Обучение состоит в том, что коэффициенты λj возбужденных вданном такте А-элементов увеличиваются на некоторую величину (например наединицу), если в этом такте был предъявлен объект образа А, и уменьшается наэту же величину, если был предъявлен объект образа В.
3.      РАЗРАБОТКА И РЕАЛИЗАЦИЯ ПО3.1Архитектура программы
Программа написана как проект Windows Forms Application, т.е. windows-приложение,графический интерфейс которого представлен формами и диалоговыми окнами. Структураразработанного проекта представлена на рисунке 3.1.
/>
Рисунок3.1 – Структура проекта
Приложение разработано напринципах ООП. Диаграмма разработанных классов представлена на рисунке 3.2

/>
Рисунок3.2 – Диаграмма классов приложения
Общая схема приложения в натацииIDEF0 приведена на рисунке 3.3.
/>
Рисунок3.3 – Общая схема IDEF0 приложения

3.2Интерфейс программы
Пользовательскийинтерфейс представлен главным окном приложения, со всеми элементами управления,необходимыми для отображения и обработки информации. Главная форма в режимепроектирования показана на рисунке 3.4.
/>
Рисунок3.4 – Главная форма приложения в режиме проектирования3.3Описание разработанных классов
Ниже представлен переченьклассов разработанных в приложение с кратким описанием их назначения иописанием основных методов.
Form1 –класс, описывающий главную форму приложения, содержит методы обработки событийот элементов управления. Содержит элементы управления для отображения исходногоизображения, сегментов изображения и результатов распознавания.
Segmentation– описывает процесс сегментации изображения.
Методы:
public static List GetStrings(Bitmap text)– выделение растров, соответствующих строкам текста;
public static List GetStringWords(Bitmap str) –сегментирование одной строки на слова;
public staticList 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) [Электрон. ресурс]. ‑ Режим доступа: msdn.ru/
2.        Ковалева И.Л., «Алгоритмыобработки изображений», БНТУ, 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 = newRecognizer(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(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
{
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 voidbuttonSaveTeaching_Click(object sender, EventArgs e)
{
r.SerializeParams();
ButtonsEnabled(FormState.Serialized);
}
private voidbuttonLoadTeaching_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;
usingSystem.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, intlCount)
{
Random r = new Random();
//Создание матрцы ха
xa = new int[sz.Height * sz.Width, aCount];
//Создание матрицы лямд
l = new int[lCount,aCount];
//Первоначальная
//иницализация лямд еденицами
for (int i = 0; i
{
for (int j = 0; j
{
l[i, j] = 1;
}
}
//заполнение матрицы
//для каждого рецептора(строчки)
//назначаетя только один а-элемент(столбец) со знаком+ или -
for (int i = 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
{
for (int j = 0; 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
{
for (int j = 0; j
{
sumx[i] += x[j] * xa[j, i];
}
//Если сумма больше нуля выход а элемента 1
if (sumx[i] > 0)
outa[i] = 1;
}
//изменение коэфициетов лямда
for (int i = 0; i
{
//Если а-элемент возбужден то изменяем лямды
if (outa[i] == 1)
{
//перебор всех классов
for (int j = 0; j
{
//Увеличение на 1 лямд для класса который обучается
//и уменьшение для всех осатльных
if (classindex == j)
l[j, i]++;
else
l[j, i]--;
}
}
}
}
///
/// Распознавание изобржения
///
/// битмап изображения
/// имя класса к которому отнесеноизображение
public string Recognize(Bitmap b)
{
int[] x = new int[b.Height * b.Width];
int k = 0;
//Инициализация входных рецепторов
for (int i = 0; i
{
for (int j = 0; 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
{
for (int j = 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
{
for (int j = 0; j
{
sum[i] += outa[j] * l[i, j];
}
}
//нахождение максимального значения сумматор
//именно оно соответствует распознанному классу
int max = sum[0];
int maxindex = 0;
for (int i = 1; i
{
if (max
{
max = sum[i];
maxindex = i;
}
}
//Возвращается имя класса с максимальным значениемсумматора
return classes[maxindex];
}
///
/// Сериализация массива лямд(сохранение в файл) длясохранения обученяи персептрона
///
public void SerializeParams()
{
try
{
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = newFileStream(«l.dat», FileMode.Create);
bf.Serialize(fs, l);
fs.Close();
bf = new BinaryFormatter();
fs = new FileStream(«xa.dat»,FileMode.Create);
bf.Serialize(fs, xa);
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
///
/// Десериализация массива лямд(чтение из файла)
///
public void DeserializeParams()
{
try
{
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = newFileStream(«l.dat», FileMode.Open);
l = (int[,])bf.Deserialize(fs);
fs.Close();
bf = new BinaryFormatter();
fs = new FileStream(«xa.dat»,FileMode.Open);
xa = (int[,])bf.Deserialize(fs);
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
///
/// Подгонка битмапа по размеру и его бинаризация
///
/// входной битмап
/// новый размер битмапа
/// нормализованный битмап
public static Bitmap NormalizeBitmap(Bitmapb, Size sz)
{
//Подгонка размера
Bitmap inImg = new Bitmap(b, sz);
//Создание выходного битмапа на основе подогнанного
Bitmap outImg = new Bitmap(inImg);
//находим среднее значение яркости
int sum = 0;
for (int i = 0; i
{
for (int j = 0; j
{
Color cl = ((Bitmap)inImg).GetPixel(i,j);
sum += (cl.R + cl.G + cl.B) / 3;
}
}
int sredn = sum / (inImg.Width *inImg.Height);
//Просматриваем изображнеи и бинаризуем его
for (int i = 0; i
{
for (int j = 0; j
{
Color cl = ((Bitmap)inImg).GetPixel(i,j);
int gray = (cl.R + cl.G + cl.B) / 3;
if (gray > sredn)
outImg.SetPixel(i, j, Color.FromArgb(255,255, 255));
else
outImg.SetPixel(i, j, Color.FromArgb(0, 0,0));
}
}
return outImg;
}
///
/// Инверсия цвета битмапа
///
///
///
public static Bitmap InverseBitmap(Bitmapb)
{
Bitmap outImg = new Bitmap(b.Width,b.Height);
for (int i = 0; i
{
for (int j = 0; j
{
Color c = b.GetPixel(i,j);
outImg.SetPixel(i, j, Color.FromArgb(255 — c.R, 255 — c.G, 255 — c.B));
}
}
return outImg;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace WordSearcher
{
class Segmentation
{
///
/// Разбиение битмапа с текстоми на строки
///
/// исходный битмап
/// коллекция строк
public static ListGetStrings(Bitmap text)
{
List strs = newList();
List whiteLineIndexes = newList();
//Находим все белые горзонатльные линии на ихображении
//и запоминаем их индексы
for (int j = 0; j
{
bool whiteLineFound = true;
for (int i = 0; i
{
if (text.GetPixel(i, j) !=Color.FromArgb(255, 255, 255))
{
whiteLineFound = false;
break;
}
}
if (whiteLineFound)
whiteLineIndexes.Add(j);
}
//Выделение строк между белыми несоседними линиями
for (int i = 0; i
{
if (whiteLineIndexes[i + 1] — whiteLineIndexes[i] > 4)
{
strs.Add(text.Clone(
new Rectangle(
0,
whiteLineIndexes[i],
text.Width,
whiteLineIndexes[i + 1] — whiteLineIndexes[i]+1),
System.Drawing.Imaging.PixelFormat.Format24bppRgb));
}
}
return strs;
}
///
/// Получить список слов отдельной строки
///
/// битмап сострокой текста
/// спсиок слов строки
public static ListGetStringWords(Bitmap str)
{
List words = newList();
List whiteLineIndexes = newList();
//Находим все белые вертикальные линии на изображении
//и запоминаем их индексы
for (int i = 0; i
{
bool whiteLineFound = true;
for (int j = 0; j
{
if (str.GetPixel(i, j).R
{
whiteLineFound = false;
break;
}
}
if (whiteLineFound)
whiteLineIndexes.Add(i);
}
//Ширина пробела
int spaceWidth = 0;
int sum = 0;
int n = 0;
//Вычисление ширины пробела
for (int i = 0; i
{
int d = whiteLineIndexes[i + 1] — whiteLineIndexes[i];
if (d > 1)
{
sum += d;
n++;
}
}
//Ширина пробела необходимо при дальнейшем выделениислов
//коэф. подобран вручную
spaceWidth = (int)Math.Round(sum * 0.45 / n+ 0.1);
//начальная координата слова
int wordBegin = 0;
//конечная координат слова
int wordEnd = 0;
//флаг указывающий на то найденно ли начало слова или нет
//перволдится обратно в фолс после нахождения концаслова
bool wordFound = false;
//Счетчик ширины белой полоски
int whiteWidth = 0;
//Выделение слов
for (int i = 0; i
{
//если линии не соседние и флаг wordFound фолс т.е.
//слово еще не найдено
//запоминаем координату певрой линии это будет
//координатой началом слова
if ((whiteLineIndexes[i + 1] — whiteLineIndexes[i] > 1) &&
!wordFound)
{
//обнуление счетчика идущих подряд белыхз линий
whiteWidth = 0;
//флаг найденного слова в тру
wordFound = true;
//инициализируем начальную координату слова
wordBegin = whiteLineIndexes[i];
}
//инициализируем конечную координату слова
//если найдены не сосдение линии
//но не обрезаем битмап и не добавлям его в коллекцию
//т.к. необходисмо зделать проверку на ширину пробела
if ((whiteLineIndexes[i + 1] — whiteLineIndexes[i] > 1) &&
wordFound)
{
whiteWidth = 0;
wordEnd = whiteLineIndexes[i + 1];
}
//Если найденны соседние белые линии
//инкремируем счетчик белых линий и сравниваем ширинуидущих подрд белых линий
//с ранее высчитаной средней шириной пробела
if (whiteLineIndexes[i + 1] — whiteLineIndexes[i] == 1)
{
whiteWidth++;
if ((whiteWidth >= spaceWidth)&&
(wordEnd — wordBegin > 1))
{
//Обрезаем и добавляем слово в коллекцию
words.Add(TrimBitmap(
str.Clone(
new Rectangle(
wordBegin,
0,
wordEnd — wordBegin + 1,
str.Height),
System.Drawing.Imaging.PixelFormat.Format24bppRgb)
)
);
//обнуляем счетчики
//и флаги
whiteWidth = 0;
wordFound = false;
wordBegin = 0;
wordEnd = 0;
}
}
}
return words;
}
///
/// Получить битмапы всех слов в тексте
///
/// битмап с текстом
/// коллекция всех слов втексте
public static ListGetWords(Bitmap text)
{
List strs = GetStrings(text);
List words = newList();
foreach (Bitmap str in strs)
{
foreach (Bitmap word inGetStringWords(str))
{
words.Add(word);
}
}
return words;
}
///
/// Обрезка белых полей вокруг изображения на битмапе
///
///
///
public static Bitmap TrimBitmap(Bitmap bmp)
{
int left = 0;
int right = 0;
int top = 0;
int bottom = 0;
bool go = true;
//проход сверху
for (int j = 0; (j
{
for (int i = 0; (i
{
if (bmp.GetPixel(i, j) !=Color.FromArgb(255, 255, 255))
{
go = false;
top = j;
}
}
}
go = true;
//проход снизу
for (int j = bmp.Height — 1; (j >= 0)&& go; j--)
{
for (int i = 0; (i
{
if (bmp.GetPixel(i, j) !=Color.FromArgb(255, 255, 255))
{
go = false;
bottom = j;
}
}
}
go = true;
//проход слева
for (int i = 0; (i
{
for (int j = 0; (j
{
if (bmp.GetPixel(i, j) !=Color.FromArgb(255, 255, 255))
{
go = false;
left = i;
}
}
}
go = true;
//проход спарва
for (int i = bmp.Width — 1; (i >= 0)&& go; i--)
{
for (int j = 0; (j
{
if (bmp.GetPixel(i, j) !=Color.FromArgb(255, 255, 255))
{
go = false;
right = i;
}
}
}
return bmp.Clone(new Rectangle(left, top,right — left + 1, bottom — top + 1),System.Drawing.Imaging.PixelFormat.Format24bppRgb);
}
}
}

ОПИСЬ ЛИСТОВ ГРАФИЧЕСКОЙ ЧАСТИ
Лист1 – Схема приложения
/>
Функциональнаясхема приложения

Лист2 – Диаграмма классов
/>

Лист3 – Результаты работы программы.
/>

Лист4 – Схема алгоритма сегментации текста.
/>


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :