15 methods for image processing by svetla raykova

99
ТЕХНИЧЕСКИ УНИВЕРСИТЕТ – СОФИЯ ФАКУЛТЕТ ПО ЕЛЕКТРОНИКА И АВТОМАТИКА ДИПЛОМНА РАБОТА НА Светлана Георгиева Райкова, Фак.№ 342 867 Специалност: Електроника Образователно-квалификационна степен: Бакалавър Тема: Проектиране на библиотека функции за цифрова обработка на изображения върху DSP архитектура. Научен ръководител: Гл.ас. д-р инж. Бойко Петров Пловдов 2009г.

Upload: posnai

Post on 10-Apr-2015

1.022 views

Category:

Documents


0 download

DESCRIPTION

A library with 15 functions in C for Image Processing for BF533, without platform, with codes

TRANSCRIPT

Page 1: 15 Methods for Image Processing by Svetla Raykova

Т Е Х Н И Ч Е С К И У Н И В Е Р С И Т Е Т – С О Ф И Я ФАКУЛТЕТ ПО ЕЛЕКТРОНИКА И АВТОМАТИКА

ДИПЛОМНА РАБОТА

НА

Светлана Георгиева Райкова, Фак.№ 342 867

Специалност: Електроника

Образователно-квалификационна степен: Бакалавър

Тема: Проектиране на библиотека функции за цифрова обработка на

изображения върху DSP архитектура.

Научен ръководител:

Гл.ас. д-р инж. Бойко Петров

Пловдов 2009г.

Page 2: 15 Methods for Image Processing by Svetla Raykova

2

Съдържание

Увод............................................................................................................................................................. 5

I. Обзор на методите за линейна и нелинейна обработка на двумерни сигнали......... 6

I.1 Процеси Точка-по-Точка................................................................................................................. 6

I.1.1 Таблици на съответствието............................................................................................................. 6

I.1.2 Засилване на контраст..................................................................................................................... 7

I.1.3 Трансформация на яркоста – Негатив на изображение, Гама корекция..................................... 10

I.2 Обработка на област от изображение............................................................................................ 11

I.2.1 Конволюция....................................................................................................................................... 11

I.2.2 Конволюиране на цветно изображение.......................................................................................... 14

I.2.3 Обостряне на контури...................................................................................................................... 14

I.2.4 Разпознаване на контури................................................................................................................. 15

I.2.4.1. Хомогенен опеатор....................................................................................................................... 15

I.2.4.2. Диференциален Оператор........................................................................................................... 16

I.2.4.3. Намиране на първа производна ................................................................................................. 16

I.2.4.4. Намиране на втора производна .................................................................................................. 17

I.2.5 Разпознаване на контури в цветни изображения......................................................................... 21

I.3 Геометрични Процеси..................................................................................................................... 21

I.3.1Огледален ефект............................................................................................................................... 22

I.4 Пакетна обработка на изображения............................................................................................. 23

I.4.1 Откриване на разликите между две изображения........................................................................ 23

I.5 Създаване на библиотеки. .............................................................................................................. 23

I.6 BMP..................................................................................................................................................... 24

I.7 ADSP BF53x архитектура................................................................................................................ 25

Page 3: 15 Methods for Image Processing by Svetla Raykova

3

II. Синтез на алгоритмите за линейна и нелинейна обработка на двумерен сигнал.............. 28

III.Описание на функциите за линейна и нелинейна обработка на двумерен сигнал............. 32

III.1. bmp_strc.h......................................................................................................................................... 32

III.2. constants_list.h.................................................................................................................................. 32

III.3. ANOTHER_IMG_LIB.h.................................................................................................................. 34

III.4. Засилване на контраст.................................................................................................................... 35

III.5. Негатив на изображение................................................................................................................. 37

III.6. Гама корекция.................................................................................................................................. 38

III.7. Обостряне на контури..................................................................................................................... 38

III.8. Хомогенен оператор........................................................................................................................ 39

III.9. Диференциален оператор................................................................................................................ 40

III.10. Маски изчислени чрез първа производна.................................................................................. 41

III.11. Компасен оператор........................................................................................................................ 42

III.12. Детектор на Лаплас........................................................................................................................ 43

III.13. Преминаване през нулата.............................................................................................................. 44

III.14. Преминаване през нулата и Лапласов оператор......................................................................... 45

III.15. DoG функция.................................................................................................................................. 47

III.16. Намиране на контурите на цветно изображение......................................................................... 47

III.17. Огледален ефект............................................................................................................................. 48

III.18. Разлики между две изображения.................................................................................................. 48

III.19. Блокова схема на проектираната библиотека............................................................................. 49

IV. Избор и описание на методите за тестване.................................................................... 51

IV.1. Симулаторен режим........................................................................................................................ 51

IV.2. Емулаторен режим........................................................................................................................... 51

Page 4: 15 Methods for Image Processing by Svetla Raykova

4

V. Експериментални резултати.............................................................................................. 54

V.1. Резултати след изпълнение в симулатор........................................................................................ 54

V.2. Резултати след изпълнение върху EZ KIT LITE BF533................................................................ 62

VI. Изводи и оценка на собствените приноси.......................................................................69

VII. Използвана литература...................................................................................................70

Приложения................................................................................................................................71

Page 5: 15 Methods for Image Processing by Svetla Raykova

5

Увод

С развитието на науката нараства нуждата и от документиране на експериментите и

постиженията във физиката, астрономията, медицината и други. Първоначално се водят

записки и ръчни скици. Следващата голяма стъпка е откриването на фотографията и

възможноста за заснемане на различни процеси. С настъпване на компютърната ера на

двадесети век възниква и възможността за дигитално заснемане и обработване на снимки,

както и 3D моделиране на различни процеси.

Нуждата от обработка на заснети изображения от космоса и под микроскоп е

осъзната още през 1960 година, когато започва и разработването на различни методи за

цифрова обработка на прихванати образи. Но едва с появявата на персонални компютри

от по ново поколение става възможна прилагането им.

Днес под цифрова обработка на изображения се разбира обработката на всеки

цифров сигнал, чийто вход e изображение /снимка или фрейм от видео сигнал/. Резултата

от подобна обработка може да е както изображение така и съвкупност от характеристики

и/или параметри от постъпилия образ.

Цифровата обработка на изображения намира широко приложение в производството

/на поточни линии, за откриване на дефекти в различни изделия и материали/, в

медицината /при диагностика/, в атрономията /за обработка на заснети образи с цел

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

обектите/, в охранителни камери, разпознване на текст, машинно зрение, дигитални

фотоапарати, автоматично управление на автомобили и други.

В настоящата дипломна се цели да се създаде библиотека от готови алгоритми за

цифрова обработка на изображения за DSP специализирана архитектура на ADSP BF533.

Предимство на такава структура пред персонален компютър е не само бързодействие, но и

големина на подобно завършено устройство, надеждност и икономичнност.

Page 6: 15 Methods for Image Processing by Svetla Raykova

6

I. Обзор на методите за линейна и нелинейна обработка на двумерни

сигнали; [1,2,3,4,5,6,7,8,9,10]

Съществуват четири основни групи процеса за обработка на изображение:

Точка по точка

Област от изображението

Геометрични преобразувания върху изображението

Пакетна обработка

I.1 Процеси Точка-по-Точка. [1,2,3,5,10]

I.1.1 Таблици на съответствието. [1,3,10]

Алгоритмите на точка-по-точка са най-ефективни приложени с таблици на

съответствието. Те представляват масиви, които използват текущите стойности на

пикселите като масивни индекси. Новата стойност на пиксела представлява друга масивна

стойност посочена от индекса в таблицата на съответствие. Новото изображение се

построява като тази процедура се повтаря за всеки пиксел. Пример за това е входно

изображение 5х5 представено на /Фиг.1/, където броят на битовете е индекс от таблицата

на съответствие / ТС /.

Предимство на таблиците на съответствие е, че има обратни връзки, които проверяват

връщаната стойност от операцията. Всяка стойност по-голяма от 255 трябва да бъде

ограничавана до 255 и всяка стойност по-малка от 0 трябва да бъде ограничавана на 0.

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

памет, защото всеки пиксел от входния буфер се използва като индекс за ТС и тогава се

замества във буфера с пиксел връщан от ТС.

Page 7: 15 Methods for Image Processing by Svetla Raykova

7

I.1.2 Засилване на контраст. [1,2,3,5,10]

Контрастът в изображението представлява разпределението на светли и тъмни

пиксели в него.

За да се осъществи засилването на контраст е нужно първо да се извлече

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

види яркостния профил на изображение. Хистограмата дава информация, както за

яркостното разпределение така и за контраста в едно изображение. Хистограмата

представлява честотата, с която се среща дадена пикселна яркост, като по абцисата се

представя яркоста, а по ординатата честотата на срещане /Фиг.2/.

За да се пристъпи към засилване на контраст е нужно да се изравни хистограмата.

Изравняването на хистограми се прилага на изображения със слабо разпределение на

яркост. Целта е да се постигне постоянна хистограма.

Методът няма да изравни хистограмата, а ще преразпредели яркоста. Ако една

хистограма има много пикове и падове, то след изравняването пак ще ги има но ще са

изместени, т.е. не се получава уплътняване, а разширение на хистограмата.

Тъй като изравняването на хистограма е точков процес, то няма да се въведе нова

яркост в изображението, а съществуващите стойности на яркоста се организират в нови,

които няма да са повече на брой от старите яркостни стойности, но могат да са по-малко

от тях.

Изравняването на хистограмите се осъществява в три стъпки:

1st Изчисляване на хистограмата/Фиг.2/.

2ndПресмятане на нормализираната сума на хистограмата/Фиг.3,формула(1)/.

3rd Преобразуване на входното изображение в изходно/Фиг.4/.

1st Първата стъпка се извършва като се изброят стойностите на всички пиксели в

изображението. Може да се започне с масив от нули. За 8 битови размерът на областта

ще е 256

2nd Нужен е втори масив за съхраняване на сумата на всички стойности на хистограмата.

В този масив елемент 1 ще съдържа сумата от хистограмните елементи 1 и 0, а

елемент 255 ще съдържа сумата на 255+254+253+.....+1+0. Този масив се нормализира

като се умножава всеки елемент по формула (1):

Page 8: 15 Methods for Image Processing by Svetla Raykova

8

(1).

3rd Резулататът на втората стъпка извиква Таблица на съответствието, с която е възможно

трансформацията на входното изображение в изходно.

Методът работи най-добре на изображения с финни детайли в затъмнени области. В

една хисотграма с нисък контраст пикселите са съсредоточени в лявата, дясната или в

средата от дясно /Фиг.5/.

Page 9: 15 Methods for Image Processing by Svetla Raykova

9

Проблемът при високия контраст е, че има две големи области – тъмна и светла, т.е.

има два големи пика – висок и нисък.

При едно добро разпределение на контраста се наблюдава голям обсег от стойности

на пикселите, няма сенки на изображението, няма да има пикове или падове в

хистограмата и рапределението на пикселната яркост ще е по-еднородно.

Разтягането на контраста се прилага за да се запълни целия динамичен обхват на

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

голям успех при такива с Гаусово или почти Гаусово рапределение.

Двата най-прилагани метода са:

1st Основно контрастно разпъване/Фиг.6/.

2ndПри засичане на контури.

1st Методът е добър при изображения с концентрация на пикселите в една част от

хистограмата. Ако е центрирана то методът работи като разширява хистограмата

докато се покриеят всичките обхвати на пикселите, като най-високата и най-ниската

стойност се използват за трансформация, формула (2):

(2)

2nd Този метод работи най-добре за изображения с пиксели от всички възможни яркости,

които имат пикселна концентрация в една част от хистограмата. Една част от

пикселите трябва да са превърнати в черни или бели, след това алгоритъма преминава

нагоре през цялата хистограма за да намери най-ниския праг. Най-ниският праг е

стойност на хистограмата, където по-нисък процент е достигнат. Минавайки надолу

от върха може да се намери и най-високия праг и Таблицата на съответствие се

дефинира, формула (3):

(3)

Page 10: 15 Methods for Image Processing by Svetla Raykova

10

I.1.3 Трансформация на яркоста – Негатив на изображение, Гама

корекция.[1,3,10]

Трансформацията представлява преобразуването на стар пиксел в нов чрез

предварително зададена функция. Лесно може да се изпълни с Таблици на

съответствието и входно-изходните връзки на таблиците могат да се представят

графично. По x се представят оригиналните пиксели, а по y новите пиксели.

a. Когато стойсността на стария пиксел е равна на стойнсотта на новия пиксел

трансформацията се нарича нулева.

b.Друга трансформация е негативната яркостна трасформация, при която яркосните

стойности се инвертират /Фиг.7/.

Яркостта на дадено изображение лесно може да бъде променена чрез метода

Гама корекция. Тя представлява нелинейна функция за намаляване и

увеличаване на контраст и се извършва по формула (4). Гама се избира под 1 за да

потъмни изображението и над 1 за да го просветли.

(4)

Page 11: 15 Methods for Image Processing by Svetla Raykova

11

I.2 Обработка на област от изображение [1,2,3,4,5,10]

I.2.1 Конволюция. [1,2,3,5]

Методът на дискретната конволюция се използва често в обработката на изображение

при заглаждане, при засичане на контури и други ефекти. Конволюцията е тегловната

сума от пиксели, съседни на централния пиксел в конволюционен прозорец. Теглото се

определя от малка матрица наречена конволюционна маска. Размерите на матрицата

обикновено са нечетни и центъра лесно се определя. Местоположението на централния

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

Плъзгащ прозорец, наречен конволюционен прозорец, концентрира всеки пиксел от

входното изображение и генерира нов изходен пиксел. Стойността на новия пиксел се

изчислява чрез умножение на всяка пикселна стойност в съседство с отговарящото тегло в

конволюционната маска и техните произведения се сумират. Много е важно мястото на

новия пиксел в полученото изображение. Ако той измества старият, то се смята

стойността на следващ нов пиксел, това води до нежелани резултати/Фиг.8/.

Сумите от теглата в конволюционната маска оказват влияние върху цялата яркост

на полученото изображение. Много от конволюционните маски имат коефициенти,

сумиращи до 1. В този случай конволираното изображение има същата осреднена яркост

като оригиналното. Други маски като тези, използвани при откриването на контури имат

отрицателни коефициенти и сума равна на 0. В този случай може да се получи

отрицателна пикселна стойност. Обикновено се прибавя константа към новия пиксел,

формула (5) ако сумирания резултат е отрицателен, то се поставя 0.

Page 12: 15 Methods for Image Processing by Svetla Raykova

12

(5)

Поради характера на сигнала се използва двумерна конволюция формула(6).

(6)

Когато конволюционният прозорец е центриран върху първия пиксел на

изображението(0,0) тогава плъзгащият се прозорец го препокрива горе в ляво, както е

показано на /Фиг.9/. Има няколко начина за запълване на празните клетки в плъзгащия се

прозорец:

1st Празните клетки от конволюционния прозорец се възприемат за нули, т.е. нулево

уплътнение. Това е лесен начин, но не трябва да се използва, ако контурите на

резултатното изображение са толкова важни, колкото и останалата част от него.

2ndЗапочва се конволюирането от първата позиция, където прозореца не препокрива

изображението. Ако маската е 3х3, започва се от позиция (1,1) вместо (0,0). Това е

лесно за изпълнение и може да се направи в конволюционнен код. В изходното

изображение кодовете са копирани за да създадат същата резолюция като

първоначалната.

3rd и 4th изискват разширяване на първоначалното изображение преди конволюиране.

Разширяване чрез дублиране на краищата- използва се 3х3 маска, копира се горния

ред, лява страна, дясна страна и долната част/Фиг.9/.

5th „обвиване” на ръбовете около конволюционна маската.

Page 13: 15 Methods for Image Processing by Svetla Raykova

13

Много конволюционни маски са отделими т.е. конволюцията може да се преобразува в

две едно-дименсионни операции /Фиг.10/,формула (7), т.е.

(7)

те намаляват броя на изчисленията при големи маски, това е възможно поради линейната

структура на конволюцията.

С нарастване на конволюционната маска, изчисленията нарастват пропорционално

/фиг.11/.

Page 14: 15 Methods for Image Processing by Svetla Raykova

14

I.2.2 Конволюиране на цветно изображение. [1,2,3]

Обработват се два типа данни:

яркостен канал от изображение в HSI пространство.

обработване на всеки индивидуален канал от RGB изображение.

Може да се приеме, че яркостта определя контурите на изображението, а цвета само

пространството между тях. В този случай се преобразува в HSI пространство /hue-

saturation-intensity, или нюанс-наситеност-яркост/, конволюира се и отново се преобразува

в RGB цветово пространство /red-green-blue, или червено-зелено-синьо цветово

пространство/. Този метод предпазва оригиналните цветни данни.

Най-популярният метод е да се преобразува всичко в RGB координати. Според

целите се избира кой метод да се използва. Ако се изисква да се запази оригиналния

образ се използва първият метод. Когато се обработва се конволюира яркостта и е по-

добре изображението да стане с по-резки контури, отколкото да се обработва всяка

R(червена), G(зелена), B(синя) координата. При замъглен образ е по-добре да се

конволюира всичко в RGB координати.

I.2.3 Обостряне на контури. [1,2,3,10]

Увеличаването на контрастта или обострянето на контури е обратното на

замъгляването. То увеличава детайлите в изображението, т.е. по-лесно се открояват. Ако

те са мъгляви, преди или по-време на придобиване на изображението, е възможно то да се

възтанови до приемливи нива чрез увеличаване на контраста. Конволюционните маски

/Фиг.12/, които се използват се състоят от положителен коефициент в центъра и предимно

отрицателни около външните контури.

Увеличаването на контрастта на изображение се основава на базата на високо

честотен филтър, той премахва ниско честотните компоненти и показва високо

честотните детайли. Високо честостотните филтри усилват по-финните детайли в

изображението, но увеличават и шума в него.

Page 15: 15 Methods for Image Processing by Svetla Raykova

15

I.2.4 Разпознаване на контури. [1,2,3,4,5,10]

В крайните части на изображението се съдържа повечето информация за него, т.е.

информацията за местоположението на обектите, тяхната форма и размери. Контур се

намира там, където яркостта на изображението се мени от ниски стойности към високи.

Засичането на контури намира широко приложение, често това е първата стъпка в

разделяне на изображението, то е част от анализа му - групира пикселите на области за да

определи състава му. Контурите са безкраен брой, с различна посока, форма и ширина

/Фиг.13/.

I.2.4.1 Хомогенен опеатор. [1,3,10]

Най-лесният и най-бързият начин за определяне на границите е определяне на

максималната стойност от няколко пикселни разлики. Хомогенният оператор изважда

всичките 8 пиксела, около централния от 3х3 прозорец. Резултатът от действието на

оператора е максималната абсолютна стойност от всяка разлика /Фиг.14/.

Page 16: 15 Methods for Image Processing by Svetla Raykova

16

I.2.4.2 Диференциален Оператор. [1,3,10]

Диференциалният оператор /Фиг.15/ е по-бърз, защото изисква четири изваждания

на пикселни стойности, те са: горе ляво- долу дясно; средно ляво- средно дясно; долу

ляво- горе дясно; горе средно- долу средно.

I.2.4.3 Намиране на първа производна. [1,2,4,10]

Първата производна служи за намиране на хоризонтални и вертикални контури. Тези

оператори работят чрез конволюция /Фиг.16/

Page 17: 15 Methods for Image Processing by Svetla Raykova

17

Сумата от коефициентите на всяка от маските е 0. Амплитудата може да се изчисли

като се сумират векторите Hr и Hc /формула (8)/:

(8)

Маската на Робърт има най-малка ефективност и лесно се зашумяват. Маската на

Собъл е по-чувствителна на диагоналки контури, а маската на Превит е по-чувствителна

на вертикални и хоризонтални контури.

Друг оператор за засичане на контури в осем различни посоки е Компасеният

Оператор. Метода се състои в конволюиране на изображението с осем различни маски

/Фиг.17/.

Page 18: 15 Methods for Image Processing by Svetla Raykova

18

I.2.4.4 Намиране на втора производна. [1,2,4,10]

Идеалният детектор на контури би трябвало да открива всеки контур от центъра му.

Това се нарича локализация. Ако такъв детектор създаде карта на изображението с

контури с ширина няколко пиксела ще е трудно да се определи центъра намерения контур.

Става наложително да се въведе процес наречен изтъняване, за да се намали ширината до

един пиксел. Тези детектори предполагат по-добра локализация.

Добър пример за оператор прилагащ втора производна е детектора на Лаплас.

Различава се от дръгите детектори, защото е разнопосочен, т.е. ще подчертае контури във

всички посоки. Лапласовия детектор обостря контури повече от другите детектори.

Пример за лапласови маски са посочени на фигура /Фиг.18/.

Резултатното изображение предлага знак за промяна в контурите си. Тази знакова

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

Проблемът при Лапласовия детектор е чувствителността му на шум. Това води до

разпознаване на повече контури отколко съществуват. Затова при осъществяване на

функцията преминаване през нулата се установяват и допустимите прагове.

Методите за определяне на преминаването през нулата с желани прагове се

осъществява като 3х3 прозорец се преплъзгва през изображението, като се определя

максималната и минималната стойност в плъзгащия се прозорец и ако превишава

определен праг то има намерен контур.

По-малко податливи на шум е детектора на Лаплас след Гаусов оператор /LoG/. LoG

детектора първо изпълнява Гаусово изглаждане преди прилагане на Лаплас. И двете

операции могат да се изпълнят чрез конволюиране с маска /формула (9)/ от типа:

(9) , където 𝜎 може да заема стойности както е

показано на /Фиг.19/.

Колкото по-широка е функцията, толкова по-широк ще е контура който ще бъде

засечен. Тясна фукция ще засече остри контури и повече детайли.

Page 19: 15 Methods for Image Processing by Svetla Raykova

19

LoG детекторът изисква много изчисления, и за апроксимация на LoG може да се

ползва детектора на Гаус при две различни сотойности на гаусовото разпределение /DoG/,

формула (10):

(10)

DoG детекторът се изпълнява с конволюиране на изображението с маска, която е

разлика от две Гаусови маски с различни стойности за 𝜎, където сигма е гаусовото

разпределение /Фиг.20/.

Една от осoбеностите на DoG детектора е способноста да се уточнява ширината на

контурите.

Типични маски за детектора са представени на /Фиг.21/.

Page 20: 15 Methods for Image Processing by Svetla Raykova

20

Page 21: 15 Methods for Image Processing by Svetla Raykova

21

I.2.5 Разпознаване на контури в цветни изображения. [1,2]

Методът за откриване на граници в цветно изображение зависи от дефиницията за

контур. Една от тях гласи, че контур е несвързаността в осветеността на картината.

Разпознаването на границите се прави с яркостен канал в цветено изображение в HSI

пространство. Според друга- граница съществува, ако е представена в червена, зелена и

синя координата (RGB). разпознаването на контури се прави за всеки от цветенните

компоненти, след комбинирането им изображението е все още цветно. То може да се

направи за всеки цветен компонент по отделно и тогава компонентите се сумират за да се

създаде сива скала на контурната карта, формула (11).

(11)

Става ясно, че огромно множество от контури, открити в цветните елемемнти са

също открити и в яркостните компоненти.

Най-доброто засичане на граници в изображението зависи от приложението.

I.3 Геометрични Процеси. [1,3,5]

Когато се програмират геометрични процеси винаги трябва да се използват

координатите на изображението за да могат да се генерират изходните координати за

новото изображение. Това се нарича Обратно организиране. А прехвърлянето на входни

пиксели чрез x и y организационни функции се нарича Право организиране.

Има два основни проблема при правото организиране и това са дупките и

прескачанията /Фиг.22/. Дупките са пиксели, които са недефинирани и пикселите за

направление нямат отговарящите пикселни източници. Прескачанията се проявяват,

когато два пиксела са организирани в един изходен пиксел.

Вижда се как правото преобразуване може да остави дупка в изходното

изображение. Също така показва два начални пиксела подредени в един изходен .

В обратното преобразуване всичките пиксели от подреденото изображение имат

отговарящ входен пиксел. Но не е проблем, че два подредени вече пиксела се поставят в

един и същ начален пиксел.

Page 22: 15 Methods for Image Processing by Svetla Raykova

22

Обратната организация преминава през направялващото изображение и изчислява

чрез някои обратни трансформации, кои пиксели от началното изображение ще бъдат

използвани за да се генерират направляващите пиксели. Изчисляването на изходното

изображение по този начин елиминира появата на дупки и прескачания.

I.3.1 Огледален ефект. [1,5,10]

За да се обърне огледално дадено изображение е достатъчно да се обърне х и у

координатите. Хоризонталния огледален образ обръща изображението по у и образа от

ляво ще премине отдясно. Вертикален огледален образ се обръща по х като горната част

на образа става долна.

Както се очаква обръщането е реорганизиране на пиксели. Представлява чисто

геометричен процес, който не е свързан с интерполацията, а е просто преместване на

пиксели.

Page 23: 15 Methods for Image Processing by Svetla Raykova

23

I.4 Пакетна обработка на изображения. [1,3,4]

Пакетната обработка /Фиг.23/ на изображение създава стойност на пиксел на

базата на две или повече различни изображения

I.4.1 Откриване на разликите между две изображения.[1]

Използват се за да се определят разликите между две изображения. От машинна

гледна точка, изваждането на изображения се използва за да се разгледа какво „‟излиза‟‟

от събиращата линия. Изображението придобива завършен вид и се сравнява с

първоначалното копие как то трябва да изглежда, работи се по формула (12).

(12)

I.5 Създаване на библиотеки. [8]

Библиотеката представлява съвкупност от функции, които могат да се използват в

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

С. Библиотеки за С програмен език могат да бъдат лесно написани.

Всяка библиотека се състои от два файла: хедърът е текстов файл с разширения *.h и

файл, който съдържа самия код с разширения *.c. Хедърният файл съдържа константи,

дефиниране на типа и прототипите на използваните функции от кода на бибиотеката. Той

следва да бъде прикачен към основната програма, която извиква библиотеката и към кода

на библиотеката. Кодът на библиотеката съдържа кода на функциите.

Page 24: 15 Methods for Image Processing by Svetla Raykova

24

I.6 BMP.[7]

BMP / bitmap – битова карта/ представлява формат за изображения, създаден за

Windows OS, използван за съхраняване на растерна графиак. BMP е без компресия на

входните данни. Пикселите се представят е BMP фрмата подредени в редове. В

зависимост от дълбочината на цвета пикселите могат да заемат поне 𝑛 8 байта, където „n”

е големината на битовете, тъй като 1байт съдържа 8 бита. Големината на едно

изображение лесно може да се пресметне по формула (13):

(13)

BMP файла съдържа четири основни структури от данни показани в Таблца.1:

Блокове в BMP Съдържание

Хедър на BMP Съхранява се основна информация за ВМР

BMP

информация

Съхранява се детайлна информация за битмап файла

Цветен Палет Съхранява се цветовете използвани в ВМР

ВМР данни Съхранява се всеки пиксел от изображението

Таблица.1

Хедърът на ВМР файла /показан на Таблица.2/ е първият блок данни, служещ за

разпознаване на формата на файла и съдържа нужната информация за изображението,

което съхранява.

Отместване Големина Шеснайсетична стойност Размер Описание

0х00 2 42 4D “BM” Идентификатори за тип ВМР

0х02 4 46 00 00 00 70 байта Размер на ВМР формат

0х06 2 00 00 Неизползвани Спецификация на приложението

0х08 2 00 00 Неизползвани Спецификация на приложението

0х0А 4 36 00 00 00 54 байта Големина на отместването преди данни

0х0Е 4 28 00 00 00 40 байта Брой байтове в хедъра

0х12 4 80 00 00 00 128 пиксела Ширина на изображението в пиксели

0х16 4 80 00 00 00 128 пиксела Височина на изображението в пиксели

0х1А 2 01 00 1 палет Брой използвани цветове от палета

0х1С 2 08 00 8 бита Брой битове в пиксел

0х1Е 4 00 00 00 00 0 Използвана компресия

0х22 4 10 00 00 00 16 байта Големина на самите данни

0х26 4 13 0B 00 00 2 835 pxl/m Хоризонтална резолюция

0х2А 4 13 0B 00 00 2 835 pxl/m Вертикална резолюция

0х2Е 4 00 00 00 00 0 цветове Брой на палетните цветове

0х32 4 00 00 00 00 0 важни цветове Брой важни цветове

Таблица.2

Page 25: 15 Methods for Image Processing by Svetla Raykova

25

Вторият блок в структурата на ВМР съдържа детайлна информация за

изображението, която се използва от отварящото приложени. Следва палет с използваните

цветове в изображението.

I.7 ADSP BF53x архитектура.[6,9]

Архитектурата на ADSP BlackFin /BF/ /Фиг.24, Фиг.25/ е оптимизирана за обработка

на видео сигнали и изображения.

Паметта на BF има унифицирана адресна обхватност, която включват вътрешна L1,

SDRAM памет и асинхронна памет.

1st Вътрешна памет [9] - L1 паметта работи на честотата на вътрешния часовник на

ядрото на процесора и следва да има най-ниско закъснение в сравнение с другите

памети. В BF има разделение на памета за данни и памета за инструкции. L1 SRAM

памета е конструирана от еднопортови подсекции, всяка подсекция се състои от 4К

байтови блокове. Тази организация на памета довежда до многопортово поведение

когато се изисква едновременен достъп до различни sub-banks /под-банки/ или до

начетна и четна 32-а битова дума в същата 4К sub-bank.

Page 26: 15 Methods for Image Processing by Svetla Raykova

26

2nd SDRAM памет [9] – SDRAM Controler /SDC/ позволява на микроконтролера

трансфер на данни към и от синхронна DRAM. SDC потдържа връзка към четири

вътрешни банки в самия SDRAM. В края на приложенията, буферите с данни се

разпределят в различни sub-banks и свързаното с това закъснение от трансфера

ядро/DMA може да бъде минимизирано. SDC може да следи по един ред на банка

/като се има на изпредвид четири банки за всеки SDRAM/.

3rd Управление на външен достъп за данни [9] – достъпа до външна памет се изпълнява

ефективно, когато трансфера се прави в една и съща посока. Докато се осъществява

достъп до памета SDRAM, осъществявайки групов трасфер в една посока може да се

намали закъснението в трансфера на данните.

DMA на BF може да прехвърля данни между собствената си памет и периферията.

Може да се избира и приоритета на DMA за конкретна периферия чрез DMA канали.

PPI / Parallel Peripheral Interface/ на BF потдържа индустриалния стандарт ITU-R-656

и General perpose I/O режим с разнообразни вътрешни и външни опции за frame

sinchronization /синхронизация на фраймове, пакети данни/. Изображения могат лесно да

Page 27: 15 Methods for Image Processing by Svetla Raykova

27

се прихващат чрез PPI и подходящ режим на DMA, така че да не се изгубват фреймове.

PPI може да бъде програмиран да прихваща на два или повече буфера, което ще позволи

ядрото на BF да обработва един буфер докато DMA пълни дръгите буфери.

ITU-R Recommendation BT.656 /ITU656/ описва цифров видео протокол за поток от

некомпресирани PAL или NTSC сигнали. Протколът се основава на 4:2:2 параметър за

цифрово видео кодиране, което осигурява „вплетени видео данни”. Потокът използва

YСbCr цветово простраство и 13.5MHz пробна честота за пикселите. Стандартът ITU656

може да се използва за предаване на 8 или 10 битови думи, с 27Mbytes в секунда.

Хоризонталната скенираща линия на видео пиксели е ограничена в поток по 4 байта за

SAV /Start of Active Video/ и EAV /End of Active Video/. Отделните пиксели се кодират в

YСbCr формат. След SAV кода /4байта/ първите 8 бита са Cb, следват 8 бита Y,

последвани от 8 бита Cr за следващия пиксел и пак 8 бита Y, до пълнаата реконструкция

на Y,Cb,Cr цветово пространство.

PPI потдържа три входни режима за ITU-R-656: Entire field mode, Active field only,

Vertical blanking only.

В кодиращи приложения, видео фреймът може да бъде прихванат в active field only

mode, така че само поле 1 и 2 се прихващат /Field1 and 2 Фиг.26/. Тъй като ITU656 има

вплетена структура, чрез DMA памта сигналът лесно може да се разкодира. За

минимизиране на времето за разплитане на фрейма, PPI може да прихваща видео

фреймове като прескача една поредица след всеки SAV. Така паметта на DMA може да

разплита Feild2 в Feild1 като запълва празните линии.

Всяка от периферията на BF е DMA съвместима, всяка периферия си има DMA

канал, като всеки канал си има собствен приоритет за достъп в ядрото на BF. Този

приоритет е програмируем и променим, чрез DMA Traffic Control registers. По

подразбиране PPI използва DMA канали с най-висок приоритет.

Page 28: 15 Methods for Image Processing by Svetla Raykova

28

II. Синтез на алгоритмите за линейна и нелинейна обработка на

двумерен сигнал;

Алгоритъмът представлява последователност от действия, която изпълнява

множество елемнтарни действия, за преобразуването на входните данни в изходни. Всеки

алгоритъм има краен брой указания, който могат да се изпълняват безкрайно.

Броячен алгоритъм – цикличеният броячен алгоритъм представлява цикъл, който се

изпълнява краен брой пъти. Алгоритъма /от функция за засилване на контраста/ показан в

следния код:

for(i=0; i<256; i++)

{

HIS[i]=0;

}

изпълнява блок с действие 256 пъти, което го категоризира като броячен цикличен

алгоритъм. В първият цикъл, алгоритъмът извиква първия елемент от едномерен масив

HIS и му присвоява стойност нула. Вторият цикъл извиква следващия елемент от масива и

също му се присвоява стойност нула. Това действия се повтаря за всеки един елемент от

масива. Тъй кото масивът е едномерен се обхожда с един броячен цикъл. В настоящата

дипломна работа броячен цикъл се използва за обхождане на едномерни масиви каквито

има във функциите за засилване на контраста и гама корекция описани в глава III.

Цикъл в цикъла – използват се два броячни алгоритъма един в друг, както е

представено в кода /от функция за засилване на контраста/:

for (x=0; x<128; x++)

{

for (y=0; y<128; y++)

{

HIS[DataIn->img_data[x][y]]++;

}

}

Цикъл в цикълът се използва за обхождане на двумерни масиви, каквито са масивите

за съхраняване на двумерните сигнали на изображенията. Алгоритъмът действа на

следния принцип: изображение с размери 128х128 пиксела се обхожда по редове и по

колони. С външния цикъл се обозначава реда, като се започва от първия ред на масива.

Вътрешният цикъл обхожда колоните от изображенито като първо се извиква първата

колона. При изпълнение на двата броячни цикъла заедно функцията се центрира на

първия елемент от първия ред и първата колона и двата цикъла заеднно ще сочат първия

пиксел от изображението. Следващата стъпка ще е за същия първи ред от външния

Page 29: 15 Methods for Image Processing by Svetla Raykova

29

броячен цикъл да се посочи втората колона от вътрешния броячен цикъл. Действието ще

продължава да отброява колоните за този ред до края им, след което външният цикъл ще

се инкрементира с единица и ще посочи втория ред, за който вътрешният цикъл наново ще

изброи всичките колкони като почне от първата. Цикъл в цикълът се използва за

функциите: негатив на изображениие, засилване на контурите, гама корекция, огледален

ефект, намиране на ралите между две изображения, намиране на контури чрез първа

производна, засичане на контури в цветно изображение. Тези функции са подробно

описани в глава III.

Четири броячни цикъла – цикъл в цикълът с четири брочни цикъла е представен в

кода /от фукция за намиране на контурите с Лапласова маска/ :

for (x=0; x<128; x++)

{

for (y=0; y<128; y++)

{

for (i=0; i<3; i++)

{

for (j=0; j<3; j++)

{ DataOut->img_data[x][y]+=DataIn->img_data[x+i][y+j]* ZCL_OTHER_MASK[i][j];

}

}

}

}

Вложените броячни цикли се използва за конволюиране на двумерен сигнал на

изображение и двумерен масив. Първите два броячни цикъла обхождат изображението,

като за всеки елемент от най-външният цикъл се изпълняват пълният брой на всички

върешни цикли. С двата най-външни броячни цикъла се изпълнява преминаването през

всеки един пиксел на входното изображение. С двата най-вътрешни цикъла се преминава

през всеки един елемент от малкия двумерен масив ZCL_OTHER_MASK, като с по-

горният вътрешен броячен цикъл се центрират редовете на масива, а с най-вътрешния

броячен цикъл се отброяват всичките колони на масива за всеки ред. Четири вложени

броячни цикъла има във функциите: обостряне на контурите, намиране на контури с

хомогенен и диференциален оператор, намиране на контури с първа и втора производна,

намиране на контури на цветно изображение, които са подробно описани в глава III.

Циклични логически алгоритми с предусловие – циклични логически алгоритми,

към чието изпълнение се пристъпва след изпълнението на определено условие, както е

представено в кода /от функция за засилване на контраста/ :

if (low > temp)

low = temp;

Page 30: 15 Methods for Image Processing by Svetla Raykova

30

след оператора if се намира условието за изпълнение на функцията, ако то е вярно, т.е.

ако променливата low е по-голяма от променливата temp, то се пристъпва към изпълнение

на израза след if оператора. Логически цикъл с предусловие се използва във функциите:

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

намиране на контури, първа и втора производна за намиране на контуринамиране на

контурите на цветно изображение, разгледани подробно в глава III.

В настоящата дипломна работа е използвана и функция за сортиране Bubble sort.

Функцията работи като сравнява всяка стойност от даден масив със съседната й и ги

разменя, като ги подрежда по възходящ ред. Алгоритъма повтаря същата операция докато

стигне до края на масива. Bubble sort е показана в кода:

for (s=0; s<3; s++)

{

for (a=0; a<3; a++)

{

for (t=0; t<3-s; t++)

{

for (b=0; b<3-a; b++)

{

if ( WIN[s][t] > WIN[s+1][t+1] )

{

temp = WIN[s+1][t+1];

WIN[s+1][t+1] = WIN[s][t];

WIN[s][t] = temp;

}

}

}

}

}

Функцията за сортиране се използва във функциите: преминаване през нулата,

преминване през нулата след Лапласова маска чрез втора производна за намиране на

контури. Bubble sort е най-простата и лесна функция за сортиране, но е и най-бавната.

Примерна блокова схема за приложение на проектираната библиотека е представена

на /Фиг.27/.

Page 31: 15 Methods for Image Processing by Svetla Raykova

31

Page 32: 15 Methods for Image Processing by Svetla Raykova

32

III. Описание на функциите за линейна и нелинейна обработка на

двумерен сигнал;

III.1 bmp_strc.h

bmp_strc.h е хедърен файл, в който е описана структурата на битмап файлов формат.

Във файла bmp_strc.h се използва макроси: Н и V със стойност 128, дефинирани с

директива #define в хедъра на bmp_strc.h, като H – horizontal и V – vertical представляват

брой пиксели по хоризонталаи и по вертикала.

За описване на нов тип структура, каквато е нужна за по-лесната обработка на

изображение, се използва typedef struct. Структурата на битмап файла е описана подробно

в глава I.6, според която хедъра на битмап съдържа 56 байта разпределени в различни

клетки по 2 и 4 байта всяка. За създадената структура всички полета са разделени на по

големина от 2 байта от тип short int поради особеноста на Visual DSP 5.0v.

Тъй като хедърния файл се инициализира в библиотеката, основната програма и

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

ползват директивите: #ifndef, #define, #endif, с които ако след инициализация на

bmp_strc.h се появи друга заявка за инициализация тя ще бъде отхвърлена.

III.2 constants_list.h

constants_list.h е хедърен файл, използван в сорс кода на библиотеката и съдържащ

всички константи, глобални променливи и макроси нужни за изпълнението на

библиотеката.

Общ макрос за всички функции е “pxls”, който има стойност 16384 и представлява

броя пиксели налични в изображението. Дефиниран е с директива #define.

Следващите шест макроса са инициализирани с директива #define и представляват

широчинта и височината на използваните конволюционни маски и прозорци. Макросите R

/row/ и C /colm/ са с големина 3 и се използват от всички функции с конволюция.

Макросите R_mask7 /ред от маска 7х7/ и C_mask7 /колона от маска 7х7/ имат стойност 8 и

се използват във функцията за намиране на контурите с втора производна чрез разлика

между два Гаусови оператора. Макросите R_mask9 /ред от маска 9х9/ и C_mask9 /колона

от маска 9х9/ имат стойност 9 и се използват във функция за намиране на контурите с чрез

втора производна с използване на разликата между два Гаусови оператора.

Page 33: 15 Methods for Image Processing by Svetla Raykova

33

Дефиниран е и макрос zc_treshold /zero crossing treshold/ със стойност 30, който

представлява прагова стойност във функция за намиране на втора производна с

преминаване през нулата.

Поселдните три макроса от хедърния файл се използват във функцията за гама

корекция и се инициализират с директива #define. Първият макрос gamma може да заема

стойности над и под 1, като обикновено се задава в граници 0.45†2.2, в зависимост от

търсения ефект. Стойности под 1 ще потъмняват изображение а над 1 ще го изсветляват

/гама корекцията е подробно описана в глава I/. Вторият макрос exp има стойност

реципрочна на gamma, т.е exp=1/gamma. Стойността на третия макрос operation_gamma (i)

се изчислява като всеки един пиксел от входното изображение е на степен 1/gamma.

След макросите в хедърния файл са инициализирани двумерни масиви, които

представляват използваните маски от функциите на библиотеката.

Първите три маски са двумерни масиви с големина 3х3 от тип char с конкретно

зададени елементи. Използва се тип char за дефинирането на маските, тъй като съдържат

и елементи с отрицателен знак. Това са маски за обостряне на контурите Sharpening_CM

/convolution mask/, Sharpening_CM2 /convolution mask2/, Sharpening_CM3 /convolution

mask 3/. Маските са представени и обяснени в глава I.

Следащите шест маски са за намиране на контури и са пресметнати чрез първа

производна /описани и обяснени в глава I/. И шестте маски са двумерни масиви с

големина 3х3 дефинирани от тип char. Това са PREWITT_X и PREWITT_Y /маска на

Превит/, SOBEL_X и SOBEL_Y /маска на Собъл/, ROBERT_X и ROBERT_Y /маска на

Робърт/.

Следват тридсет и две маски на оператор за намиране на контури наречен Компасен.

Прилагането на коомпасен ператор изисква едновременното използване на осем маски

едновременно /описами подробно в глава I/. Маските представляват двумерни масиви с

размер 3х3 от тип char, тъй като елементите на маските са и отрицателни числа. Първите

осем маски са с наименование P_MASK_E /Prewitt mask east/, P_MASK_NE /Prewitt mask

north-east/, P_MASK_N /Prewitt mask north/, P_MASK_NW /Prewitt mask north-west/,

P_MASK_W /Prewitt mask west/, P_MASK_SW /Prewitt mask south-west/, P_MASK_S

/Prewitt mask south/, P_MASK_SE /Prewitt mask south-east/ и се наричат маски на Превит.

Следващите осем маски са маските на Криш: K_MASK_E /Krish mask east/, K_MASK_NE

/Krish mask north-east/, K_MASK_N /Krish mask north/, K_MASK_NW /Krish mask north-

west/, K_MASK_W /Krish mask west/, K_MASK_SW /Krish mask south-west/, K_MASK_S

/Krish mask south/, K_MASK_SE /Krish mask south-east/. Следват осем маски на Робинсон

от трето ниво: R3_MASK_E /Robinson level3 mask east/, R3_MASK_NE /Robinson level3

mask north-east/, R3_MASK_N /Robinson level3 mask north/, R3_MASK_NW /Robinson

level3 mask north-west/, R3_MASK_W /Robinson level3 mask west/, R3_MASK_SW

/Robinson level3 mask south-west/, R3_MASK_S /Robinson level3 mask south/, R3_MASK_SE

/Robinson level3 mask south-east/. Последните осем маски от компасния оператор описани в

хедърния файл са тези на Робинсън нниво5: R5_MASK_E /Robinson level5 mask east/,

Page 34: 15 Methods for Image Processing by Svetla Raykova

34

R5_MASK_NE /Robinson level5 mask north-east/, R5_MASK_N /Robinson level5 mask north/,

R5_MASK_NW /Robinson level5 mask north-west/, R5_MASK_W /Robinson level5 mask

west/, R5_MASK_SW /Robinson level5 mask south-west/, R5_MASK_S /Robinson level5 mask

south/, R5_MASK_SE /Robinson level5 mask south-east/.

Следващите описани маски са тези за намиране на контурите с преминаване през

нулата след Лапласова маска. Представляват двумерни масиви с големина 3х3 от тип char:

ZCL_OTHER_MASK /zero crossing of Laplacian other mask/ и ZCL_MASK.

Последните две маски са на функции за намиране на контури изчислени с втора

производна. Едната маска DOG_7 /difference of Gausse/ е с големина 7х7, а другата маска е

DOG_9 /difference of Gausse/ и е с големина 9х9. И двете маски са дефинирани от тип char

тъй като някой от елемнтите им имат отрицателни стойности.

III.3 ANOTHER_IMG_LIB.h

ANOTHER_IMG_LIB.h представлява хедърния файл на библиотеката. Той съдържа в

себе си примитивите на всички използвани функции в самата библиотека /структурата на

библиотеките е описана в глава I/. Всички функции са от тип void.

Първата функция: void negative_intensity_transformation(bmp_strc_tp * DataOut,

bmp_strc_tp * DataIn); използва два локални указателя DataOut и DataIn, които да сочат

резултантните данни и входните данни. Функциата представлява негативна яркостна

трансформация.

void contrast_streching(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); е примитив на

функцията за засилване на контраста с указател към входните и изходните данни DataOut

и DataIn.

void gamma_corection(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); представлява

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

изходните данни и един указател за входните данни DataOut и DataIn.

void sharpening(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); примитив на функцията

за обостряне на контурите на изображението с указател за входните и указател за

изходните данни DataOut и DataIn.

void mirroring(bmp_strc_tp * DataOut, bmp_strc_tp * DataOut2, bmp_strc_tp * DataIn); е

примитив на функцията за огледален ефект, която ползва един входен източник и указател

към него, но за изход са необходими два масива за съхраняване на резултата и

следователно два отделни указателя към тях DataOut, DataOut2 и DataIn.

void difference_between_images(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn,

bmp_strc_tp * DataIn2); е примитив на функция за намирането на разлики между две

изображения с два входен масив със самостоятелни указателя за двете изображения и един

изходен за резултата DataOut, DataIn и DataIn2.

Page 35: 15 Methods for Image Processing by Svetla Raykova

35

void homogeneity_operator(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); примитив на

функция за намиране на контурите с хомогенен оператор. Функцията използва един вход

и един изход и указателитем към тях DataOut и DataIn.

void differece_operator(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); примитив на

функция за намиране на контурите с диференциален оператор с един вход и изход и

указателите км тях DataOut и DataIn.

void fod_simple_masks(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); примитив на

функция за намиране на контурите на изображение посрдством маски изчислени чрез

първ производна, използващи един вход за входното изображение и един изход за

резултантното изображение и указателите към тях DataOut и DataIn.

void fod_compass_gradient_operator(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

примитив на функция за намиране на контурите на изображение с компасен оператор,

числящ се към първите производни, използващ един вход и един изход, сочени с

указатели DataOut и DataIn.

void sod_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); примитив на

функция за намиране на контури, чиято маска е изчислена с Лапласов оператор,

използващ един изход и един вход, сочени от указатели DataOut и DataIn.

void sod_zero_crossing(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); примитив на

функцията за преминаване през нулата с цел намимране на контурите на изображение,

използващ вход и изход сочени от указатели DataOut и DataIn.

void sod_zero_crossing_of_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

примитив на функция изплъняваща последователно намиране на контури с преминаване

през нулата за изчистване на шума от изображението и Лапласова маска. Функцията

изпозва един вход и един изход всеки сочен от укзател DataOut и DataIn.

void sod_dog(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); е примитив на функция за

намиране на втора производна чрез намиране на разликата между два Гаусови оператора с

разичен коефициент на разпрделение. Функцията използва два указателя DataOut и DataIn

към изходните и към входните данни.

void sod_color_edge_detection(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); е

примитив на функция за намиране на контурите на цветно изображение използваща два

указателя DataOut и DataIn сочещи към изходните и входните данни.

III.4 Засилване на контраст.

Функцията void contrast_streching(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn) с

примитив void contrast_streching(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); използва

локален указател DataOut към изход OUTPUT, където OUTPUT е дефиниран като

глобална от тип bmp_strc_tp и DataOut трябва да е от същия тип, тъй като сочи изходния

масив, в който се съханява изображението. Входното изображение се съхранява във

Page 36: 15 Methods for Image Processing by Svetla Raykova

36

входния маси INPUT дефиниран като глобална от тип bmp_strc_tp и се сочи от указател

DataIn от същия тип.

Във функцията за засилване на контраста са дефинирани три локални масива от тип

unsigned char: HIS, NHIS, SHIS.

HIS – едномерен масив с големина 256 елемента, който се използва за извличане и

съхваняване на хистограма от изображението. NHIS – едномерен масив с големина 256

елемента, който се използва за изчисляване и съхраняване на нормализираната сума от

хистограмата. SHIS – едномерен масив с големина 256 елемента, който се използва за

извличане и съхраняване на новата разгъната хистограма.

Във фунйцията се изполват и четири локални променливи. Първата е scale_factor

дефинирана от тип float, който се използва за изчисляване на нормализираната сума.

Втората и третата локална променлива са от тип unsigned char и представляват двата прага

от извлечената хистограмата или това е най-голямата и най-малката намерена стойност в

хистограмата – low и high. Използва се и временна променлива temp дефинирана от тип

unsigned char.

За цикличните оператори са дефинирани отделни локални променливи от тип int

x,y,i,j и макросите H,V от хедър bmp_strc.h и R,C от constants_list.h.

След инициализацията на масива на хистограмата, той се изчиства като използва

броячен цикъл. Функцията започва да обработва изображението като първо извлича

хистограмата в HIS масив, като използва цикъл в цикъла /описани в глава II/ както е

показано в кода:

for(x=0;x<H;x++)

for(y=0;y<V;y++)

{

HIS[DataIn->img_data[x][y]]++;

}

Извличането на хистограмта става по метода на таблиците на съответствието, т.е.

стойноста на пиксела от входното изображение извиква в масива HIS елемент със същия

пореден номер като стойноста на пиксела. В резултат след това дадената позиция от HIS

масива се инкрементира.

Получената хистограма бива проверява за най-малката възможна стойност с броячен

цикъл изпълнен 256 пъти, колкото елементи има и в HIS масива. Минавайки през всеки

един елемент от масива с логически цикъм с предусловие променливата temp присвоя

всеки елемент и го сравнява с до мамента намерената най-ниска стойност. В резултат се

съхранява по-ниската от двете стойности, както е показано в долния код:

for(i=0;i<256;i++)

{

temp=HIS[i];

if(low>temp)

low=temp;

}

Page 37: 15 Methods for Image Processing by Svetla Raykova

37

Същото се повтаря за намирането на най-високата стойност в хистограмата, т.е. за

намиране на горния праг. С един смесен цикъл от външен броячен цикъл и вътрешен

логически цикъл с предусловие се минава през всеки един пиксел от хистограмата и се

присвоява поотделно всяка една стойност като се сравнява с предварително намерена в

промнливата high. Която стояност е по-голяма бива върната в high.

С намерените прагова се запълва част от новоизчисляваната хистограма. С помощта

на броячен цикъл отброяващ до долния праг low се запълват с нули елемнтите в началото

на нормализиранта хистограма NHIS. Горния праг се използва в броячен цикъл с

декремнтиране, за да се отброи края на NHIS който да се запълни с стойности 255.

Средата на NHIS се изчислява по фомулла (3) от глава I.

Новополучения масив се прилава върху входното изображение като таблица на

съответствието за да се получи изходното изображение, което се съхранява в отделен

масив.

След това е възможно извличане на ховата хистограма от изходното изображение с

цел да се потвърди, че целия динамичен диапазон на хистограмата е запълнен.

III.5 Негатив на изображение.

Функцията void negative_intensity_transformation(bmp_strc_tp * DataOut, bmp_strc_tp

* DataIn) с примитив void negative_intensity_transformation(bmp_strc_tp * DataOut,

bmp_strc_tp * DataIn); е от тип void и служи за инвентиране на яркоста на пикселите и

представялява негативна яркостна трансформация, която се доближава до ефекта на

обикновен негаив на снимка.

Изходът от функцията се съхранява в глобален масив от тип bmp_strc_tp наречен

OUTPUT, който се сочи от указател DataOut. Входът на функцията се съхранява в масив

от тип bmp_strc_tp и се нарича INPUT, който се сочи от указател DataIn.

Функцията не инициализира локални променливи, а използва само глобалните

входни и изходни масиви и техните указатели, също така и ползва макроси H,V, R, C от

хедърен файл: bmp_strc.h и constants_list.h.

Обработката на изображението до негатив се извършва с цикъл в цикъла, който

преминава през всеки един пиксел от входните данни по редове и колони, както е

показано в кода:

for(x=0;x<H;x++)

for(y=0;y<V;y++)

{

DataOut->img_data[x][y]=~DataIn->img_data[x][y];

}

Изходът се получава пряко от инвентирането на яркостните стойности на пикселите

от входния масив и се съхраняват в изходния.

Page 38: 15 Methods for Image Processing by Svetla Raykova

38

III.6 Гама корекция.

Функцията void gamma_corection(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn) с

примитив void gamma_corection(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); описва

нелинейна функция за промяна на контраста /формула (4)/.

В гама корекцията са използвани един локален масив, една локална функция, две

локални променливи и три макроса. Изходът на функцията се съхранява в глобална

променлива от тип bmp_strc_tp OUTPUT сочена от указател DataOut същия тип. Входното

изображение се взима от глобална променлива INOUT от тип bmp_strc_tp сочена от

указател DataIn от същия тип.

Функцията първо инициализира локален масив GL /gamma lut/ от тип unsigned char, с

големина 256 елемента. След това програмата използва примитив gama_lut(GL); за да

извика локална функция от тип void, която да връща масива GL. Локалната функция void

gama_lut(GL) инициализира локална промелива i, която използва в броячен цикъл за да

изчисли таблица на съответствията за гама корекцията. За целта използва три макроса:

gamma, exp, operation(i) намиращи се в хедърен файл constants_list.h и описани подробно в

глава III.3. използват се и макросите H,V, R и C.

След завършване на операцията, резултатът се съхранява в GL и се връща в

основната функция void gamma_corection(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn).

Инициализират се още две локални промеливи x и y, които се използват в следващите

цикли. Вече изчислена таблица на съответствията за гама корекцията остава само да се

приложи върху входното изображение чрез цикъл в цикъла, както е показано на кода:

for(x=0;x<H;x++)

for(y=0;y<V;y++)

{

DataOut->img_data[x][y]=GL[DataIn->img_data[x][y]];

}

Входът сочен от DataIn извиква изход сочен от DataOut, като рзултата се съхранява

в OUTPUT масива.

III.7 Обостряне на контури.

Функцията void sharpening(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn) с примитив

void sharpening(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); служи да обостряне на

дребните детайли. Функцията за обостряне на контурите използва десет локални

променливи и три глобални масива.

Page 39: 15 Methods for Image Processing by Svetla Raykova

39

Изходът на функцията се съхранява в глобален масив от тип bmp_strc_tp OUTPUT

сочен от указател от същия тип DataOut. Изображението за обработка се взима от

глобален масив от тип bmp_strc_tp INPUT сочен от указател DataIn.

Изпълнението на функцията започва с инициализация на локалните променливи.

kernal_center_x е от тип int и служи за намиране на центъра на използваната маска по

хоризонтала, а за намиране на центъра по вертикала се използва kernal_center_y също от

тип int. Следващите две променливи са row и colm от int тип, които се използват за

отброяването на редовете и колните в използванта маска. Използват се и две локални

променливи от тип int за отброяване на редовете и колоните в изображението, това са

horizontal и vertical. Инициализирани са и четири локални променливи x,y,i,j от тип int,

които се използват от циклите във функцията. Във функцията присъстват и четирите

макроса H,V от хедърния файл bmp_strc.h и C и R от хедърен файл constants_list.h.

Обостряне на контурите се извършва с двумерна конволюция /по формула(6) от

глава I.2.1/ на двумерен масив съдържащ входното изображение и двумерен масив

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

описани в глава I.2.3/ и се съхраняват в хедърния файл constants_list.h.

Действието започва с центриране върху първия ред от изображенито с първия от

четирите броячни цикъла. Втория броячен цикъл посочва първата колона, а третия и

четвъртия броячен цикъл посочват първия ред и колона от масива на маската. Преди

извършване на самото действие е предвидена проверка на краищата на изображението да

не се достигне доо излизане от границите му. Това се извършва с логически цикъл с

преусловие, както е показано в кода:

if(horizontal>=0 && horizontal<H && vertical>=0 && vertical<V)

За първия пиксел от изображението и неговите съседни се умножават с маската и

биват сумирани в изходния глобален масив OUTPUT сочен във функцията от DataOut,

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

същия ред от изображението, но на следващата колона, за което се прилага отново двата

вътрешни цикъла, т.е. конволюция на центрирания пиксел и съдените му с избраната

маска /описани в глава I.2.3/. Действието продължава през цялото изображение до края

му.

III.8 Хомогенен оператор.

Функция void homogeneity_operator(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn ) с

примитив void homogeneity_operator(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn );

използва глобален масив OUTPUT от тип bmp_strc_tp сочен от указател DataOut за изход и

глобален масив INPUTот тип bmp_strc_tp сочен от DataIn за вход. Служи за намиране на

контури на изображение.

Page 40: 15 Methods for Image Processing by Svetla Raykova

40

Функцията започва с инициализация на локалните променливи WIN,var,m,x,y,i,j.

Двумрния масив WIN е от тип unsigned char, с големина 3х3 и се използва за присвояване

на части от изображението. Var е локална променлива от тип short int използвана като

2байтов буфер. Търсената максимална стойност се съхранява в m локална променива от

тип int. За използваните цикли се дефинират локални променливи от тип int x,y,i,j и

макросите H,V, C, R.

Принцип на действието: използват се четири броячни цикъла вложени един в друг.

Двата външни броячни цикъла за отброяване на пикселите на изображението по редове и

по колони, докато вътрешните два броячни цикъла служат за преместване на малкия

конволюционен прозорец през изображението. Малкият WIN прозорец се центрира върху

всеки един от пикселите, през които преминава като присвоява конкретния пиксел върху

който се намира и неговите съседни.

От първите девет присвоени стойности се изважда централния пиксел от маската,

като тази процедура не се прилага само върху центъра. Най-голямата абсолютна стойност

от разликите се връща като централен пиксел в изходното изображение, задължително в

различен от входния масив. Търсенето на най-глямата разлика се осъществява с логически

цикъл с предусловие, както е показано в кода:

var=abs(WIN[0][0]-WIN[1][1]);

if(var>m)

m=var;

Следващата стъпка от действието на програмата е чрез четирите броячни цикъла да

се посочи следващия пиксел от изображението и на ново да се присвоят девет стойности

от централния писели неговите съседни, които също биват обработени и резултата да бъде

върнат в изходен масив.

III.9 Диференциален оператор.

Функцията void differece_operator(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn) с

примитив void differece_operator(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); служи за

намиране на контури на изображение.

Изходът на функцията се съхранява в глобален двумерен масив OUTPUT от тип

bmp_strc_tp сочен от указател DataOut, входното избражение се взима от глобален

двумерен масив INPUT от тип bmp_strc_tp сочен от указател от същия тип DataIn.

Иннициализацията започва с локален двумерен масив WIN от тип unsigned char с

големина 3х3, в който се съхранява присвояваните късове информация от изображението.

Локалната променлива diff е от тип short int и служи за съхраняване на разликите от

операциите от обработката. Максималната абсолютна разлика от обработката, която е

намерена се съхранява в локална промнелива n от тип int. Специално инициализирани за

Page 41: 15 Methods for Image Processing by Svetla Raykova

41

ползване от броячните цикли са локалните променливи x,y,i,j от тип int и макросите H, V,

C, R.

Принципът на действие на диференциалния оператор е подобен на този на

хомогенни оператор. Функцията се центрира на първия пиксле от изображението

благодарение на външните два броячни цикъла, като най-горния цикъл отброява редовете

а долния колоните. Следва да се разположи малкия конволюционен прозорец върху

избрания пиксел. Това се извършва с вътрешните два броячни цикъла, като поо-горния

отброява редовете а по долни колоните, така че цебтъра на маската да съвпадне

конкретния пиксел. След това прозореца присвоява цетралния пиксел и съседните му.

Изчисляват се разлики само между: най-грорния ляв пиксел с най-долни ляв пиксел; горен

среден пиксел и долен среден пиксел; най-десен горен пиксле и най-ляв долен пиксел и

последната разлика е на най-десен среден с най-ляв среден /както е обяснено в глава

I.2.4.2/. От четирите намерени разлики се намира най-голямата по абсолютна стойност,

като това се осъществява с четири логически цикъла с предусловие. Най-голямата

намерена разлика се съхранява в локалната променлива diff, която се връща в изходното

изображение на място отговарящо на координатите на входния обработван пиксле от

входното изображение.

Диференциалния оператор се изпълнява по-бързо от хомогенния оператор поради

намаления брой изчисления за пиксел.

III.10 Маски изчислени чрез първа производна.

Функцията void fod_simple_masks(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn) с

примитив void fod_simple_masks(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); се използва

за намиране на контурите на изображение чрез първа производна. Съществуват

множество маски изчислени по първа производна. Маските, които са разгледани в тази

дипломна /глава I.2.4.3/ са Робърт, Превит и Собел.

Изходът на функцията се съхранява в глобален масив OUTPUT от тип bmp_strc_tp

сочен от указател от същия тип DataOut, а за вход се използва глобален масив INPUT от

тип bmp_strc_tp сочен от указател от същия тип DataIn.

Маските се прилагат по две едновременно: по х и по у. Обработеното изображение

се получава след сбора на обработките по двете координати. Във функциаята се

инициализирани два лoкални масива SMPL_X, SMPL_Y от тип bmp_strc_tp,в които се

съхранява първата обработка по двте оси. Инициализирани са и четири локални

променливи x,y,i,j използвани от броячните цикли. Присъстват и двата макроса H,V, C, R.

Обработказа започва с четири броячни цикъла. Докато външните два се центрират

върху всеки пиксел от изображението, то вътрешните два броячни цикъла центрират

Page 42: 15 Methods for Image Processing by Svetla Raykova

42

маската над избрания пиксел от най-външните цикли. Конволюцията се извършва като

всеки от пикслеите на входното изображение се конволюира със съответната стойност

попаднала от маската върху изображението. Като това се прави и за двете маски

едновременно и по х и по у, както е в кода:

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

SMPL_X.img_data[x][y]+=DataIn->img_data[x+i][y+j]* ROBERT_X[i][j];

SMPL_Y.img_data[x][y]+=DataIn->img_data[x+i][y+j]* ROBERT_Y[i][j];

}

}

}

}

За да се получи изходното изображение, резултантните от х и у маските се сумират

по абсолютна стойност и се съхраняват в глобалния масив OUTPUT сочен от DataOut.

Това се извършва с цъкъл в цикъла като първия пиксле от локалния масив по х и първия

пиксле от локалния масив по у се събират и се поставят на първа позиция в новото

изображение, следват втория пиксел от х и у локалните масви се събират и поставят на

втора позиция в изхония масив и т.н.

В зависимост от избраната маска намерните контури могат да бъдат по широки,

или да описват по финните детайли.

III.11 Компасен оператор.

Функцията void fod_compass_gradient_operator(bmp_strc_tp * DataOut, bmp_strc_tp *

DataIn) с примитив void fod_compass_gradient_operator(bmp_strc_tp * DataOut, bmp_strc_tp

* DataIn); служи за засичане на контури в осем различни посоки, с помощта на осем

едновременно прилагани маски.

Изходът на функцията се съхранява в глобален масив OUTPUT от тип bmp_strc_tp,

сочен от указател DataOut от същия тип. Входното изоражение се взима от глобален масив

INPUT от тип bmp_strc_tp, сочен от указател DataIn от същия тип.

Във функцията са декларирани две локални променливи temp и biggest от тип

unsigned char. Temp е променлива използвана за временно съхранение на яркостни

стойности на пиксели. Biggest е променлива съхраняваща най-голямата намерена стойнст

Page 43: 15 Methods for Image Processing by Svetla Raykova

43

от общо осемте маски. Както във всички функции до тук са използвани и макросите H, V,

C, R. Дефинирани са и локални променливи x,y,i,j от тип int, които се ползват от брочните

цикли.

Инициализират се и осем локални двумерни масива: e /east/, ne /north-east/, n /north/,

nw /north-west/, w /west/, sw/south-west/, s /south/, se /south-east/, от тип bmp_strc_tp, в които

се съхраняват резултатът от конволюирането на входното изображение с всяка от осемте

маски, както е по казано в кода:

e.img_data[x][y] + = DataIn->img_data[x+i][y+j] * K_MASK_E[i][j];

ne.img_data[x][y] + = DataIn->img_data[x+i][y+j] * K_MASK_NE[i][j];

n.img_data[x][y] + = DataIn->img_data[x+i][y+j] * K_MASK_N[i][j];

nw.img_data[x][y] + = DataIn->img_data[x+i][y+j] * K_MASK_NW[i][j];

w.img_data[x][y] + = DataIn->img_data[x+i][y+j] * K_MASK_W[i][j];

sw.img_data[x][y] + = DataIn->img_data[x+i][y+j] * K_MASK_SW[i][j];

s.img_data[x][y] + = DataIn->img_data[x+i][y+j] * K_MASK_S[i][j];

se.img_data[x][y ] + = DataIn->img_data[x+i][y+j] * K_MASK_SE[i][j];

Маските за компасен оператор се съхраняват в хедърен файл constants_list.h /описан

в глава III.2/.

Конволюирането на изображението с всяка маска по отделно се осъществява с

четири броячни цикъла вложени един в дръг /циъл в цикъла/, като след външните два

броячни цикъла, които центрират пикселите от изображенито, се извършва нулиране на

локалната biggest. Ако съдържанието и не бъде изтрито от предходния цикъл ще съдържа

грешна информация, резултатот наслагването на обработки от няколко цикъла.

След извършване на конволюцията локалната temp присвоява резултата от всеки

един от резултантните масиви /e, ne, n, nw, w, sw, s, se/ и намира най-голямата стойност

измежду тях с помощтана логически цикъл с предусловие, какт е в кода:

temp = e.img_data[x][y];

if (biggest < temp)

biggest = temp;

Намерения максимум се съхранява в biggest. На края на функцията стойността от

biggest се връща в изходния масив на резултантното изображение.

Резултата от обработката с компасен оператор са контури намерени в осем възможни

посоки. Полученото изображение е със светъл или бял фон и сиви или черни контури.

Това е поради търсенето на максимума от направените конволюции.

III.12 Детектор на Лаплас.

Функцията void sod_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn) с

примитив void sod_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); засича контури

Page 44: 15 Methods for Image Processing by Svetla Raykova

44

на принципа на втората производна /описана в глава I.2.4.4/.Детектора представлява маска

изчислена по формула (9) от същата глава. Масивите на маските са глобални от тип

bmp_strc_tp и се съхраняват в хедъра constants_list.h.

Изходния масив е глобален двумерен масив OUTPUT от тип bmp_strc_tp, сочен от

указател DataOut от същия тип. Входното изображение се взима от глобален двумерен

масив INPUT от тип bmp_strc_tp, сочен от указател DataIn от същия тип. Инициализирани

са и локални променливи x,y,i,j от тип int и макроси H,V,R,C които се използват от

четерите броячни цикъла.

Функцията използва четири броячни цикъла. С външните два центрира пикселите от

изображението, а с вътрешните два избраната маска се центрира върху желания пиксел и

се извършва конволюция. Резултатът се записва в изходния масив.

III.13 Преминаване през нулата.

Функцията void sod_zero_crossing(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn) с

примитив void sod_zero_crossing(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); засича

контури в изображение, когато срещне пикслена стойност по-висока от предварително

зададен праг.

Изходът на функцията се съхранява в глобален двумерен масив OUTPUT, от тип

bmp_strc_tp, сочен от указател DataOut от същия тип. Входното изображение се взима от

глобален двумерен масив INPUT от тип bmp_strc_tp, сочен от указател DataIn от същия

тип.

Инициализират се два двумерни масива WIN, NEW_ WIN от тип char, които служат

за частично присвояване на изображение. Две локални променливи temp и diff от тип char

се използват за временно съхраняване на пикселни стойности за сравняване, като

локалната diff съхранява разлика между пиксели. Инициализират се и локални

променливи x,y,i,j и a,b,s,t за ползване от броячните цикли. Макросите H,V,R,C от хедърен

файл bmp_strc.h и constants_list.h също се използват в циклите.

Функцията започва с четири броячни цикъла. Външните два отброяват пикселите по

редове и по колони, започвайки от първи ред и първа колона се центрира първия пиксел. С

вътрешните два броячни цикъла се центрират два двумерни прозореца 3х3 върху избрания

пиксел и неговите съседни. Това са прозорци WIN и NEW_WIN, в които се присвоява чат

от изображението, както следва:

{

WIN[i][j]=DataIn->img_data[x+i][y+j];

NEW_WIN[i][j]=DataIn->img_data[x+i][y+j];

}

Page 45: 15 Methods for Image Processing by Svetla Raykova

45

Масивът WIN се обработва с цел сортиране на стойностите му по низходящ ред.

Това се осъществява благодарение на четири броячни цикъла и един логически. С

логичския цикъъл с преусловие се проверява дали сегашния или бъдещия пиксел е с по-

голяма стойнсот. Ако бъдещия е с по-голяма стойност то на двете позиции им се разменят

местата. Това се извършва с веменната промелива temp, която присвоява от бъдещата

позиция и предава на настоящата в масива WIN. Метода на сортиране bubble sort е

обяснена в глава II.

След края на операцията в масива WIN се съдържат всичките предварително

присвоени стойности от изображението, но подредени в низходящ ред.

За намирането на преминаване през нулата е необходимо намирането на

абсолютната стойност на разликата на най-голямия и най-малкия пиксел от масива WIN.

Резултатътсе съхранява в локалната променлива diff:

diff= abs(WIN[0][0]-WIN[2][2]);

Остава само да се установи дали намерената разлика превишава предварително

зададена прагова стойност. С логически цикъл с предусловие :

if(diff>zc_treshold)

ако се установи превишаване се връща намерената разлика в изходния масив на

изображението. Това се осъществява с втория двумерен масив NEW_WIN, на който бе

присвоена същата част от входното изображение. Разликата се връща в центъра на масива,

който от своя страна ще бъде върнат в изходното изображение на място отговарящо на

координатите от входното изображение. Това се извършва с два броячни цикъла,

отброяващи до големината на малкия прозорец NEW_WIN, както следва:

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

DataOut->img_data[x+i][y+j]=NEW_WIN[i][j];

}

}

Резултатът от обработката е черен фон, който остват само контурите на детайлите.

Колкото по-голям е избрания праг, който трябва да се прехвърли /zc_treshold/ толкова по

близко ще се центрира до самия контур.

III.14 Преминаване през нулата и Лапласов оператор.

Функцията void sod_zero_crossing_of_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp *

DataIn) с примитив void sod_zero_crossing_of_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp

Page 46: 15 Methods for Image Processing by Svetla Raykova

46

* DataIn); служи за намаляване на шума при използвването на Лапласов детектор,

благодарение на вложения праг.

Изходът на функцията се съхранява в глобаленн двумерен масив OUTPUT от тип

bmp_strc_tp, сочен от укзател DataOut от същия тип. Входното изображение се съхранява в

глобален двумерен масив INPUT от тип bmp_strc_tp, сочен от указател DataIn от същия

тип.

Инициализират се и два локални двумерни масива WIN и NEW_WIN с големина 3х3

от тип char, които се използват за частично присвояване на изображението след

лапласовата обработка. За преминаване през нулата се дефинират две локални

променливи temp и diff, които се използват за временно съхраняване на стойности на

пиксели. Във функцията се инициализира локален двумерен масив ZRC /Zero crossing/ с

големина 128х128 елемента от тип bmp_strc_tp. Използва се за съхраняване на резултата

след обработката на преминаване през нулата. Инициализират се и осем локални

променливи използвани от броячните цикли x,y,i,j,a,b,s,t от тип int. Използват се макроси

H,V,R,C от хедърни файлове bmp_strc.h и constants_list.h.

Програмата започва с изпълнение на функцията за преминава през нулата. С четири

броячни цикъла вложени един в друг, като външните два служат за отброяване на

пикселите от входен масив INPUT, а вътрешните два служат за центриране на двата

празни прозореца WIN и NEW_WIN над избрания пиксел и неговите съседни. След

присвояване на пикслени стойности в двата масива, единият - WIN се обработва от

сортираща функция bubble_sort за подреждане на елементите му по низходящ ред. После

се търси абсолютната стойност на разликата на най-голямия и най-малкия пиксел. Тя се

съхранява в локалната променлива diff. За да се намери преминаването през нулата

получената разлика се сравнява с предварително избран праг съдържащ се в макрос

zc_treshold в хедърен файл constants_list.h. Ако намерената стойност прехвърли избрания

праг тя се връща като резултат в центъра на двумерен масив NEW_WIN. Условието за

търсене на праг се извършва с логически цикъл с предусловие if, а с цикъл в цикъла на

двумерен масив ZCR се присвоява резултантния NEW_WIN.

Функцията продължава с извършване на конволюция на обработеното изображение

от ZCR с предварително избрана маска ZCL_OTHER_MASK или ZCL_MASK

съхранявани в хедърен файл constants_list.h. Конволюцията се извършва с четири

вложени броячни цикъла /цикъл в цикъла/, като външните два отброяват пикселите на

обработеното изображение, а вътрешните два цикъла центрират конволюционнния

прозорец над избрания пиксел и неговите съседни. Резултатът от конвоюцията се

съхранява в глобален двумерен масив OUTPUT.

Page 47: 15 Methods for Image Processing by Svetla Raykova

47

III.15 DoG функция.

Функцията void sod_dog (bmp_strc_tp * DataOut, bmp_strc_tp * DataIn) с примитив

void sod_dog (bmp_strc_tp * DataOut, bmp_strc_tp * DataIn); представлява разлика между

Гаусови оператори с различни коефициент на разпределение и служи за намиране на

контурите на изображение чрез втора производна.

Изхода на функцията се съхранява в глобален масив OUTPUT от тип bmp_strc_tp,

сочен от указаател DataOut от същия тип. Входното изображение се съхранява в глобален

масив INPUT от тип bmp_strc_tp, сочен от указател DataIn от същия тип.

Във функцията са инициализирани локални променливи x,y,i,j, използвани от

броячните цикли и макроси H,V,R,C съхранявани е хедърен файл bmp_strc.h и

constants_list.h.

Принципът на действие е на основата на конволюиране на входното изображение с

предварително избрана маска DOG_7 или DOG_9, намираща се в хедърен файл

constants_list.h. Използват се четири вложени цикъла за избор на отделнен пиксел и

центриране на маската върху него.

Разликата при тази функция, е че конволюционните маски DOG_7 и DOG_9 са с

големина съответно 7х7 и 9х9. Размера им е различен, тъй като се изчисляват по формула

(10), глава I.2.4.4 и се дължи на различната стойност на коефициента на разпределение σ.

При по-малка избрана σ ширината на контурите ще е по-голяма, а при по-голяма σ

контурите ще са по-тесни.

III.16 Намиране на контурите на цветно изображение.

Функцията void sod_color_edge_detection (bmp_strc_tp * DataOut, bmp_strc_tp *

DataIn) с примитив void sod_color_edge_detection (bmp_strc_tp * DataOut, bmp_strc_tp *

DataIn) служи за намиране на контурите на 24 битово цветно изображение.

Изходът на функцията се съхранява двумеренн глобален масив OUTPUT от тип

bmp_strc_tp, сочен от указател DataOut от същия тип. Входното изображение се взима от

глобален двумерен масив INPUT от тип bmp_strc_tp, сочен от указател DataIn от същия

тип.

Функцията инициализира един локален двумерен масив HSI от тип bmp_strc_tp, в

който се съхранява преобразуваното в 8 битово изображение /формула (11), глава I.25/,

също така един малък локален масив WIN с големина 3х3 от тип char, в който се

присвоява часично изображението. Инициализирани са и локална променлива от тип char

temp за временно съхранение на пикселни стойности. Локална променлива m /maximum/

от тип int за съхраняване на намерената максимална стойност от обработката за намиране

на контури. Дефинирани са и локални промнеливи x,y,i,j от тип int, които се използват от

броячните цикли, също така се използват и макросите H,V,C,R от хедъри bmp_strc.h и

constants_list.h.

Page 48: 15 Methods for Image Processing by Svetla Raykova

48

Функцията започва с преобрауване на 24 битово изображение в 8 битово с два

броячни цикъла вложени един в дръг /цикъл в цикъла/. Резултатът се съхранява в масив

HSI. Следва втората част от функцията за търсене на контурите на вече черно-бялото

изображение, като се използва диференциален оператор. За прилагането на оператора си

използват четири броячни цикъла вложени един в дъг, благодарение на които се рисвоява

част от изобржението в малкия двумерен масив WIN. Със стойностите от локалния масив

се извършва изваждане на: горна лява с долна дясна; горна средна с долна средна; горна

дясна с долна лява и средна дясна с средна лява. От получените разлики се търси най-

голямата по абсолютна стойност и се връща като резултат в изходното изображение за

получаване на контури.

III.17 Огледален ефект.

Функцията void mirroring(bmp_strc_tp * DataOut, bmp_strc_tp * DataOut2, bmp_strc_tp

* DataIn) с примитив void mirroring(bmp_strc_tp * DataOut, bmp_strc_tp * DataOut2,

bmp_strc_tp * DataIn); се използва за преместване на изображението по х или у

координати.

Изходнът на функцията се съхранява в два отделни глобални двумерни масива

OUTPUT и OUTPUT2 от тип bmp_strc_tp, сочени от два указателя DataOut, DataOut2 от

същия тип. Нужни са два масива, тъй като функцията връща винаги две изображения,

едното преместено по х а другото по у. Входът на функцията се взима от глобалния

двумерен масив INPUT от тип bmp_strc_tp, сочен от указател DataIn от същия тип.

Функцията инициализира две локални променливи x,y от тип int, които се използват

от два броячни цикъла. Ползват се и макросите H,V от хедърен файл bmp_strc.h.

Принципа на работа на двата броячни цикъла е цикъл в цикъла. За преместването по

х и по у на входно изображение се изменят координатите, както се вижда в кода:

DataOut->img_data[x][y]=DataIn->img_data[128-x][y];

DataOut2->img_data[x][y]=DataIn->img_data[x][128-y];

И се връщат два изхода, като получения ефект наподобява огледален образ по двете

координати.

III.18 Разлики между две изображения.

Функцията void difference_between_images (bmp_strc_tp * DataOut, bmp_strc_tp *

DataIn, bmp_strc_tp * DataIn2) с примитив void difference_between_images (bmp_strc_tp *

DataOut, bmp_strc_tp * DataIn, bmp_strc_tp * DataIn2); служи за намиране на разликите

между две изображения.

Page 49: 15 Methods for Image Processing by Svetla Raykova

49

Изходът на функцията се съхранява в глобален двумерен масив OUTPUT от тип

bmp_strc_tp, сочен от указател DataOut от същия тип. Входните изображения на

функцията се съхраняват в два двумерни глобални масива INPUT и INPUT2 от тип

bmp_strc_tp, сочени от указатели DataIn и DataIn2 от същия тип.

Тъй като трябва да се намерят разлики между две изображения, се запазват два

входни масива.

Функцията инициализира и две локални променливи x,y от тип int и използва два

макроса H,V от хедърен файл bmp_strc.h.

Принципа на работа следва формула (12) от глава I.4.1, т.е. изходото изображени

представява абсолютната стойност от разликата на входните две, както се вижда от кода:

DataOut->img_data[x][y]=abs(DataIn->img_data[x][y] - DataIn2->img_data[x][y]);

Формулата се прилага с цикъл в цикъла, като работи пиксле по пиксел. Първия

пиксле на едното изображение се изважда от първия пиксел на другото изображение и

абсолютната им стойност се съхранява на мястото на първия пиксел от изходното

изображение. Това се повтаря за всеки следващ пиксел до края на изображенията.

III.19 Блокова схема на проектираната библиотека.

На Фиг.28 е представена примерна блокова схема за приложение на проектираната

библиотека с функциите описани в глава III. В Таблица.3 са представени имената на

функциите в библиотеката и отговарящите им методи от глава I.

Метод за обработка Функиция от библиотека

ANOTHER_IMG_LIB

Засилване на контраста contrast_streching

Негатив на изображение negative_intensity_transformation

Гама корекция gamma_corection

Обостряне на контури sharpening

Хомогенен оператор homogeneity_operator

Диференциален оператор differece_operator

Маски изчислени чрез първа производна fod_simple_masks

Компасен оператор fod_compass_gradient_operator

Детектор на Лаплас sod_laplacian

Преминаване през нулата sod_zero_crossing

Преминаване през нулата и Лапласов оператор sod_zero_crossing_of_laplacian

DoG функция sod_dog

Намиране на контурите на цветно изображение sod_color_edge_detection

Огледален ефект mirroring

Намиране на разликите между две изображения difference_between_images

Таблица.3

Page 50: 15 Methods for Image Processing by Svetla Raykova

50

Page 51: 15 Methods for Image Processing by Svetla Raykova

51

Има три режима на използване на Analog Devices Visual DSP++ : simulator

/симулатор/, evaluator и emulator /емулатор/. В настоящата дипломна работа са използвани

два метода за прилагане на създадената библиотека. Първо е приложени симулационния

метод и впоследствие библиотеката се прилага на готова платка.

IV.1 Симулаторен режим.

Библиотеката създадена за специализираната структура на ADSP BF533. Като за

проектирането и се използва симулационна среда на Analog Devices – Visual DSP ++ v5.0.

Симулатора в средата позволя пълно репликиране на работата на процесора без нуждата

от хардуени приложения. При стартиране на програмно приложение в Visual DSP, се чете

файл с разширение *.dxe, симулиращ работата на избрания микропроцесор, *.ldf файл,

организиращ връзките между микропроцесора и паметите.

Симулатора се използва в режим на Debuging Session, което позволява поставянето

на точки на прекъсване /breakpoint/ през кода на програмата; симулиране: стъпка по

стъпка /stepping/, цялата програма /run/ или задържане /halt/; преглед на състоянието на

процесора по всяко време от изпълнението на процесора: памет, регистри и стек.

Първо е използван симулационен подход, тъй като позволява проверка на работата

на проектираната библиотека с функции, без инициализация на хардуер, с използването на

тестови примери.

Резултатите от направената симулация погат за определянето на необходимите

ресурси, нужни за изпитанията върху макета. Тъй като не може да се опедели времето за

изпълнение на дадена фукция симулирана върху макета, се използва симулатора като

средство за определяне на ефективните времена на изпълнение.

IV.2 Емулаторен режим.

След завършване на тестване на програмите се пристъпва към използване емулатора.

Работата му се състои в свързване на персонален компютър, на който се намира Visual

DSP приложението, и готова платка. Като емулатора потдържа бърза комуникация между

двете устройства.

Използваната платка е ADSP-BF533 EZ-KIT Lite с блокова схема на Фиг.29 и снимка

на реалния макет на Фиг.30.

IV. Избор и описание на методите за тестване.

Page 52: 15 Methods for Image Processing by Svetla Raykova

52

EZ KIT LITE BF533 притежева USB controller за връзка на персонален компютър

към платката, което позволява трансфер на готови модули и програми от Visual DSP++

във външни SDRAM и/или FLASH памет. Друг начин за трансфер е JTAG, който може да

подобри скороста на трансфер. Analog Devices потдържат TAP /test accesse port/ за IEEE

1149.1 JTAG. Емулатора ползва този порт за да се свърже с вътрешните приложения на

процесора, като работата му временно се спира при трансфер на данни и команди, и се

възтановява на цяла стъпка без да влиае на системното време.

Връзката на външната памет /SDRAM, FLASH memory/ с DSP BF процесора се

осъществява чрез EBIU /external bus interface unit/, който представлява 16 битова шина за

адреси, данни и управление.

PPI /parallel peripheral interface/ е 16 битова шина, която работи на честотата на

вътрешния часовник на процесора, и се свързва с видео енкодер/декодер

Page 53: 15 Methods for Image Processing by Svetla Raykova

53

/ADV7171/ADV7183/ на платката.

Номерираните елементи от Фиг.30 на макета са както следва:

1 – захранване на макета;

2 – USB;

3 – JTAG порт;

4 – Видео вход/изход;

5 – ADSP BF533;

6 – SDRAM 16x16bit;

7 – FLASH memory 2 чипа – 1M x 8bit;

8 – Видео декодер;

9 – Видео енкодер;

Page 54: 15 Methods for Image Processing by Svetla Raykova

54

Оригинал Обработка Допълнителна информация АNOTHER_IMG_LIB

ЗАСИЛВАНЕ НА КОНТРАСТ

Функция: contrast_streching

НЕГАТИВ НА ИЗОБРАЖЕНИЕ

Функция: negative_intensity_

transformation

ГАМА КОРЕКЦИЯ

Функция: gamma_corection

За γ=0.45

За γ=2.1

ОБОСТРЯНЕ НА КОНТУРИ

МАСКА

/Фиг.12,ляво, глава I.2.3/

МАСКА

/Фиг.12,седна, глава I.2.3/

Функция: sharpening

V. Експериментални резултати.

V.1 Резултати след изпълнение в симулатор.

Page 55: 15 Methods for Image Processing by Svetla Raykova

55

МАСКА

/Фиг.12,дясно, глава I.2.3/

ХОМОГЕНЕН ОПЕРАТОР

МАСКА

/Фиг.14, глава I.2.4.1/

Функция: homogeneity_

operator

ДИФЕРЕНЦИАЛЕН ОПЕРАТОР

МАСКА

/Фиг.15, глава I.2.4.2/

Функция: differece_operator

МАСКИ ИЗЧИСЛЕНИ ЧРЕЗ ПЪРВА ПРОИЗВОДНА

МАСКА НА РОБЪРТ

/Фиг.16, глава I/

.

МАСКА НА ПРЕВИТ

/Фиг.16, глава I/

МАСКА НА СОБЪЛ

/Фиг.16, глава I/

Функция: fod_simple_masks

Page 56: 15 Methods for Image Processing by Svetla Raykova

56

КОМПАСЕН ОПЕРАТОР

МАСКА НА ПРЕВИТ

/Фиг.17, глава I.2.4.3/

МАСКА НА РОБИНСЪН

НИВО 3

/Фиг.17, глава I.2.4.3/

МАСКА НА РОБИНСЪН

НИВО 5

/Фиг.17, глава I.2.4.3/

МАСКА НА КРИШ

/Фиг.17, глава I.2.4.3/

Функция: fod_compass_

gradient_operator

ДЕТЕКТОР НА ЛАПЛАС

МАСКА /Фиг.18,ляво, глава I.2.4.4/

МАСКА /Фиг.18,дясно, глава I.2.4.4/

Функция: sod_laplacian

Page 57: 15 Methods for Image Processing by Svetla Raykova

57

ПРЕМИНАВАНЕ ПРЕЗ НУЛАТА

ПРАГ 15

ПРАГ 30

ПРАГ 45

Функция: sod_zero_crossing

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

МАСКА /Фиг.18,ляво, глава I.2.4.4/

ПРАГ 15

МАСКА /Фиг.18,дясно, глава I.2.4.4/

ПРАГ 30

МАСКА /Фиг.18, глава I.2.4.4/

ПРАГ45

Функция: sod_zero_crossing_

of_laplacian

Page 58: 15 Methods for Image Processing by Svetla Raykova

58

DoG ФУНКЦИЯ

МАСКА 7Х7

/Фиг.21,горна, глава I.2.4.4/

МАСКА 9Х9

/Фиг.21,долна, глава I.2.4.4/

Функция: sod_dog

НАМИРАНЕ НА КОНТУРИ НА ЦВЕТНО ИЗОБРАЖЕНИЕ

МАСКА ЗА ДИФЕРЕНЦИАЛЕН

ОПЕРАТОР

/Фиг.15, глава I.2.4.2/

Функция: sod_color_edge_

detection

ОГЛЕДАЛЕН ЕФЕКТ

Функция: mirroring

Page 59: 15 Methods for Image Processing by Svetla Raykova

59

Таблица.4

Име на функция от библиотеката Време за изпълнение

Засилване на контраст 3,534ms

Негатив на изображение 1,673ms

Гама корекция

За γ=0.45

За γ=2.1

6,381ms

6,283ms

Обостряне на контури

/Фиг.12, ляво, глава I.2.3/

/Фиг.12, средна, глава I.2.3/

/Фиг.12, дясно, глава I.2.3/

35,758ms

35,758ms

35,758ms

Хомогенен оператор 28,358ms

Диференциален оператор 25,229ms

Маски изчислени чрез първа производна

Маска на Робърт 66,561ms

НАМИРАНЕ НА РАЗЛИКИ МЕЖДУ ДВЕ ИЗОБРАЖЕНИЯ

Функция: difference_between_

images

Page 60: 15 Methods for Image Processing by Svetla Raykova

60

Маска на Превит

Маска на Собъл

66,561ms

66,561ms

Компасен оператор

Маска на Превит

Маска на Робинсън ниво3

Маска на Робинсън ниво5

Маска на Криш

192,533ms

192,534ms

192,546ms

192,560ms

Детектор на Лаплас /Фиг.18, ляво, глава I.2.4.4/

/Фиг.18, дясно, глава I.2.4.4/ 27,656 ms

27,656ms

Преминаване през нулата

ПРАГ 15

ПРАГ 30

ПРАГ 45

145,082ms

141,956ms

140,981ms

Преминаване през нулата и Лапласов оператор

/Фиг.18, ляво, глава I.2.4.4/ с ПРАГ 15

/Фиг.18, ляво, глава I.2.4.4/ с ПРАГ 30 /Фиг.18, ляво, глава I.2.4.4/ с ПРАГ 45

172,738ms

169,613ms

168,411ms

DoG функция

/Фиг.21,горна, глава I.2.4.4/ Маска 7х7

/Фиг.21,долна, глава I.2.4.4/ Маска 9х9

212,735ms

223,832ms

Намиране на контури на цветно изображение 60,134ms

Огледален ефект 2,861ms

Намиране на разлики между две изображения 2,370ms

Таблица.5

На Таблица.4 са представени резултатите от обработка на изображения чрез

симулация, а в Таблица.5 са дадени ефективните времена за изпълнение на всяка една от

обработките.

Прозорец на симулатора е представен на Фиг.31 и Фиг.32. В централния прозорец от

симулатора на Фиг.31 се намират кодовете, които в момента се симулират. В прозорец

Project в ляво от него е целият проект изпълняващ библиотеката от функции.

Изображението за обработка се въвежда ръчно в паметтна на DSP BF /Фиг.31, (4)/, тъй

като липсва физическо устройство. Това се изпълнява в прозорец BLACKFIN Memory с

десен бутон Fill на желаната начална клетка.

Въведеното и обработеното изображение могат да се видят и по време на самата

симулация чрез Image Viewer /Фиг.31, (1) и (2)/.

Ефективните времена за изпълнение се определят като броя цикли изпълнени от

функция се умножат по времето за изпълнение на един цикъл в DSP BF. Циклите могат да

бъдат засечени от прозорец Cycles /Фиг.31, (3)/.

Page 61: 15 Methods for Image Processing by Svetla Raykova

61

Номерираните прозорци от Фиг.31 са както следва:

1 – Image Viewer – изходно изображение след обработка;

2 – Image Viewer – входно изображение от памета на DSP BF;

3 – Cycles - прозорец пооказващ броя цикли;

4 – BlackFin Memory – прозорец с памета на микропроцесора.

Прозорец на примерна програма, която да извиква функциите от библиотеката в

симулатора, е представен на Фиг.32 с блокова схема от Фиг.28, глава III. Програмта

използва оператор scanf, който извиква прозорец stdin /Фиг.32, (1)/ за въвеждане на номер

на желаната функция за изпъление и за използване на вече обработено изображение или

прихващане на ново.

Page 62: 15 Methods for Image Processing by Svetla Raykova

62

Номерираните прозорци от Фиг.32 са както следва:

1 – stdin – прозореца изкача извикан от оператора scanf;

V.2 Резултати след изпълнение върху EZ KIT LITE BF533.

Използва се платка EZ KIT LITE BF533 на Analog Devices с JTAG и камера

Panasonyc M800, с която се прихващат изображения в памета на BF533. Резултатите са

представени в Таблица.6, а експерименталната постановка е показана на Фиг.33.

Page 63: 15 Methods for Image Processing by Svetla Raykova

63

Изображение АNOTHER_IMG_LIB

ЗАСИЛВАНЕ НА КОНТРАСТ

ОБ

РА

БО

ТК

А О

РИ

ГИ

НА

Л

Функция:

contrast_streching

НЕГАТИВ НА ИЗОБРАЖЕНИЕ

О

БР

АБ

ОТ

КА

О

РИ

ГИ

НА

Л

Функция:

negative_intensity_

transformation

Page 64: 15 Methods for Image Processing by Svetla Raykova

64

ГАМА КОРЕКЦИЯ О

БР

АБ

ОТ

КА

О

РИ

ГИ

НА

Л

ОБ

РА

БО

ТК

А О

РИ

ГИ

НА

Л

Функция:

gamma_corection

За γ=0.45

За γ=2.1

Page 65: 15 Methods for Image Processing by Svetla Raykova

65

ОБОСТРЯНЕ НА КОНТУРИ

О

БР

АБ

ОТ

КА

О

РИ

ГИ

НА

Л

Функция: sharpening

МАСКА

/Фиг.12,ляво, глава

I.2.3/

ХОМОГЕНЕН ОПЕРАТОР

О

БР

АБ

ОТ

КА

О

РИ

ГИ

НА

Л

Функция: homogeneity_

operator

МАСКА

/Фиг.14, глава I.2.4.1/

Page 66: 15 Methods for Image Processing by Svetla Raykova

66

МАСКИ ИЗЧИСЛЕНИ ЧРЕЗ ПЪРВА ПРОИЗВОДНА

О

БР

АБ

ОТ

КА

О

РИ

ГИ

НА

Л

Функция: fod_simple_masks

МАСКА НА РОБЪРТ

/Фиг.16, глава I/

ДЕТЕКТОР НА ЛАПЛАС

О

БР

АБ

ОТ

КА

О

РИ

ГИ

НА

Л

Функция: sod_laplacian

МАСКА /Фиг.18,ляво, глава I.2.4.4/

Page 67: 15 Methods for Image Processing by Svetla Raykova

67

DoG ФУНКЦИЯ

О

БР

АБ

ОТ

КА

О

РИ

ГИ

НА

Л

Функция: sod_dog

МАСКА 9Х9

/Фиг.21,долна, глава

I.2.4.4/

Таблица.6

Page 68: 15 Methods for Image Processing by Svetla Raykova

68

Page 69: 15 Methods for Image Processing by Svetla Raykova

69

Проектирана е библиотека с набор от функции за специализирана структура на

ADSP BF 53x, за цифрова обрарботка на изображения. Библиотеката съдържа петнадесет

функции, както за подобряване на качеството, така и за намиране на контури на обекти от

черно-бяло и цветно изображение.

Тестването на библиотеката протича на две нива: чрез симулатор, моделирайки

работата на реален микропроцесор от семейството на BF53x във виртуална среда Visual

DSP++ v5.0 на Analog Devices; и върху платка EZ KIT LITE ADSP BF533, специално

оборудвана за обработка на видео сигнали и прихващане на изображения.

Симулационното тестване показва правилноста на работа на функциите прилагани

върху статични изображения. Резултат от тестването е и определяне на ефективните

времена за изпъление на всяка от функциите.

Тестването върху платката позволява прихващане на фрейм от видео сигнал и

непосредствената му обработка с избираема функция от библиотеката.

Експерименталната постановка разкрива възможноста за устройство, използващо

специалзиранта структура на BF53х, което да извършва цифрова обработка на прихванати

изображения с голямо бързодействие, малка мощност, намалена консумация, малки

габарити и гъвкавост изразяваща се във възможността за препрограмиране и

пренастройване на системата.

Настоящата дипломна работа е представена на конференция с международно

участие TECHSYS 2009г.

Проектиранта библиотека дава възможност за използване на оптимизираната

структура на ADSP BF като устройство с широко приложение в охранителни системи,

машинно зрение /за дефектни изделия/, медицината /за анализ и диагностика/, и

възможност за създаване на нов тип устройства за разпознаване на обекти и определяне на

разтояния с цел подобряване на качеството на живот на незрящи хора.

VI. Изводи и оценка на собствените приноси.

Page 70: 15 Methods for Image Processing by Svetla Raykova

70

1. R.Crane. Simplified approach to image processing in C, Prentice Hall PTR , New

Jersey, 1997.

2. W.Phillips. Image processing in C, R & D Publication, Lawrence, Kansas, USA,

2000.

3. M.Petrou, Bosdogianni P. Image processing.. the fundamentals, Technical University

of Crete, China, Greece, 1999.

4. B.Jahne. Digital image processing. University of Heidelberg,Online Library,5ed.,

Springer, 2002.

5. J. Arendt. Algorithms for programmers, http://www.jjj.de/fxt/, 2002.

6. Analog Devices. ADSP BF-533 BlackFin Processor,2008

7. http://en.wikipedia.org/wiki/BMP_file_format

8. http://www.acm.uiuc.edu/webmonkeys/book/c_guide/

9. Analog Devices. Image consideration,http://www.analog.com/ee-note,September 2008

10. Светлана Райкова, Тонка Танчева, Бойко Петров. Изследване реализацията

на алгоритми за обработка на двумерни сигнали върху ADSP BF53x,

Конференция TECHSYS с междурадно участие, ТУ-София, Филиал Пловдив,

2009.

VII. Използвана литература.

Page 71: 15 Methods for Image Processing by Svetla Raykova

71

П Р И Л О Ж Е Н И Я

I. bmp_strc.h

#define H 128

#define V 128

#ifndef bmp_strc

#define bmp_strc

typedef struct {

short int magic_num; //2B identify

short int size_bmp1; //4/2B size of bmp

short int size_bmp2; //4/2B size of bmp

short int actual_v1; //2B reserved for actual value

short int actual_v2; //2B reserved for actual value

short int start_add_data1; //4/2B starting address of the byte where the bitmap data

can be found

short int start_add_data2; //4/2B starting address of the byte where the bitmap data

can be found

short int size_header1; //4/2B size of the header

short int size_header2; //4/2B size of the header

short int width1; //4/2B width of the bmp in pxls

short int width2; //4/2B width of the bmp in pxls

short int heith1; //4/2B hieth ot the bmp in pxls

short int heith2; //4/2B hieth ot the bmp in pxls

short int num_colors; //2B number of colors that have been used = 1

short int bits_per_pxl; //2B bits per pxl witch is the color deth = 1,4,8,16,24,32

short int compretion1; //4/2B the compretion method that have been used =

0,1,2,3,4,5

short int compretion2; //4/2B the compre,tion method that have been used =

0,1,2,3,4,5

short int size_img1; //4/2B the size of the image bits in raw data

short int size_img2; //4/2B the size of the image bits in raw data

short int H_res1; //4/2B horizontal resolution of the image; pxl per meter

short int H_res2; //4/2B horizontal resolution of the image; pxl per meter

short int V_res1; //4/2B vertical resolution of the image; pxl per meter

short int V_res2; //4/2B vertical resolution of the image; pxl per meter

short int num_col_palette1; //4/2B number of color in the palette; po stepenite na

dvoikata

short int num_col_palette2; //4/2B number of color in the palette; po stepenite na

dvoikata

Page 72: 15 Methods for Image Processing by Svetla Raykova

72

short int num_important_col1; //4/2B number of important colors in the image = 0

if they are all important

short int num_important_col2; //4/2B number of important colors in the image = 0

if they are all important

char img_data[H][V]; //mqsto za masiwa na img se opredelq izwun structurata

}bmp_strc_tp;

#endif

II. constants_list.h

/****************************************************************************/

/************************** CONSTANTS LIST ********************************/

/****************************************************************************/

/******* NUMBER OF PXLS IN THE 128X128 8BITS IMAGE ***********/

#define pxls 16384

/******* WIDTH AND HEIGHT OF THE CONVOLUTION MASKS **********/

#define R 3

#define C 3

#define R_mask7 8

#define C_mask7 8

#define R_mask9 9

#define C_mask9 9

/******* TRESHOLD OF THE ZERO-CROSSING FUNCTION *************/

#define zc_treshold 30

/******* GAMMA CONSTANT FOR GAMMA CORECTION FUNCTION ********/

#define gama 2.1

#define exp 1/gama

#define operation_gamma(i) (pow((i/255.0),exp)*255.0)

Page 73: 15 Methods for Image Processing by Svetla Raykova

73

/****************************************************************************/

/************************** EDGE DETECTION MASKS ************************/

/****************************************************************************/

/****SHARPENING MASKS****/

char Sharpening_CM[3][3]={

{0,-1,0},

{-1,5,-1},

{0,-1,0}

};

char Sharpening_CM1[3][3]={

{-1,-1,-1},

{-1,9,-1},

{-1,-1,-1}

};

char Sharpening_CM2[3][3]={

{1,-2,1},

{-2,5,-2},

{1,-2,1}

};

/****************************************************************************/

/************FIRST ORFER DERIVETIVE - EDGE DETECTION MASKKS***********/

/****************************************************************************/

/******SIMPLE MASKS ********/

char PREWITT_X[3][3]={

{1,0,-1},

{1,0,-1},

{1,0,-1}

};

char PREWITT_Y[3][3]={

{-1,-1,-1},

{0,0,0},

{1,1,1}

};

char SOBEL_X[3][3]={

{1,0,-1},

{2,0,-2},

{1,0,-1}

};

Page 74: 15 Methods for Image Processing by Svetla Raykova

74

char SOBEL_Y[3][3]={

{-1,-2,-1},

{0,0,0},

{1,2,1}

};

char ROBERT_X[3][3]={

{0,0,-1},

{0,1,0},

{0,0,0}

};

char ROBERT_Y[3][3]={

{-1,0,0},

{0,1,0},

{0,0,0}

};

/****COMPASS GRADIENT OPARATOR****/

/***PREWITT***/

char P_MASK_E[R][C]={

{1,1,-1},

{1,-2,-1},

{1,-1,-1}

};

char P_MASK_NE[R][C]={

{1,-1,-1},

{1,-2,-1},

{1,1,-1}

};

char P_MASK_N[R][C]={

{-1,-1,-1},

{1,-2,1},

{1,1,1}

};

char P_MASK_NW[R][C]={

{-1,-1,1},

{-1,-2,1},

{1,1,1}

};

char P_MASK_W[R][C]={

{-1,1,1},

{-1,-2,1},

{-1,1,1}

};

Page 75: 15 Methods for Image Processing by Svetla Raykova

75

char P_MASK_SW[R][C]={

{1,1,1},

{-1,-2,1},

{-1,-1,1}

};

char P_MASK_S[R][C]={

{1,1,1},

{1,-2,1},

{-1,-1,-1}

};

char P_MASK_SE[R][C]={

{1,1,1},

{-1,-2,1},

{-1,-1,1}

};

/***KRISH***/

char K_MASK_E[R][C]={

{5,-3,-3},

{5,0,-3},

{5,-3,-3}

};

char K_MASK_NE[R][C]={

{-3,-3,-3},

{5,0,-3},

{5,5,-3}

};

char K_MASK_N[R][C]={

{-3,-3,-3},

{-3,0,-3},

{5,5,5}

};

char K_MASK_NW[R][C]={

{-3,-3,-3},

{-3,0,5},

{-3,5,5}

};

char K_MASK_W[R][C]={

{-3,-3,5},

{-3,0,5},

{-3,-3,5}

};

char K_MASK_SW[R][C]={

{-3,5,5},

{-3,0,5},

Page 76: 15 Methods for Image Processing by Svetla Raykova

76

{-3,-3,-3}

};

char K_MASK_S[R][C]={

{5,5,5},

{-3,0,-3},

{-3,-3,-3}

};

char K_MASK_SE[R][C]={

{5,5,-3},

{5,0,-3},

{-3,-3,-3}

};

/***ROBINSON LEVEL 3***/

char R3_MASK_E[R][C]={

{1,0,-1},

{1,0,-1},

{1,0,-1}

};

char R3_MASK_NE[R][C]={

{0,-1,-1},

{1,0,-1},

{1,1,0}

};

char R3_MASK_N[R][C]={

{-1,-1,-1},

{0,0,0},

{1,1,1}

};

char R3_MASK_NW[R][C]={

{1,1,-1},

{1,-2,-1},

{1,1,-1}

};

char R3_MASK_W[R][C]={

{-1,0,1},

{-1,0,1},

{-1,0,1}

};

char R3_MASK_SW[R][C]={

{0,1,1},

{-1,0,1},

{-1,-1,0}

};

char R3_MASK_S[R][C]={

Page 77: 15 Methods for Image Processing by Svetla Raykova

77

{1,1,1},

{0,0,0},

{-1,-1,-1}

};

char R3_MASK_SE[R][C]={

{1,1,0},

{1,0,-1},

{0,-1,-1}

};

/***ROBINSON LEVEL 5***/

char R5_MASK_E[R][C]={

{1,0,-1},

{2,0,-2},

{1,0,-1}

};

char R5_MASK_NE[R][C]={

{0,-1,-2},

{1,0,-1},

{2,1,0}

};

char R5_MASK_N[R][C]={

{-1,-2,-1},

{0,0,0},

{1,2,1}

};

char R5_MASK_NW[R][C]={

{-2,-1,0},

{-1,0,1},

{0,1,2}

};

char R5_MASK_W[R][C]={

{-1,0,1},

{-2,0,2},

{-1,0,1}

};

char R5_MASK_SW[R][C]={

{0,1,2},

{-1,0,1},

{-2,-1,0}

};

char R5_MASK_S[R][C]={

{1,2,1},

{0,0,0},

{-1,-2,-1}

Page 78: 15 Methods for Image Processing by Svetla Raykova

78

};

char R5_MASK_SE[R][C]={

{2,1,0},

{1,0,-1},

{0,-1,-2}

};

/****************************************************************************/

/**********SECOND ORDER DERIVETIVE - EDGE DETECTION MASKS***********/

/****************************************************************************/

/***ZERO CROSSING OF LAPLACIAN****/

char ZCL_OTHER_MASK[3][3]={

{0,-1,0},

{-1,4,-1},

{0,-1,0}

};

char ZCL_MASK[3][3]={

{-1,-1,-1},

{-1,8,-1},

{-1,-1,-1}

};

/***7x7 DoG MASK***/

char DOG_7[7][7]={

{0,0,-1,-1,-1,0,0},

{0,-2,-3,-3,-3,-2,0},

{-1,-3,5,5,5,-3,-1},

{-1,-3,5,16,5,-3,-1},

{-1,-3,5,5,5,-3,-1},

{0,-2,-3,-3,-3,-2,0},

{0,0,-1,-1,-1,0,0}

};

/***9x9 DoG MASK***/

char DOG_9[9][9]={

{0,0,0,-1,-1,-1,0,0,0},

{0,-2,-3,-3,-3,-3,-3,-2,0},

{0,-3,-2,-1,-1,-1,-2,-3,0},

Page 79: 15 Methods for Image Processing by Svetla Raykova

79

{-1,-3,-1,9,9,9,-1,-3,-1},

{-1,-3,-1,9,19,9,-1,-3,-1},

{-1,-3,-1,9,9,9,-1,-3,-1},

{0,-3,-2,-1,-1,-1,-2,-3,0},

{0,-2,-3,-3,-3,-3,-3,-2,0},

{0,0,0,-1,-1,-1,0,0,0}

};

III. ANOTHER_IMG_LIB.h

/****************************************************************************/

/******************************* HEADER FILE *****************************/

/****************************************************************************/

#include "bmp_strc.h"

void negative_intensity_transformation(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void contrast_streching(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void gamma_corection(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void sharpening(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void mirroring(bmp_strc_tp * DataOut, bmp_strc_tp * DataOut2, bmp_strc_tp * DataIn);

void difference_between_images(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn, bmp_strc_tp

*DataIn2);

void homogeneity_operator(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void differece_operator(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void fod_simple_masks(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void fod_compass_gradient_operator(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void sod_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void sod_zero_crossing(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void sod_zero_crossing_of_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void sod_dog(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

void sod_color_edge_detection(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn);

Page 80: 15 Methods for Image Processing by Svetla Raykova

80

IV. АNOTHER_IMG_LIB.c

/****************************************************************************/

/***************************** SOURCE FILE ********************************/

/****************************************************************************/

#include <stdio.h>

#include <math.h>

//#include "bmp_strc.h"

#include "constants_list.h"

#include "ANOTHER_IMG_LIB.h"

/******************* NEGATIVE INTENSITY TRANSFOMATION ****************/

void negative_intensity_transformation(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

int x,y;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

DataOut->img_data[x][y]=~DataIn->img_data[x][y];

}

}

}

/*************************** CONTRAST STRECHING **************************/

void contrast_streching(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

unsigned char HIS[256];

unsigned char NHIS[256];

unsigned char SHIS[256];

float scale_factor;

unsigned char low=255;

unsigned char high=0;

unsigned char temp=0;

Page 81: 15 Methods for Image Processing by Svetla Raykova

81

int i,j,x,y;

for(i=0;i<256;i++)

{

HIS[i]=0;

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

HIS[DataIn->img_data[x][y]]++;

}

}

for(i=0;i<256;i++)

{

temp=HIS[i];

if(low>temp)

low=temp;

}

for(j=0;j<256;j++)

{

temp=HIS[j];

if(high<temp)

high=temp;

}

for(j=0;j<low;j++)

{

NHIS[j]=0;

}

for(i=255;i>high;i--)

{

NHIS[i]=255;

}

scale_factor=255.0/(high-low);

for(j=low; j<high; j++)

Page 82: 15 Methods for Image Processing by Svetla Raykova

82

{

NHIS[j]=(j-low)*scale_factor;

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

DataOut->img_data[x][y]=NHIS[DataIn->img_data[x][y]];

}

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

SHIS[DataOut->img_data[x][y]]++;

}

}

}

/******************************* GAMMA CORECTION *************************/

void gamma_corection(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn)

{

unsigned char GL[256];

int x,y,i;

for(i=0;i<256;i++)

{

GL[i]=(unsigned char)operation_gamma(i);

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

DataOut->img_data[x][y]=GL[DataIn->img_data[x][y]];

}

}

}

Page 83: 15 Methods for Image Processing by Svetla Raykova

83

/******************************** SHARPENING *******************************/

void sharpening(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

int kernal_center_x=(C+1)/2;

int kernal_center_y=(R+1)/2;

int row,colm;

int horizontal,vertical;

int x,y,i,j;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

for(i=0;i<R;i++)

{

row=R-1-i;

for(j=0;j<C;j++)

{

colm=C-1-j;

horizontal=x+(i-kernal_center_x);

vertical=y+(j-kernal_center_y);

if(horizontal>=0 && horizontal<H && vertical>=0 &&

vertical<V)

DataOut->img_data[x][y]+=DataIn->img_data [horizontal]

[vertical] * Sharpening_CM2[row][colm];

}

}

}

}

}

/********************************* MIRRORING *******************************/

void mirroring(bmp_strc_tp * DataOut,bmp_strc_tp * DataOut2,bmp_strc_tp * DataIn)

{

int x,y;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

Page 84: 15 Methods for Image Processing by Svetla Raykova

84

{

DataOut->img_data[x][y]=DataIn->img_data[128-x][y];

DataOut2->img_data[x][y]=DataIn->img_data[x][128-y];

}

}

}

/*********************** DIFFERENCE BETWEEN IMAGES **********************/

void difference_between_images(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn,bmp_strc_tp *

DataIn2)

{

int x,y;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

DataOut->img_data[x][y]=abs(DataIn->img_data[x][y] - DataIn2->

img_data[x][y]);

}

}

}

/*************************** HOMOGENEITY OPERATOR ***********************/

void homogeneity_operator(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn )

{

unsigned char WIN[3][3];

short int var=0;

int m=0;

int x,y,i,j;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

m=0;

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

WIN[i][j]=DataIn->img_data[x+i][y+j];

}

}

Page 85: 15 Methods for Image Processing by Svetla Raykova

85

var=abs(WIN[0][0]-WIN[1][1]);

if(var>m)

m=var;

var=abs(WIN[1][0]-WIN[1][1]);

if(var>m)

m=var;

var=abs(WIN[2][0]-WIN[1][1]);

if(var>m)

m=var;

var=abs(WIN[0][1]-WIN[1][1]);

if(var>m)

m=var;

var=abs(WIN[2][1]-WIN[1][1]);

if(var>m)

m=var;

var=abs(WIN[0][2]-WIN[1][1]);

if(var>m)

m=var;

var=abs(WIN[1][2]-WIN[1][1]);

if(var>m)

m=var;

var=abs(WIN[2][2]-WIN[1][1]);

if(var>m)

m=var;

WIN[1][1]=m;

DataOut->img_data[x+i][y+j]=m;

}

}

}

/*************************** DIFFERENCE OPERATOR *************************/

void differece_operator(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

unsigned char WIN[3][3];

Page 86: 15 Methods for Image Processing by Svetla Raykova

86

short int diff=0;

int n=0;

int x,y,i,j;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

n=0;

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

WIN[i][j]=DataIn->img_data[x+i][y+j];

}

}

diff=abs(WIN[0][0]-WIN[2][2]);

if(diff>n)

n=diff;

diff=abs(WIN[1][0]-WIN[1][2]);

if(diff>n)

n=diff;

diff=abs(WIN[2][0]-WIN[0][2]);

if(diff>n)

n=diff;

diff=abs(WIN[2][1]-WIN[0][1]);

if(diff>n)

n=diff;

WIN[1][1]=n;

DataOut->img_data[x+i][y+j]=WIN[1][1];

}

}

}

Page 87: 15 Methods for Image Processing by Svetla Raykova

87

/****************** FIRST ORDER DERIVETIVE - SIMPLE MASKS ****************/

void fod_simple_masks(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

bmp_strc_tp SMPL_X;

bmp_strc_tp SMPL_Y;

int kernal_center_x=(C+1)/2;

int kernal_center_y=(R+1)/2;

int row,colm;

int horizontal,vertical;

int x,y,i,j;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

SMPL_X.img_data[x][y]=0;

SMPL_Y.img_data[x][y]=0;

}

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

for(i=0;i<R;i++)

{

row=R-1-i;

for(j=0;j<C;j++)

{

colm=C-1-j;

horizontal=x+(i-kernal_center_x);

vertical=y+(j-kernal_center_y);

if(horizontal>=0 && horizontal<H && vertical>=0 &&

vertical<V)

SMPL_X.img_data[x][y]+=DataIn->img_data[horizontal]

[vertical] * PREWITT_X[row][colm];

SMPL_Y.img_data[x][y]+=DataIn->img_data[horizontal]

[vertical] * PREWITT_Y[row][colm];

}

}

Page 88: 15 Methods for Image Processing by Svetla Raykova

88

}

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

DataOut->img_data[x][y]= abs (SMPL_X.img_data[x][y]) + abs

(SMPL_Y.img_data[x][y]);

}

}

}

/********* FIRST ORDER DERIVETIVE - COMPASS GRADIENT OPERATOR ********/

void fod_compass_gradient_operator(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

unsigned char temp=0;

unsigned char biggest=0;

int x,y,i,j;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

biggest=0;

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

e.img_data[x][y]+=DataIn->img_data[x+i][y+j] *

R5_MASK_E[i][j];

ne.img_data[x][y]+=DataIn->img_data[x+i][y+j] *

R5_MASK_NE[i][j];

n.img_data[x][y]+=DataIn->img_data[x+i][y+j] *

R5_MASK_N[i][j];

nw.img_data[x][y]+=DataIn->img_data[x+i][y+j] *

R5_MASK_NW[i][j];

w.img_data[x][y]+=DataIn->img_data[x+i][y+j] *

R5_MASK_W[i][j];

sw.img_data[x][y]+=DataIn->img_data[x+i][y+j] *

R5_MASK_SW[i][j];

s.img_data[x][y]+=DataIn->img_data[x+i][y+j] *

R5_MASK_S[i][j];

Page 89: 15 Methods for Image Processing by Svetla Raykova

89

se.img_data[x][y]+=DataIn->img_data[x+i][y+j] *

R5_MASK_SE[i][j];

}

}

temp=e.img_data[x][y];

if(biggest<temp)

biggest=temp;

temp=ne.img_data[x][y];

if(biggest<temp)

biggest=temp;

temp=n.img_data[x][y];

if(biggest<temp)

biggest=temp;

temp=nw.img_data[x][y];

if(biggest<temp)

biggest=temp;

temp=w.img_data[x][y];

if(biggest<temp)

biggest=temp;

temp=sw.img_data[x][y];

if(biggest<temp)

biggest=temp;

temp=s.img_data[x][y];

if(biggest<temp)

biggest=temp;

temp=se.img_data[x][y];

if(biggest<temp)

biggest=temp;

DataOut->img_data[x][y]=biggest;

}

}

}

/**************** SECOND ORDER DERIVETIVE - LAPLACIAN *******************/

void sod_laplacian(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn)

{

Page 90: 15 Methods for Image Processing by Svetla Raykova

90

bmp_strc_tp LPL;

int x,y,i,j;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

LPL.img_data[x][y]=0;

}

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

DataOut->img_data[x][y]+=DataIn->img_data[x+i][y+j] *

ZCL_MASK[i][j];

}

}

}

}

}

/*************** SECOND ORDER DERIVETIVE - ZERO CROSSING ***************/

void sod_zero_crossing(bmp_strc_tp * DataOut, bmp_strc_tp * DataIn)

{

char WIN[R][C];

char NEW_WIN[R][C];

char temp;

char diff;

int x,y,i,j;

int a,b,s,t;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

Page 91: 15 Methods for Image Processing by Svetla Raykova

91

{

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

WIN[i][j]=DataIn->img_data[x+i][y+j];

NEW_WIN[i][j]=DataIn->img_data[x+i][y+j];

}

}

for(s=0;s<R;s++)

{

for(a=0;a<R;a++)

{

for(t=0;t<C-s;t++)

{

for(b=0;b<C-a;b++)

{

if (WIN[s][t]>WIN[s+1][t+1])

{

temp=WIN[s+1][t+1];

WIN[s+1][t+1]=WIN[s][t];

WIN[s][t]=temp;

}

}

}

}

}

diff= abs(WIN[0][0]-WIN[2][2]);

if(diff>zc_treshold)

{

NEW_WIN[1][1]=diff;

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

DataOut->img_data[x+i][y+j]= NEW_WIN[i][j];

}

}

}

}

}

}

Page 92: 15 Methods for Image Processing by Svetla Raykova

92

/*********SECEND ORDER DERIVETIVE - ZERO CROSSING OF LAPLACIAN********/

void sod_zero_crossing_of_laplacian(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

bmp_strc_tp ZCR;

char temp;

char diff;

char WIN[R][C];

char NEW_WIN[R][C];

int x,y,i,j,a,b,s,t;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

ZCR.img_data[x][y]=0;

}

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

WIN[i][j]=DataIn->img_data[x+i][y+j];

NEW_WIN[i][j]=DataIn->img_data[x+i][y+j];

}

}

for(s=0;s<R;s++)

{

for(a=0;a<R;a++)

{

for(t=0;t<C-s;t++)

{

for(b=0;b<C-a;b++)

{

if (WIN[s][t]>WIN[s+1][t+1])

Page 93: 15 Methods for Image Processing by Svetla Raykova

93

{

temp=WIN[s+1][t+1];

WIN[s+1][t+1]=WIN[s][t];

WIN[s][t]=temp;

}

}

}

}

}

diff= abs(WIN[0][0]-WIN[2][2]);

if(diff>zc_treshold)

{

NEW_WIN[1][1]=diff;

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

ZCR.img_data[x+i][y+j]=NEW_WIN[i][j];

}

}

}

}

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

for(i=0;i<R;i++)

{

for(j=0;j<C;j++)

{

DataOut->img_data[x][y]+=ZCR.img_data[x+i][y+j]*

ZCL_OTHER_MASK[i][j];

}

}

}

}

}

Page 94: 15 Methods for Image Processing by Svetla Raykova

94

/*********** SECOND ORDER DERIVETIVE - DIFFERENCE OF GAUSSE ************/

void sod_dog(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

int x,y,i,j;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

{

DataOut->img_data[x][y]+=DataIn->img_data[x][y] *

DOG_9[i][j];

}

}

}

}

}

/************************ COLOR EDGE DETECTION **************************/

void sod_color_edge_detection(bmp_strc_tp * DataOut,bmp_strc_tp * DataIn)

{

bmp_strc_tp HSI;

char WIN[3][3];

char temp=0;

int m=0;

int x,y;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

HSI.img_data[x][y]=0;

}

}

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

HSI.img_data[x][y]=DataIn->img_data[x*3][y*3];

Page 95: 15 Methods for Image Processing by Svetla Raykova

95

}

}

int i,j;

for(x=0;x<H;x++)

{

for(y=0;y<V;y++)

{

m=0;

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

{

WIN[i][j]=HSI.img_data[x+i][y+j];

}

}

temp=abs(WIN[0][0]-WIN[2][2]);

if(temp>m)

m=temp;

temp=abs(WIN[1][0]-WIN[1][2]);

if(temp>m)

m=temp;

temp=abs(WIN[2][0]-WIN[0][2]);

if(temp>m)

m=temp;

temp=abs(WIN[2][1]-WIN[0][1]);

if(temp>m)

m=temp;

WIN[1][1]=m;

DataOut->img_data[x+i][y+j]=WIN[1][1];

}

}

}

Page 96: 15 Methods for Image Processing by Svetla Raykova

96

V. Примерна програма за приложение на библиотека

ANOTHER_IMG_LIB.

/****************************************************************************/

/******************************THE_BIG_LIB.c********************************/

/****************************************************************************/

#include <stdio.h>

#include "bmp_strc.h"

#include "ANOTHER_IMG_LIB.h"

unsigned char choose_function;

unsigned char choose; //old=1,new=anything else

bmp_strc_tp OUTPUT,OUTPUT2;

bmp_strc_tp INPUT,INPUT2;

void main (void)

{

printf("choose function from the library from 1 to 15\n");

scanf("%d",&choose_function);

again:

switch(choose_function)

{

case 1:

{

negative_intensity_transformation(&OUTPUT,&INPUT);

printf("Intensity Transformation - Done!\n");

}

break;

case 2:

{

contrast_streching(&OUTPUT,&INPUT);

printf("Contrast Streching - Done!\n");

}

break;

case 3:

{

Page 97: 15 Methods for Image Processing by Svetla Raykova

97

gamma_corection(&OUTPUT,&INPUT);

printf("Gamma Corection - Done!\n");

}

break;

case 4:

{

sharpening(&OUTPUT,&INPUT);

printf("Sharpening - Done!\n");

}

break;

case 5:

{

mirroring(&OUTPUT,&OUTPUT2,&INPUT);

printf("Mirroring - Done!\n");

}

break;

case 6:

{

difference_between_images(&OUTPUT,&INPUT,&INPUT2);

printf("Difference between Images - Finded!\n");

}

break;

case 7:

{

homogeneity_operator(&OUTPUT,&INPUT);

printf("Homogeneity Operator - Done!\n");

}

break;

case 8:

{

differece_operator(&OUTPUT,&INPUT);

printf("Difference Operator - Done!\n");

}

break;

case 9:

{

fod_simple_masks(&OUTPUT,&INPUT);

printf("FOD Simple Mask - Done!\n");

}

break;

Page 98: 15 Methods for Image Processing by Svetla Raykova

98

case 10:

{

fod_compass_gradient_operator(&OUTPUT,&INPUT);

printf("FOD Compass Gradient Operator - Done!\n");

}

break;

case 11:

{

sod_laplacian(&OUTPUT,&INPUT);

printf("SOD Laplacian - Done!\n");

}

break;

case 12:

{

sod_zero_crossing(&OUTPUT,&INPUT);

printf("SOD Zero Crossing - Done!\n");

}

break;

case 13:

{

sod_zero_crossing_of_laplacian(&OUTPUT,&INPUT);

printf("SOD Zero Crossing of Laplacian - Done!\n");

}

break;

case 14:

{

sod_dog(&OUTPUT,&INPUT);

printf("SOD Difference of Gausse function - Done!\n");

}

break;

case 15:

{

sod_color_edge_detection(&OUTPUT,&INPUT);

printf("SOD Color edge Detection - Done!\n");

}

break;

default:

printf("Program finished without executed function!\n");

}

Page 99: 15 Methods for Image Processing by Svetla Raykova

99

printf("Process the same image (press 1) or new image (press any other key)\n");

scanf("%d",&choose_function);

if(choose_function == 1)

{

int x,y;

for(x=0;x<H;x++)

for(y=0;y<V;y++)

{

INPUT.img_data[x][y]=OUTPUT.img_data[x][y];

}

printf("choose another function from the library from 1 to 15\n");

scanf("%d",&choose_function);

goto again;

}

else

{

int x,y;

for(x=0;x<H;x++)

for(y=0;y<V;y++)

{

INPUT.img_data[x][y]=0x7f;

}

goto again;

}

}