Реферат: Помехоустойчивое кодирование, распознавание символов

 

ГОСУДАРСТВЕННЫЙ КОМИТЕТ РОССИЙСКОЙ ФЕДЕРАЦИИ

ПО ВЫСШЕМУ ОБРАЗОВАНИЮ

 Кубанский Государственный Технологический Университет

 

Кафедра автоматизации производственных процессов

 

             ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

                  к курсовой работе

   Тема: «КОДИРОВАНИЕ И ПЕРЕДАЧА ИНФОРМАЦИИ.

      РАСПОЗНАВАНИЕ ГРАФИЧЕСКИХ ОБЪЕКТОВ».

Выполнил: студент гр. 97-ОА-62

 ЯворскийД.Н.

 Номер зачётной

 книжки: 97-ОА-650

Проверил: доцент каф. АПП

 ШахворостовН.Н.

Краснодар

1999

 

ГОСУДАРСТВЕННЫЙ КОМИТЕТ РОССИЙСКОЙ ФЕДЕРАЦИИ

ПО ВЫСШЕМУ ОБРАЗОВАНИЮ

 

 КубанскийГосударственный Технологический УниверситетЗАДАНИЕНа курсовую работу

/>


Студенту гр.

/>


По дисциплине

/> /> /> /> /> <td/> /> /> /> />

Тема курсовой работы

/> /> /> /> /> <td/> /> /> /> />

Исходные данные

/> /> /> /> /> /> /> /> /> /> /> /> /> <td/> /> /> /> /> /> /> />

1. Выполнить расчёты:

/>  1.1

  1.2

/>


/>  1.3

/>  1.4


2. Выполнить графические работы:

/>  2.1

/>  2.2

3. Выполнить научные и учебно-исследовательские работы:

/>  3.1

/>  3.2

/>  3.3

  3.4

/>


4. Оформить расчётно-пояснительную записку

5. Основная литература

/> /> /> /> /> /> <td/> /> /> /> <td/> /> /> /> />

Задание выдано

/>


Срок сдачи работы

/>


Задание принял

/>


Руководитель проекта

/>


Работа защищена

/>


С оценкой

/>


ЧЛЕНЫ КОМИССИИ:


РЕФЕРАТ

ПЕРЕДАЧА ИНФОРМАЦИИ, КОДИРОВАНИЕ,КОД ШЕННОНА-ФЭНО,

     ЭФФЕКТИВНОСТЬ КОДА,РАСПОЗНАВАНИЕ СИМВОЛОВ.

    Темой курсового проектаявляется моделирование передачи эффективно закодированной информации по каналусвязи с помехами, а также распознавание пяти буквлатинского алфaвита.

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

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

и cодержащей помехи. В программе была смоделирована система распознавания,основанная на шаблонной классификации.  

Курсовой проект содержит     страниц, 3рисунка,

13 таблиц, 4 источника, 2 приложения.       
СОДЕРЖАНИЕ

ВВЕДЕНИЕ.......................................

1 КОДИРОВАНИЕ И ПЕРЕДАЧАИНФОРМАЦИИ

1.1 ТЕОРЕТИЧЕСКИЕСВЕДЕНИЯ.....................

1.2 ПОЛУЧЕННЫЕРЕЗУЛЬТАТЫ......................

1.3 ОПИСАНИЕПРОГРАММЫ.........................

1.4ВЫВОД......................................

2 РАСПОЗНАВАНИЕГРАФИЧЕСКИХ ОБЪЕКТОВ

1.1 ТЕОРЕТИЧЕСКИЕСВЕДЕНИЯ ....................

1.2 ОПИСАНИЕПРОГРАММЫ.........................

    1.3 ВЫВОД…

    ЗАКЛЮЧЕНИЕ.....................................

    ЛИТЕРАТУРА.....................................

    ПРИЛОЖЕНИЕ А...................................

   

    ПРИЛОЖЕНИЕ Б...................................


ВВЕДЕНИЕ

    Данная работа демонстрируетмоделирование процессов передачи и распознавания информации. Она состоит издвух частей.

Первая частьпосвящена моделированию канала передачи информации. Для передачи сообщениячерез такой канал с помехами используется алгоритм кодирования по методуШеннона-Фэно с последующим кодированием (n,1) кодом.

Втораячасть посвящена моделированию простой системы распознавания.В качестве объектов выступают пять прописных и пять строчных букв латинскогоалфавита в BMP-формате. Строкасимволов содержит помехи в виде одиночных и объединившихся   в   группы    пикселей.    Использован шаблонный подход   к   распознаванию.
1 КОДИРОВАНИЕ И ПЕРЕДАЧА ИНФОРМАЦИИ

1.1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

    Кодирование и передача информациипо каналу связи осуществляется в соответствии со схемой канала, изображенной нарисунке 1.1.1.

/> /> /> /> /> /> <td/> /> />

         Vi                                    Vj

/> /> /> /> /> /> />

  Кодер источника

  />

 Декодер

источника

  /> <td/>

Помехи

  />

/>/>/>                       

         Zi                                    Zj

  Канал

 

 Декодер

 канала

 

  Кодер

 канала

                   Xi                  Yj         /> /> /> /> /> /> <td/> />

Рисунок 1.1.1 — Структура передачи информации

    Источник генерирует последовательность сообщений изансамбля {V, P(V)},

где V – символ сообщения;

         P(V) – вероятность символа сообщения,рассчитываемая по формуле:

    />/>                             (1.1.1)

   

где i=1…m;

    m, r – заданные величины.

Кодер источника кодируетсообщение Vi в Zi по алгоритму Шеннона-Фэно.

Энтропия сообщения H(Z), бит/символ вычисляется по следующей формуле:

/>                           (1.1.2)

Формула для расчета средней длиныкода Lср, бит имеет вид:

/>                                   (1.1.3)

где L(Zi) – длина кода, бит;

    P(Zi) – вероятность кода.

Максимальная энтропия H(Z)max, бит/символнеравномерного двоичного кода Zi определяется по формуле:

/>                                (1.1.4)

Зная среднюю длину кода, можно определить коэффициент эффективности Кэф кода Zi поформуле:

/>                                    (1.1.5)

Для расчета коэффициентаизбыточности Кизб используется формула:

/>                             (1.1.6)

    Кодер канала осуществляет простое кодированиеповторением n = 3 раз каждого двоичного сигнала сообщения Zi. Таким образом,имеется всего два кода:

         Х1=(0 0 0)       Х2=(1 1 1)

    Вероятность каждого из них определяется по формуле:

    />                             (1.1.7)

    где к=0,1;

         /> -количество элементов «к» в коде Zi.

    При передаче Xк поканалу связи возможны ошибки с вероятностями, определяемыми следующим образом:

    P10=0.2 + 0.02A                             (1.1.8)

        

    P01=0.2 + 0.02B                             (1.1.9)

   

где р10 – вероятность принятия нуля при передаче единицы;

    р01 – вероятность принятия единицы при передаче нуля;

    А, В – заданные величины.

В дальнейшем, для удобства будутиспользоваться следующие принятые обозначения:

Х — передаваемый код;

Y — принимаемый код.

При построении канальной матрицы P(Y/X) воспользуемся тем, что припередаче может произойти ошибка лишь в одном разряде X1 илиX2.

    Тогда в 1 строке матрицы элементыопределятся следующим образом:               

/>                      1 – p01, i = 1

     

     P(xi,yj)=        P01/3  , i = 2,3,4.     (1.1.10)

                        

                      0      , i =5,6,7,8.

    Элементы канальной матрицы совместной вероятности P(X,Y)определяются по формуле:

    P(xi,yj)=P(xi)P(yj/xi)                            (1.1.11)

Зная матрицу совместнойвероятности P(X,Y), можно вычислить элементы матрицывероятностей P(Y). Они находятся по формуле:                  

    P(yi)=P(x1,yi)+P(x2,yi)                          (1.1.12)

    В свою очередь, формула для расчета элементов матрицыусловной вероятности P(X/Y) имеет вид:

    P(xi/yj)=P(xi,yj)/P(yj)                      (1.1.13)

    Энтропия передаваемого сигнала H(X), бит/символ и принимаемого сигнала H(Y), бит/символопределяется соответственно по формуле:

    />                           (1.1.14)

    />                           (1.1.15)

         Условные энтропии H(X/Y), бит/символи H(Y/X), бит/символ рассчитываются соответственно поформулам:

    />               (1.1.16)

    />               (1.1.17)

   

    Совместная энтропия H(X,Y), бит/символнаходится по формуле:

    />                   (1.1.18)

    Взаимная энтропия I(X,Y), бит/символопределяется по формуле:

    />                             (1.1.19)

   

    Передача информации по каналу связи осуществляется соскоростью V, рассчитываемой по формуле:

   

    V = 1000(A+1)                               (1.1.20)

    Постоянную скорость передачи двоичных символов по каналусвязи R, бит/с можно рассчитать по формуле:

    R =V × I(X,Y)/ 3;                         (1.1.21)

   

    Производительность источника />, бит/с определяется последующей формуле:

    />= (H(X) × V )                             (1.1.22)    


1.2ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ

По условию варианта определеныследующие постоянные:

m = 15;

r = 10;

Определим характеристикипосылаемых символов.

Вероятности символов Vi(они же — вероятности кода Zi), генерируемыхисточником рассчитываем по формуле 1.1.1. Полученные значения вероятностейприведены в таблице 1.2.2.

Сначала вероятности строятся поубыванию. После этого все вероятности делятся на двегруппы так, чтобы в пределах каждой группы их значениябыли примерно одинаковыми. В старший разряд кодов, соответствующих первой группе вероятностей,записывается 1, для второйгруппы кодов – 0. Затем каждая из полученных подгрупп,в свою очередь, делится аналогичным образом. При прохождении цикла деления по одному разряду происходитпереход на разряд вправо. Деление продолжается до техпор, пока в каждой группе не окажется по одному коду.

    Результаты разработки кодов показаны в таблице 1.2.1.

    Таблица 1.2.1 — Вероятности икоды символов

Vi P(Vi) Zi L(Zi) 1 0.231 11 2 2 0.183 10 2 3 0.1408 011 3 4 0.1042 0101 4 5 0.0732 01001 5 6 0.0732 01000 5 7 0.0479 00111 5 8 0.0479 00110 5 9 0.0282 00101 5 10 0.0282 00100 5 11 0.0141 00011 5 12 0.0141 00010 5 13 0.0056 000011 6 14 0.0056 000010 6 15 0.0028 000000 6

Вычислим энтропию сообщения H(Z), бит/символпо формуле

1.1.2 :

    H(Z) = 3.218 бит/символ

    Среднюю длину неравномерного кода определимпо формуле

1.1.3 :

    Lср = 3.5652 бит

Максимальную энтропиюнеравномерного двоичного кода Zi определяемпо формуле 1.1.4:

H(Z)max= 3.218 бит

По формуле 1.1.5 вычислимкоэффициент эффективности Кэф неравномерного двоичного кода Zi:

Кэф = 0.903

Для расчета коэффициентаизбыточности Кизб воспользуемся формулой1.1.6:

Кизб= 0.176

    При простом кодировании повторением n=3 раз каждогодвоичного сигнала сообщения Zi имеется два кода: Х1 и Х2, вероятности которыхР(Х1) и Р(Х2) находятся по формуле 1.1.7:

    Р(Х1) = 0.4113        Р(Х2) = 0.5885

    Вероятности возможных ошибок, при прохождении кода поканалу определяются по формулам 1.1.8 и 1.1.9 соответственно:

    P10 = 0.3             P01 = 0.2                             

Канальная матрица P(Y/X) состороны приемника для кода Х0 и Х1, рассчитанная по формуле 1.1.10, приведена втаблице 1.2.3. Для проверки расчета в последнем столбце таблицы 1.2.3 приведенасумма по текущей строке. Значения вероятностей в таблице 1.2.3 приводятся вдесятитысячных долях единицы.

Таблица 1.2.2 — Канальная матрица P(Y/X)

X Y сумма 000 001 010 100 011 101 110 111 000 8000 0667 0667 0667 0000 0000 0000 0000 10000 111 0000 0000 0000 0000 1000 1000 1000 1000 10000

    В таблице 1.2.3 приведены значения элементов канальнойматрицы совместной вероятности P(X,Y), определенные по формуле 1.1.11. Значениявероятностей в таблице 1.2.3 приводятся в десятитысячных долях единицы.

Таблица 1.2.3 -  Матрица совместных вероятностей P(X,Y)

Х Y 000 001 010 100 011 101 110 111 000 3292 0274 0274 0274 0000 0000 0000 0000 111 0000 0000 0000 0000 0588 0588 0588 4119

    Элементы матрицы вероятностей P(Y) находятся по формуле1.1.12. Полученные данные приведены в таблице 1.2.4 в десятитысячных доляхединицы. В последнем столбце для проверки приведена сумма по строке.

Таблица 1.2.4 — Матрица P(Y)

Y Сумма 000 001 010 100 011 101 110 111 3292 0274 0274 0274 0588 0588 0588 4119 10000

Рассчитав матрицы P(X,Y) и P(Y),можно вычислить элементы матрицы условной вероятности P(X/Y) по формуле 1.1.13.Матрица P(X/Y) приведена в таблице 1.2.6.

Рассчитываем энтропию передаваемого сигнала H(X) и энтропиюпринимаемого сигнала H(Y) по формулам 1.1.14 и 1.1.15 соответственно:

H(X) = 0.9777 бит/символ

H(Y) = 2.2025 бит/символ

Условные энтропии H(X/Y) и H(Y/X)рассчитаем, воспользовавшись формулами 1.1.16 и 1.1.17 соответственно:

    H(X/Y) = 0.0000 бит/символ

H(Y/X) = 1.2244 бит/символ

Таблица 1.2.5 — Матрица P(X/Y)

X Y Сумма 000 111 000 1 1.0000 001 1 1.0000 010 1 1.0000 100 1 1.0000 011 1 1.0000 101 1 1.0000 110 1 1.0000 111 1 1.0000

По формуле 1.1.18 находим совместнуюэнтропию H(X,Y):

    H(X,Y) = 2.2014 бит/символ

    Сделаем проверку полученных значений энтропий:

    H(Y/X) + H(X) = 2.2025 бит/символ

    H(X/Y) + H(Y) = 2.2025 бит/символ

    Совпадение полученных значений свидетельствует оправильности найденных значений энтропий.  

    Определим значение взаимной энтропии I(X,Y), используяформулу 1.1.19:

I(X,Y) = 0.9777 бит/символ

Для отыскания следующиххарактеристик канала вычислим скорость передачи двоичных символов по каналусвязи с помощью формулы 1.1.20:

V = 6000 символов/c

Информация передается по каналусвязи с постоянной скоростью R, вычисляемой с помощью формулы 1.1.21:

R = 1956.1бит/с

Производительность источника поформуле 1.1.22 равна:

/> = 5868.3 бит/с

Результатомработы программы являются графики числа ошибок восстановления информации отпараметра n (n,1) – кода и от p01 и p10. При теоретическом расчёте мы предположили, что в канале нет ошибок.Действительно, полученное нулевое значение энтропии H(X/Y) также об этом свидетельствует.

Однако полученный график говорито том, что это предположение становится соответствующимдействительности только начиная со значений n, равных 20..25.

    Примерный вид полученных графиков приведен на рисунках 1.2.1 и 1.2.2.

/>


       

            45      

  Количество

   ошибок,%

            15

     

                  20   40    60       100           

                 Количествоповторений, n          

     Рисунок 1.2.1 –Число ошибок восстановления   

/>


/>/>            100      

/>


  Количество

/>   ошибок,%

/> /> /> /> /> /> />

/>           15

/>


     

                  20   40    60       100           

                               p01,p10, %          

     Рисунок 1.2.1 –Число ошибок восстановления   

1.3 ОПИСАНИЕПРОГРАММЫ

В соответствии с заданием мноюбыла разработана программная модель канала с выводом графика зависимости числаошибок от числа n. Программа написана на языке BorlandPascal 7.0.

    Для программной реализации канала программа запрашиваетдлину передаваемого массива сообщений, число n и выполняет подсчет числа ошибок при его передаче. Затем идетрасчет массива данных для построения графика зависимости числа ошибок от n дляn, изменяющегося в интервале 1..100 сшагом 3. После этого происходит вывод на экран искомогографика.   

    В программе используются следующие процедуры и функции:

    Функция flag может приниматьбулевское значение в зависимости от входной вероятности.Она служит для осуществления в программе случайного события с заранее заданнойвероятностью.

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

    Процедура set_codes заполняетмассив кодов по алгоритму Шеннона-Фэно и инициализирует маски для декодированиянеравномерного кода.

    Функция без параметров sourseпри каждом обращении к ней принимает значение сообщения из ансамбля всоответствии с его вероятностью. Она использует тот жепринцип, что и функция flag.

    Процедура deranges вносит в код, соответствующий сообщению sourse,помехи в соответствии с моделью (n,1)-кода. В ней используются функции побитного сдвига shr и shl, а также функция flag.

    Процедура decoderслужит для раскодирования неравномерного двоичного кода после действияна него помех в канале. Поскольку наибольшая длина кодане превышает 8 бит, то для их хранения,передачи и декодирования используется тип данных– байт, причем располагаются они

в старших битах.

    Процедура graphikслужит для отображения на экране графика зависимости числа ошибоквосстановления информации от значений параметра n (n,1) – кода.Всё изображение привязано к началу координат (x0,y0).Для удобства по

оси y откладываются значения в %. График отображается отрезками прямых для сглаживания резкихскачков

значений.

1.4 ВЫВОД

 В данном разделе были рассмотрены алгоритм построениянеравномерного двоичного кода по алгоритму Шеннона-Фэно и такие характеристикикода и канала, как совместная энтропия, условная энтропия, производительностьисточника и т.д.

 Кодирование информации поШеннону-Фэно в сочетании с кодированием (n,1) кодом показало неплохиерезультаты при программном моделировании канала. Так, при передаче порядка 1000символов при n = 20..25 практически не наблюдается ошибок при р10 и р01,определенных по заданию.

2РАСПОЗНАВАНИЕ СИМВОЛОВ

2.1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

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

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

Все ситемы и модели распознавания можноклассифицировать следующим образом.

   Системы (модели)                  

распознавания 

 

/>/> 

/>


По заданиюкурсового проекта определён алфавит объектов – множество, состоящее из пятипрописных и пяти строчных букв латинского алфавита. Необходимо построить простую детерминированную  систему распознавания.

Под простойбудем понимать систему, алгоритм работы которой определён на основе априорнойинформации.

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

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

Детерминированнаясистема – это такая система, в которой  связь между значениями признаков иклассами жесткая, определенная.

Существует три подхода к задачераспознавания текстовых символов.

Первый –шаблонная (растровая) классификация.  При её использовании считанный символсравнивают со всеми шаблонами, хранящимися в базе. Критерии совпадения символов:

/>    а)Q=S fш<sub/>(xi,yj) XOR fs (xi,yj)       min( по всем шаблонам );

    б)Корреляция между шаблоном и считываемым символом

/>         R(t,z)=òx òy fш<sub/>(x,y). fs (x -<sub/>t, y -z)    max

Преимущества:малая чувствительность к дефектам (разрывы, шумы…)

Недостатки:необходимо обучение новым шрифтам и типам размеров шрифтов.

    Второй – признаковаяклассификация.

Преимущества:изображение символа преобразуется в простой набор признаков.

Недостатки:уход от истинного изображения.

При использовании этого методаможно использовать следующие признаки:

-    размеры и соотношения размеров символов (длина, высота, площадь);

-    проекции на различные оси;

-    моменты относительно различных осей и соотношения между ними;

   

Третий –структурная классификация. Заключается   в анализе топологии символов.

Обнаружение:углов, окрестностей,  линий,  пересечений, конечных точек и их взаимноерасположение.

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

2.2 ОПИСАНИЕПРОГРАММЫ

    Длямоделирования системы распознавания я разработал программу на языке BorlandPascal.

    Впрограмму вхолят следующие процедуры и функции.

    ПроцедураInit_Graph_Mode осуществляет вход в графический режимпри использовании графического драйвера видеоадаптера SVGA. Т.к. драйвер svga256.bgiне является встроенным в таблицу BGI, то для егоиспользования необходимо обратиться    к   стандартной  процедуре InstallUserDriver. Кроме того, эта процедура инициализируетпалитру GrayScale путем обращения к стандартнойпроцедуре SetRGBPalette.

    Процедура ShowListслужит для отображения на экране картинки со строкой символов. Отображение идет с увеличением в 9 раз,т.е. каждый пиксель исходнойкартинки отображается на экране окном 3*3 одинаковых пикселей.В процедуру в качестве параметров передается x и y точки-начала координат,относительно которой и происходит отображение.

    Процедура Init_Dataслужит для заполнения массивов данных: массивов, где содержатся считанные в память картинки.

    ПроцедураDeranges вносит в исходную картинку помехи.

Внесение помехосуществлялось из расчёта 20% от общего веса символов.Координаты пикселей-помех являются случайными числами в пределах ширины ивысоты картинки. Пиксель со случайными координатами инвертируется, т.е. припопадании на белый фон ставится чёрная точка, а припопадании на символ – белая точка.

    Процедура Filterпроизводит посильное удаление внесённых помех.Для этого используются 16 видов масок: для удаленияпомех, “залезших” на символ, для удаления групп издвух помех, для удаления помех, “пристроившихся” к символу. При совпадении маски с фрагментом изображенияпроисходит изменение соответствующих пикселей.

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

    Распознавание по корреляцииоформлено в основном блоке программы. В процессераспознавания происходит поочерёдное выделение минимально описанныхпрямоугольников вокруг “испорченных”помехами символов. Затем идет цикл сравнения очередного символа со всемишаблонами. После  проверки того, что символ поразмерам не меньше очередного шаблона, идет вычислениекорреляционной функции. Если символ больше шаблона, то вычисляется несколько значений со смещениями по x и y, а затем из них берётсямаксимальное. Полученные значения сравниваются междусобой. Номер шаблона, с которымполучено наибольшее сходство, и будет распознаннымсимволом.

ЗАКЛЮЧЕНИЕ

   

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

                                     ЛИТЕРАТУРА

1.Теоретические основы информационной техники/Темников Ф.Е.и др.- М.: Энергия,1971

    2. Орлов В.А., Филлипов Л.И.Теория информации в упражнениях и задачах. — М.: Высш.шк., 1976

    3. Сигорский В.П. Математическийаппарат инженера — Киев: Техника, 1975

    4. Солодов А.В. Теорияинформации и её

применение к задачамавтоматического управления и контроля — М.: Наука, 1967.

2.3  ВЫВОД

    Во второйчасти была рассмотрена модель распознавания, основанная на шаблоннойклассификации. Программное моделирование показалонеплохие результаты. Модель распознаёт строку практически в100% случаев при уровне помех до 40%. Однако данный подход можетиспользоваться только в том случае, если заранееизвестно, что распознаваемые символы будут одинаковогошрифта.    

ПРИЛОЖЕНИЕ А

    

     Текстпрограммы моделирования канала связи.

Program final_of_work;

uses  crt,graph;

const a=5;

      b=0;

      m=10+(a mod 6);         {15}

      r=trunc((m+a-b)/2);     {10}

var

   n,                                   {n для (n,1) — кода}

   temp,ent,out,symb,decode:byte;   {буферы длякодирования}

   p:array[1..m] of real;                     {вероятности}

   p01,p10:real;                        {p единичнойошибки}

   z,dl:array[1..m] of byte;               {код, длинакода}

   mask: array[1..8] of byte;      {маски длядекодирования}

   data_n,data_p

       :array[1..100] of integer;       {данные для графика}

   i,j,                                          {счетчики}

   count_of_errors,          {счетчик ошибоквосстановления}

   dlina,sh,                       {длина массивасообщений}

   count:integer;           {счетчик для построенияграфика}

   range,c,s,l:byte;

          fl:boolean;

function flag(px:real):boolean;

               {---осуществляет событие с вероятностьюp---}

  var ww,wq: word;

  begin

    ww := round(px * 100);

    wq := random(100);

    if ww > wq then flag := true else flag := false;

  end;

procedure ver;    {------------расчетвероятностей---------}

var s,i3,j3: integer;

    tmp,s1:real;

begin

 s:=0;tmp:=0;                        {вычисляемвероятности}

  for j3:=1 to m do

   s:=s+sqr(j3-r);

   s:=s+m;

   for i3:=1 to m do

      p[i3]:=(1+sqr(i3-r))/s;

                  {-------упорядочиваемвероятности--------}

   for i3:=1 to m-1 do                        {внешнийцикл}

    begin

      tmp := p[i3];                     {локальныймаксимум}

      for j3:=i3 to m do

        if p[j3] >= tmp then

          begin

             tmp := p[j3];              {максимум на iшаге}

             s:=j3                               {егономер}

          end;

      p[s] := p[i3];                                {обмен}

      p[i3] := tmp

    end;

end;

procedure deranges;   {----------внесениепомех------------}

  var tmp: byte;

    c0,c1: integer;      {счетчики 0 и 1 длядекодирования}

  begin

    out := 0;                     {выходной код послепомех}

    for i := 0 to 7 do                    {цикл поразрядам}

    begin

      c0 := 0;                             {сброссчетчиков}

      c1 := 0;

      tmp := (z[ent] shr i) and 1;         {выделяемразряд}

      for j := 1 to n do       {цикл по разрядам(n,1)-кода}

        case tmp of                     {определяеммпомеху}

          0: if flag(p01) then inc(c1) else inc(c0);

          1: if flag(p10) then inc(c0) else inc(c1)

        end;

      if c1 > c0 then out := out or (1 shl i)

    end;                      {вносим помеху в выходнойкод}

  end;

procedure set_codes; {-----по алгоритму Шеннона — Фэно-----}

 var i3,j2: byte;

 function numb(v:real):byte;{номер вероятности,находящейся}

 var i2: byte;       {"" той, что передаетсякак параметр}

 begin

    for i2 := 1 to m do               {цикл повероятностям}

     if(v >= p[i2 + 1]) and (v <= p[i2]){если нашлиграницы}

     then

       numb := i2;            {присваиваем номер«верхнего»}

 end;

 begin               {-------------ofprocedure------------}

   for i := 1 to m do                {обнуляем коды идлины}

     begin

       z[i] := 0;

       dl[i] := 0

     end;

   range := 8;            {разряд — в максимальноезначение}

   c := 0;              {счетчик по «вертикали»- на начало}

   repeat                      {внешний цикл покодам......}

     if c = 0                             {если вначале...}

       then

         dec(range);          {… уменьшаем текущийразряд}

     inc(c);                {увеличиваем внутреннийсчетчик}

     if (z[c] = z[c + 1]) and (c <= m)

                                    {если два кодаравны...}

       then

         begin                          {… то циклделения}

             fl := false;         {флаг дальнейшегоделения}

             i := c;                    {«верхняя» граница}

             j := c + 1;                 {«нижняя» граница}

             if (z[j] = z[j + 1]) or (j + 1 < m)

                                   {если ещё естьравные...}

               then

                 fl := true;               {… то ещёделим}

             while fl do              {пока можноделить...}

               begin

                 inc(j);     {… увеличиваем нижнююграницу}

                 if (z[j] <> z[j — 1]) or (j > m- 1) then

                   fl := false

               end;

             if((j — i) > 1) and (j < m)

                                     {если > 2элементов...}

               then

                 dec(j);    {… корректируем нижнююграницу}

             s := numb((p[i] + p[j])/2);            {делим}

             if p[i] = p[j]           {если дваэлемента...}

               then

                 s := i;           {середину — на«верхний»}

             if j <= m       {если не за пределамикодов...}

               then

                 for l := i to j do      {… цикл по группе}

                 if l <= s then {устанавливаем коды идлины}

                     begin

                       z[l] := z[l] or (1 shl range);

                       dl[l] := dl[l] + 1

                     end

                   else

                     dl[l] := dl[l] + 1;

               if j < m then {устанавливаем текущийсчетчик}

                 c := j

               else

                 c := 0

         end

            else if c = m then c := 0;

   until range = 0;{… пока не дойдем до последнегоразряда}

           {--------------инициализациямасок--------------}

   temp := 0;

   for i := 1 to 8 do

     begin

       temp := temp or (1 shl (7 — (i — 1)));

       mask[i] := temp

     end

end;

function sourse:byte;  {-----генерирует число из 1..15-----}

  var cou: byte;

   tu,ttu: real;

  begin

    cou := 1;                           {начальноезначение}

    ttu := p[cou];                 {случайное число из0..1}

    tu := random;

    while ttu < tu do begin    {пока не превысилиrandom...}

      inc(cou);

      ttu := ttu + p[cou];             {увеличиваемсчетчик}

    end;

    sourse := cou;              {присваиваем число из1..15}

  end;

procedure decoder;           {---для неравномерногокода---}

  var

     code:byte;

  begin

        code:=out;

          for i:=1 to 8 do        {цикл со старшегоразряда}

           begin

            temp:=code and mask[i];           {выделяемкод}

              for j:=1 to m do

                if (temp=z[j]) and (i=dl[j]){еслисовпадает}

                  then

                    decode:=j;              {… декодируем}

           end;

   end;

procedure graphiki; {-----------построениеграфика----------}

 const x0=250;                            {началокоординат}

       y0=400;

 var nn,ss,ii:integer;

     sr:string;

     driver,mode,errcode:integer;

 begin

      driver:=detect;

      initgraph(driver, mode,'');    {инициализацияграфики}

      errcode:=graphResult;

       if errcode<>grOk then

         begin

            Writeln(' Ошибка графики. ');

            writeln(GraphErrorMSG(Errcode));

                     halt

         end;

  setcolor(white);                   {контуры фигур итекст}

  line(x0,y0,x0,y0-300);                  {------осьy-----}

  line(x0,y0,x0+200,y0);                  {------ось x-----}

  SetTextStyle(DefaultFont, HorizDir, 1); {установкашрифта}

  OutTextXY(x0,y0+40,'Количество повторений, n');

  SetTextStyle(DefaultFont, VertDir, 1);

  SetTextJustify(LeftText,TopText);{--способвыравнивания--}

  OutTextXY(x0-50,180,'Количество ошибок, %');

  SetTextStyle(DefaultFont, HorizDir, 1);

   for i:=1 to 5 do

    line(x0+i*35,y0,x0+i*35,y0-5);{делительные штрихи осиx}

         outtextxy(x0+35,y0+10,'20');

         outtextxy(x0+5*35,y0+10,'100');

   for i:=1 to 4 do

    line(x0,y0-i*65,x0+5,y0-i*65);{делительные штрихи осиy}

         outtextxy(x0-20,y0-65,'15');

         outtextxy(x0-20,y0-3*65,'45');

   for nn:=1 to 33 do

   begin                                     {рисуемграфик}

     setcolor(2);

     line(x0+(nn+1)*5,round((y0-data_n[nn])),

       x0+(nn+2)*5,round((y0-data_n[nn+1])));

   end;

   setcolor(15);

   outtextxy(50,460,'Press any key...');

   readkey;

   ClearViewPort;

   line(x0,y0,x0,y0-360);                           {------ось y-----}

   line(x0,y0,x0+200,y0);                            {------осьx-----}

   SetTextStyle(SmallFont, HorizDir, 5);       {---установка шрифта--}

   OutTextXY(x0,y0+40,'Значения p01 и p10, %');

   SetTextStyle(SmallFont, VertDir, 5);

   SetTextJustify(LeftText,TopText);    {-----способ выравнивания-----}

   OutTextXY(x0-50,140,'Количество ошибок, %');

   SetTextStyle(DefaultFont, HorizDir, 1);

    for i:=1 to 5 do

      line(x0+i*35,y0,x0+i*35,y0-5);  {----делительныештрихи оси x---}

          outtextxy(x0+35,y0+5,'20');

          outtextxy(x0+5*35,y0+5,'100');

    for i:=1 to 4 do

      line(x0,y0-i*75,x0+5,y0-i*75); {----делительныештрихи оси y---}

          outtextxy(x0-25,y0-75,'25');

          outtextxy(x0-25,y0-2*75,'50');

          outtextxy(x0-25,y0-3*75,'75');

          outtextxy(x0-25,y0-4*75,'100');

      {line(x0,y0-4*75,x0+200,y0-4*75);}

   setcolor(2);

   for nn:=1 to 13 do

                                        {рисуем график}

       line(x0+(nn+1)*12,round((y0-data_p[nn])),

       x0+(nn+2)*12,round((y0-data_p[nn+1])));

 end;

 {=====================ОСНОВНОЙБЛОК=======================}

Begin

   clrscr;

   p10:=0.2+0.02*a;

   p01:=0.2+0.02*b;

   randomize; {--инициализация генератора случайныхчисел--}

   ver;        {инициализация и упорядочиваниевероятностей}

   set_codes;         {--------инициализациякодов---------}

   TextColor(15);

   gotoxy(10,1);

   write('ПАРАМЕТРЫ КАНАЛА :');

   gotoxy(1,2);write('Вероятности одиночных ошибок :');

   gotoxy(3,5);write('при передаче нуля :    ',p01:4:3);

   gotoxy(3,6);write('при передаче единицы: ',p10:4:3);

   gotoxy(40,1);write('НЕРАВНОМЕРНЫЕ КОДЫ СООБЩЕНИЙ: ');

   for i := 1 to m do          {--------выводкодов--------}

     begin

         gotoxy(45,1+i);

         write(' z(',i,') = ');

         gotoxy(55,1+i);

         for j := 1 to dl[i] do

           write((z[i] shr (8 — j)) and 1);       {побитно}

     end;

   gotoxy(10,19);

   write('Ввести длину передаваемого массива сообщений:');

   read(dlina);

   write('         Ввести n для (n,1) — кода: ');

   read(n);

   count_of_errors := 0;

   for sh := 1 to dlina do

     begin            {--------передачасообщений----------}

       ent := sourse; {--случайное сообщение изансамбля---}

       deranges;      {-----------внесениепомех-----------}

       decoder;       {----декодирование двоичногокода----}

       if ent <> decode then inc(count_of_errors);

     end;

   gotoxy(10,23);

   write('РЕЗУЛЬТАТ ПЕРЕДАЧИ СООБЩЕНИЙ: ');

   TextColor(12);

   write( 'КОЛИЧЕСТВО ОШИБОК =  ',count_of_errors);

   TextColor(15);

   gotoxy(10,24);

   write('Please wait...');

   {---------расчет count_of_errors для разныхn-----------}

   n := 0;count := 0;dlina := 100;

   repeat

     n := n + 3;

     inc(count);

     count_of_errors := 0;

     for sh := 1 to dlina do

       begin

         ent := sourse;

         deranges;

         decoder;

      if ent <> decode then inc(count_of_errors);

     end;

     data_n[count] := round(count_of_errors*3) ;

   until n >= 96;

       {---расчет count_of_errors для разных p01 иp10---}

   n:=3;count:=0;dlina := 100;p01:=0;p10:=0;

   repeat

     p01:=p01+0.07;

     p10:=p10+0.07;

     inc(count);

     count_of_errors := 0;

     for sh := 1 to dlina do

       begin

         ent := sourse;

         deranges;;

         decoder;

      if ent <> decode then inc(count_of_errors);

     end;

     data_p[count] := round(count_of_errors*3) ;

   until p01 >= 0.98;

   gotoxy(10,24);

   writeln('Press any key to continue...');

   readkey;

   graphiki;

   readkey;

   closegraph;

End.

ПРИЛОЖЕНИЕБ

 

     Текст программыраспознавания символов

Program Final_of_work;

uses graph;

const BiH=50;       {-------высота картинки впикселях------}

      BiW=160;      {-------ширина картинки впикселях------}

stroka:array[1..10] of char=

                   ('I','h','i','G','F','k','H','g','J','j');

   {-----эталонная строка для установлениясоответствия-----}

type arr=array[1..BiW,1..BiH] of byte; {типмассива-картинки}

const

path0='work.bmp';       {путь к bmp-файлу с исходнойстрокой}

var file0,file1:file of byte; {файловые переменные длясвязи}

    counter,          {счетчик текущей позициираспознавания}

    rasp:byte;         {номер текущего распознанногосимвола}

f0,                            {массив с эталоннойкартинкой}

f:arr;                {массив с картинкой, содержащейпомехи}

       x,y,                       {счетчики хода помассивам}

xmin, ymin,xmax, ymax, {минимально описанныйпрямоугольника}

             xt, {текущая позиция x при движении покартинке}

xsav,{для сохранения текущего x при использованиикорреляции}

                     i,j,          {вспомогательныесчетчики}

xm,xk,ym,yk,

{для сохранения текущего м.о.п. при использованиикорреляции}

            k,{счетчик шаблонов при использованиикорреляции}

di,dj  :   integer;

          {смещения шаблона и символа по x и y приналожении}

flag :boolean;          {признак отображения на экранерамки}

      kfmax,     {глобальный максимум корреляции длясимвола}

      max,         {значение корреляции для текущегошаблона}

      kf,      {текущая переменная для вычислениякорреляции}

      smin:longint;    {минимально возможная площадьшаблона}

Procedure Init_Graph_Mode;  {-----инициализацияграфики-----}

var

  Driver,              {код драйвера графическогоустройства}

  Mode,                             {код графическогорежима}

  TestDriver,       {внутренний номер драйвера в таблицеBGI}

  ErrCode: Integer;                              {кодошибки}

  function TestDetect: Integer; far;

{функция определения параметров графического режимадрайвера}

{полный адрес точки входа в функцию, т.е. =сегмент+смещение}

      begin

        TestDetect := 3;    {разрешение экрана 800*600точек}

      end;

begin

  TestDriver := InstallUserDriver('svga256',@TestDetect);

                  {устанавливает новый драйвер в таблицуBGI}

  if GraphResult <> grOk then

  begin

Writeln('Ошибка при установке драйвера:',

                                    GraphErrorMSG(ErrCode));

    Halt(1);

  end;

  Driver := Detect;{автоматическое определение драйвера-SVGA}

  InitGraph(Driver, Mode, '');

                         {инициализация графическогорежима;}

                               {драйвер — в текущемкаталоге}

  ErrCode := GraphResult;

  if ErrCode <> grOk then

  begin

    Writeln('Ошибка графического режима:',

                                    GraphErrorMSG(ErrCode));

    Halt(1);

  end;

  SetTextStyle(DefaultFont, HorizDir, 1);     {текущийшрифт}

  OutTextXY(120,20,'Идет инициализация графическогорежима...');

  for x := 0 to 255 do      {инициализация палитрыgrayscale}

      SetRGBPalette(x,x,x,x);

  OutTextXY(450,20,'Ok.');

end;

Procedure showlist(xn,yn:integer);

      {---отображение картинки c масштабированием в 9раз---}

                     {xn,yn-начало координат приотображении}

  begin

    x := 1;                     {текущие координаты-вначало}

    y := 1;

    repeat                           {внешний цикл-повысоте}

        for i := -1 to 1 do

          for j := -1 to 1 do   {текущий пиксель — окном3*3}

            PutPixel((3*x+i)+xn,(3*BiH-3*y+j)+yn,f[x,y]);

        x := x + 1;                         {приращениепо x}

        if x = BiW then                      {если скраю...}

          begin

            x := 1;         {… то переходим в следующийряд}

            y := y + 1

          end;

    until y = BiH;      {пока не окажемся в последнейстроке}

  end;

procedure Init_Data;   {-----заполнение массивовданных-----}

var t:byte;

begin

  assign(file0,path0);

   reset(file0);

    seek(file0,$436);

     for y:=1 to BiH do

       for x:=1 to BiW do

         begin

            read(file0,t);        {заполняем массившаблонов}

            f0[x,y]:=t;

         end;

    for x := 1 to BiW do{заполняем массив для внесенияпомех}

      for y := 1 to BiH do

        f[x,y]:=f0[x,y];

end;

Procedure Deranges;    {-----------внесениепомех-----------}

const u=20; {---уровень помех в % от общего весасимволов---}

var count,      {количество внесенных помех}

    w: integer;    {суммарный вес символов}

begin

  count := 0;

  w:=0;

  randomize;       {инициализация генератора случайныхчисел}

  for x := 1 to BiW do           {подсчитываем суммарныйвес}

    for y := 1 to BiH do

      if f[x,y] = 0 then w:= w+1;

  repeat                       {------вносимпомехи...------}

    x := random(BiW);                  {случайныекоординаты}

    y := random(BiH);

    if (x in [3..BiW-2]) and (y in [3..BiH-2]) then

      begin

        if (f[x,y] = 255) then        {если на беломфоне...}

          f[x,y] := 1;                   {… то чернаяточка}

        if (f[x,y] = 0) then         {если на черномфоне...}

          f[x,y] := 255                   {… то белаяточка}

      end;

    count := count + 1;                   {ув. счетчик помех}

  until 100*count >= u * w;  {пока не получим данныйуровень}

  for x := 1 to BiW do             {перекрашиваем в 0-йцвет}

    for y := 1 to BiH do

      if f[x,y] = 1 then

        f[x,y] := 0

end;

Procedure Filter; {-----фильтрация изображения отпомех-----}

                      {специальные маски для удаления помех;}

 {если при наложении маска совпала с фрагментомизображения,}

                        {то изменяем соответствующиепиксели}

const mask1:array[1..4,-1..1,-1..1] of byte =

      (((1,1,0),(1,0,0),(1,1,0)),

      ((1,1,1),(1,0,1),(0,0,0)),

      ((0,1,1),(0,0,1),(0,1,1)),

      ((0,0,0),(1,0,1),(1,1,1)));

                   {для удаления помех,«залезших» на символ}

   mask2:array[5..12,-2..2,-2..2] of byte =

  (((0,0,0,0,0),(0,0,0,0,0),(0,0,1,0,0),(0,1,0,0,0),(0,0,0,0,0)),

   ((0,0,0,0,0),(0,0,0,0,0),(0,1,1,0,0),(0,0,0,0,0),(0,0,0,0,0)),

  ((0,0,0,0,0),(0,1,0,0,0),(0,0,1,0,0),(0,0,0,0,0),(0,0,0,0,0)),

  ((0,0,0,0,0),(0,0,1,0,0),(0,0,1,0,0),(0,0,0,0,0),(0,0,0,0,0)),

  ((0,0,0,0,0),(0,0,0,1,0),(0,0,1,0,0),(0,0,0,0,0),(0,0,0,0,0)),

   ((0,0,0,0,0),(0,0,0,0,0),(0,0,1,1,0),(0,0,0,0,0),(0,0,0,0,0)),

  ((0,0,0,0,0),(0,0,0,0,0),(0,0,1,0,0),(0,0,0,1,0),(0,0,0,0,0)),

  ((0,0,0,0,0),(0,0,0,0,0),(0,0,1,0,0),(0,0,1,0,0),(0,0,0,0,0)));

                         {для удаления групп одиночныхпомех}

   mask3:array[13..14,-2..2,-1..1] of byte =

   (((1,0,0),(1,0,0),(1,1,0),(1,0,0),(1,0,0)),

   ((0,0,1),(0,0,1),(0,1,1),(0,0,1),(0,0,1)));

   mask4:array[15..16,-1..1,-2..2] of byte =

   (((1,1,1,1,1),(0,0,1,0,0),(0,0,0,0,0)),

   ((0,0,0,0,0),(0,0,1,0,0),(1,1,1,1,1)));

             {для удаления помех,«пристроившихся» к символу}

 var m,n,l: integer;              {вспомогательныесчетчики}

   flg: boolean;                   {признак выхода изцикла}

    su: array[1..16] of longint;     {массив сумм длямасок}

 begin

      for i := 3 to BiW-2 do    {внешний цикл поизображению}

        for j := 3 to BiH-2 do

             begin

               l := 0; {если белая точка окруженачерными...}

               for m:=-1 to 1 do

                 for n:= -1 to 1 do

                     l := l + f[i+m,j+n];

               if (l = 255) and (f[i,j] = 255) then

                 f[i,j] := 0;      {… то делаем и еёчерной}

                       {если черная точуа окруженабелыми...}

               if (l >= 255*8) and (f[i,j] = 0) then

                 f[i,j] := 255;     {… то делаем и еёбелой}

                                   {обнуляем суммы длямасок}

               for l := 1 to 16 do

                 su[l] := 0;

                              {суммируем по всем видаммасок}

               for l := 1 to 4 do

                 for m:=-1 to 1 do

                   for n:= -1 to 1 do

      su[l] := su[l] + ((not f[i+m,j+n]) xormask1[l,m,n]) and 1;

               for l := 5 to 12 do

                 for m:=-2 to 2 do

                   for n:=-2 to 2 do

      su[l] := su[l] + ((not f[i+m,j+n]) xormask2[l,m,n]) and 1;

             for l := 13 to 14 do

               for m:=-2 to 2 do

                 for n:=-1 to 1 do

      su[l] := su[l] + ((not f[i+m,j+n]) xormask3[l,m,n]) and 1;

             for l := 15 to 16 do

               for m:=-1 to 1 do

                 for n:=-2 to 2 do

      su[l] := su[l] + ((not f[i+m,j+n]) xormask4[l,m,n]) and 1;

                {---проверяем по очереди каждый видмасок---}

             {для первого вида — зачерняем центральнуюточку}

               l := 0;

               flg := false;

               repeat

                 l := l + 1;

                 if su[l] = 0 then

                   flg := true;

               until (flg) or (l = 4);

               if flg then

                 f[i,j] := 0;

                        {для второго — делаем белым окно3*3}

               l := 4;

               flg := false;

               repeat

                 l := l + 1;

                 if su[l] = 0 then

                   flg := true;

               until (flg) or (l = 12);

               if flg then

                 for m := -2 to 2 do

                   for n := -2 to 2 do

                     f[i+m,j+n] := 255;

 {для третьего и четвертого — делаем белой центральнуюточку}

               l := 12;

               flg := false;

               repeat

                 l := l + 1;

                 if su[l] = 0 then

                   flg := true;

               until (flg) or (l = 16);

                  if flg then

                    f[i,j] := 255;

        end

  end;

    {-----------минимально описанныйпрямоугольник----------}

procedure ramka(zx:arr;flagx:boolean);

var

  c: integer;  {счетчик черных точек}

begin

  xmin:=BiW;xmax:=0;ymin:=BiH;ymax:=0;

                        {начальные значения координатм.о.п.}

  c:=0;                         {начальное значениесчетчика}

  xt := xt + 1;                 {сдвигаем текущуюкоординату}

  repeat                  {цикл увеличения xt покартинке...}

    xt := xt + 1;

    for y := 3 to BiH-2 do               {просмотр повысоте}

      if zx[xt,y] = 0 then

        c:= c+1;

  until (c <> 0) or (xt > BiW — 6);

                           {… пока не встретим чернуюточку}

  c:= 0;                        {начальное значениесчетчика}

  repeat               {цикл по символу...}

    c := 0;

    for y := 3 to BiH — 2 do             {просмотр повысоте}

      if zx[xt,y] = 0  then            {если чернаяточка...}

        begin

          c:=c+1;                         {… то ув. счетчик}

          if xt < xmin then xmin := xt;   {изм.коорд.м.о.п.}

          if xt > xmax then xmax := xt;

          if y < ymin then ymin := y;

          if y > ymax then ymax := y

        end;

     if xt <> 0 then xt := xt + 1;            {ув. текущий x}

  until (c=0) or (xt > BiW — 2);{… пока не дойдем добелого}

  if flagx then                             {еслипризнак...}

    begin                       {… то рисуемрамку;100-цвет}

      for x:=xmin-1 to xmax+1  do f[x,ymin-1]:=100;

      for x:=xmin-1 to xmax+1  do f[x,ymax+1]:=100;

      for y:=ymin-1 to ymax+1  do f[xmin-1,y]:=100;

      for y:=ymin-1 to ymax+1  do f[xmax+1,y]:=100

    end

end;

  {=====================ОСНОВНОЙ БЛОК=======================}

BEGIN

  Init_Graph_Mode;

  OutTextXY(120,30,'Идет инициализация данных… ');

  Init_Data;

  OutTextXY(345,30,'Ok.');

  flag := false;

  smin:=BiH*BiH;              {max возможная площадьсимвола}

  For counter := 1 to 10 do                {цикл пошаблонам}

   begin           {определяем min возможную площадьсимвола}

    Ramka(f0,flag);

    if (xmax-xmin)*(ymax-ymin) <= smin then

      smin:= (xmax-xmin)*(ymax-ymin)

  end;

  OutTextXY(300,50,'Исходная строка символов: ');

  Deranges;

  ShowList(170,70);

  Filter;

  OutTextXY(270,260,'Строка символов после фильтрации:');

  xt := 2;

  ShowList(170,280);

  OutTextXY(120,500,'Идет распознавание строки символов:');

  SetTextStyle(DefaultFont, HorizDir, 4);

  flag := true;                              {рисоватьрамку}

  counter := 0;

  Repeat                  {---цикл по картинке спомехами---}

      counter := counter + 1;{ текущий символ}

      Ramka(f,flag);

              {---------Распознавание покорреляции---------}

        kfmax:=0;                 {min возможное значениеKf}

        xsav:=xt; {сохраняем текущий x в картинке спомехами}

        xm:=xmin;       {сохраняем текущие координатым.о.п.}

        xk:=xmax;

        ym:=ymin;

        yk:=ymax;

        xt:=2;    {текущий x — в начало картинки сшаблонами}

        for k := 1 to 10 do          {---цикл пошаблонам---}

          begin

            Ramka(f0,not flag);

            di:=0;          {смещение шаблона и символапо x}

            dj:=0;          {смещение шаблона и символапо y}

            max:=0;       {min возможное значение текущейKf}

            if (xk-xm >= xmax-xmin) and (yk-ym >=ymax-ymin)

             {если шаблон <= текущего символа...}

            then   {… тогда сравниваем с текущимшаблоном}

              repeat

                  kf:=0;   {min возможное значение temp — Kf}

                          {---цикл по текущемушаблону---}

              for i:=xmin to xmax do

                for j:=ymin to ymax do

                  kf := kf +

              (f0[i+di,j+dj] * f[i-xmin+xm,j-ymin+ym])and 1;

                  if kf > max then max := kf;{локальный max}

                  di:=di+1;               {ув. смещение по x}

                  if xmax-xmin+di>=xk-xm {еслисместили по x}

                  then                   {… то смещаемпо y}

                    begin

                      di:=0;

                      dj:=dj+1

                    end;

                until (ymax-ymin+dj>=yk-ym);

                                    {… пока не сместимпо y}

            if max > kfmax           {ищем глобальныйmax...}

            then

                begin

                  kfmax:=max;

                  rasp:=k                    {… и егономер}

                end

          end;

        xt:=xsav;               {восстанавливаем текущийx}

          ShowList(170,280);

          if (xk-xm)*(yk-ym) >= smin{если допустимаяплощадь}

            then          {… то выводим распознанныйсимвол}

              OutTextXY(190 +35*counter,520,stroka[rasp]);

  Until xt >= BiW — 15;

  ShowList(170,280);

  ReadLn;

  CloseGraph;                   {сбрасываем графичесийрежим}

END.

еще рефераты
Еще работы по остальным рефератам