You are on page 1of 13

SVEUČILIŠTE U MOSTARU

FAKULTET STROJARSTVA, RAČUNARSTVA I ELEKTROTEHNIKE


DIPLOMSKI STUDIJ RAČUNARSTVA

SEMINARSKI RAD

Sobel filter u obradi slike

Kolegij: Napredne arhitekture računala Studenti: Dario Babić


Pero Kordić
Mentor: prof.dr.sc.Sven Gotovac

Mostar, rujan, 2018.


Sadržaj

1 Uvod ................................................................................................................................... 3

2 Princip izvedbe sobel filtera ............................................................................................... 4

3 Implementacija u programskom jeziku C ........................................................................... 7

3.1 Sekvencijalna izvedba ................................................................................................. 7

3.2 Paralelna izvedba(C11 standard) ................................................................................. 8

4 Performanse u izvođenju programa na različitim arhitekturama........................................ 9

Zaključak.................................................................................................................................. 12

Literatura .................................................................................................................................. 13
1 Uvod

Detekcija rubova je kada koristimo matematičku matricu za izračunavanje područja različitih


intenziteta slike. Područja gdje postoje ekstremne razlike u intenzitetima piksela obično
označavaju rub predmeta. Nakon pronalaska svih velikih razlika u intenzitetu slike, tada smo
otkrili sve rubove na slici. Danas postoji mnoštvo algoritama za detekciju rubova, od kojih
među najpoznatije spada sobel filter. Sobel detektori rubova procjenjuju gradijent na osnovu
maski 3x3 i ukoliko je gradijent veći od definiranog praga piksel se proglašava kao rubni.
Sobelov detektor rubova je najpoznatiji i najpopularniji među klasičnim metodama zbog
svoje jednostavnije implementacije i boljih performansi pri detekciji dijagonalnih rubova.
Najveći nedostatak klasičnih metoda detekcije rubova u koje spada i Sobel je njihova velika
osjetljivost na šum, jer ne sadrže korak nisko propusnog filtriranja. Dakle šum može izazvat
lažne detekcije rubova na slici. Kroz ovaj rad je implementiran algoritam sobel detektora ruba
i to u programskom jeziku C++. Implementirane su sekvencijalna i paralelna više - dretvena
izvedba. Na početku je opisan princip izvedbe algoritma, opis programskog koda, te su na
posljetku izmjerene i uspoređene performanse navedenih implementacija.

3
2 Princip izvedbe sobel filtera

Kod sobel detekcije rubova, slika se prvo obrađuje u X i Y smjeru, a zatim se kombiniraju
zajedno kako bi stvorili novu sliku koja predstavlja zbroj X i Y rubova slike. Računanje u X
smjeru se naziva horizontalni sobel filter i označit ćemo ga s Gx, dok računanje u Y smjeru se
naziva vertikalni sobel filter i označit ćemo ga s Gy.

Horizontalni sobel filter se dobiva prema sljedećoj formuli:

−1 0 1
𝐺𝑥 = [ −2 0 2] ∗ 𝐼
−1 0 1

Operator * predstavlja operaciju konvolucije, a I matricu nad kojom se vrši horizontalni


sobel filter. Na sličan način ćemo odrediti i vertikalni sobel filter:

−1 −2 −1
𝐺𝑦 = [ 0 0 0 ]∗𝐼
+1 +2 +1

Na sljedećem primjeru možemo vidjeti kako izgleda operacija konvolucije.


Ako imamo neku ulaznu sliku, sa sljedećim vrijednostima piksela:

100 100 200 200


100 100 200 200
100 100 200 200
100 100 200 200

Želimo li na ovu sliku, odnosno vrijednost 100 na poziciji(2, 2) primijeniti horizontalni sobel
filter, imat ćemo sljedeću situaciju

4
100 100 200 200
-1 0 1
100 100 200 200
-2 0 2
100 100 200 200
-1 0 1
100 100 200 200

100 *( -1) 100 * 0 200 *1 200


100 *(-2) 100 * 0 200 *2 200
100 * (-1) 100 * 0 200 * 1 200
100 100 200 200

Vrijednost 100 na poziciji (2, 2) imat će novu vrijednost, koja će biti jednaka sumi novih
susjednih elemenata
−100 − 200 − 100 + 200 + 400 + 200 = 400

Znači nova vrijednost bi bila 400 i slika bi imala poprilično istaknut rub u tom trenutku.
Nakon što smo obradili sliku u X smjeru, tada možemo obraditi sliku i u Y smjeru.
Magnituda oba X i Y kernela će se zbrojiti zajedno kako bi se dobila konačna slika koja
pokaziva sve rubove na slici. Obrada slike u Y smjeru izgleda ovako:

100 100 200 200


-1 -2 -1
100 100 200 200
0 0 0
100 100 200 200
1 2 1
100 100 200 200

100 *( -1) 100 * (-2) 200 *(-1) 200


100 *0 100 * 0 200 *0 200
100 * 1 100 * 2 200 * 1 200
100 100 200 200

5
Vrijednost 100 na poziciji (2, 2) imat će novu vrijednost, koja će biti jednaka sumi novih
susjednih elemenata
−100 + 100 − 200 + 200 − 200 + 200 = 0

Na kraju, nakon što su izračunate vrijednosti za vertikalni i horizontalni sobel, određuje se


amplituda gradijenta,odnosno konačna vrijednost piksela nakon primjene sobel maske
koristeći sljedeći izraz:

𝐺 = √𝐺𝑥 2 + 𝐺𝑦 2 = √4002 + 02 = 400

Na sljedećoj slici možemo vidjeti primjer obrade slike koristeći sobel filter

Slika 1. Originalna slika (lijevo), sobel detekcija rubova (desno)

6
3 Implementacija u programskom jeziku C
Ovaj seminarski zadatak „Sobel filter“ je implementiran u programskom jeziku C.
Tijekom izrade programa korištene su neke biblioteke koje su prethodno implementirane, pa
ćemo spomenuti neke od njih. Za mjerenje vremena izvedbe koristi se biblioteka mjerenje.h u
koju je implementirana funkcija koja će izmjeriti vrijeme izvedbe programa, za manipulaciju
sa slikama korištena je biblioteka CImg. Također uz ove biblioteke korištene su i ugrađene
biblioteke, kao što je thread, potrebna za rad s dretvama u C11 standardu. Prvo ćemo
implementirati sekvencijalnu izvedbu koda, zatim ćemo na osnovu nje odraditi
implementaciju u C11 standardu.

3.1 Sekvencijalna izvedba

Prilikom izrade programa koji će se naknadno paralelizirat potrebno je prvo odraditi


sekvencijalnu izvedbu odnosno implementaciju. Dakle na osnovu sekvencijalne izvedbe
odradit će se paralelna izvedba. Sekvencijalna izvedba sobel filtera se realizira pozivom
funkcije
void sobel_filter(float **izvorna, float **nova, int poc, int kraj)

U funkciju su kao parametri proslijeđene dvije matrice, jedna predstavlja original sliku koju
želimo obraditi, a druga je prazna slika(matrica) u koju će se spremiti vrijednosti piksela
novo-nastale slike. Funkcija kao parametre također prima početak i kraj, koji označavaju
početni i krajnji redak u matrici koji će se filtrirati. Ti parametri su nam posebno značajni kod
paralelne izvedbe kako bi mogli raspodijeliti zadatke po dretvama.

void sobel_filter(float **izvorna, float **nova, int poc, int kraj)


{
int x1, y1, x2, y2;
float pixel_x, pixel_y;

double sobel_x[3][3] = { { -1, 0, 1 },


{ -2, 0, 2 },
{ -1, 0, 1 }
};

double sobel_y[3][3] = { { -1, -2, -1 },


{ 0, 0, 0 },
{ 1, 2, 1 }
};

7
for (int i = poc; i<kraj; i++)
{
for (int j = 0; j<stupac; j++)
{
if ((i>0) && (j>0) && (i<redak - 1) && (j<stupac - 1))
{
pixel_x = 0, pixel_y = 0;
x1 = 0, x2 = 0, y1 = 0, y2 = 0;
x1 = i - 1;
x2 = i + 1;
y1 = j - 1;
y2 = j + 1;
if (x1<0) x1 = 0;
if (x2 >= redak) x2 = redak - 1;
if (y1<0) y1 = 0;
if (y2 >= stupac) y2 = stupac - 1;

for (int m = x1, xs = 0; m <= x2; m++, xs++)


{
for (int n = y1, ys = 0; n <= y2; n++, ys++)
{
pixel_x += (sobel_x[xs][ys] * izvorna[m][n]);
pixel_y += (sobel_y[xs][ys] * izvorna[m][n]);
}
}
nova[i][j] = sqrt((pixel_x * pixel_x) + (pixel_y * pixel_y));
}
}
}
}
Na početku funkcije smo inicijalizirali horizontalnu i vertikalnu masku sobel filtera. Zatim se
kroz petlje prolazi kroz svaki element matrice, određuju se susjedni članovi i primjenjuju se
horizontalni i vertikalni filter. Na kraju se u novu matricu sprema vrijednost koja predstavlja
amplitudu gradijenta prema odgovarajućoj formuli, i ta vrijednost predstavlja novi piksel
nakon sobel filtriranja.

3.2 Paralelna izvedba(C11 standard)

Paralelna C11 izvedba realizirana je slično kao i sekvencijalna izvedba, razlika je to što
se C11 izvedba izvodi sa dvije ili više dretvi. Raspodjela po dretvama se vrši na osnovu
parametara poc i kraj u funkciji, koji određuju dio za izvršavanje pojedinačne dretve. Primjer
C11 izvedbe na 4 instrukcijske dretve:
#define num_threads 4
std::thread t[num_threads];
for (int i = 0; i<num_threads; i++)
{
int poc, kraj, korak;
if (i<num_threads - 1)
{
korak = redak / num_threads;
poc = i*korak;
kraj = poc + korak;
t[i] = std::thread(sobel_filter, sImg, sImg_nova_par, poc, kraj);
}

8
else
{
korak = redak / num_threads;
poc = i*korak;
kraj = poc + korak + redak%num_threads;
t[i] = std::thread(sobel_filter, sImg, sImg_nova_par, poc, kraj);
}
U svakoj niti (eng. thread) se poziva jednaka sobel filter funkcija i svaka nit neovisna jedna o
drugoj obrađuje, u ovom primjeru četvrtinu slike. C11 izvedbu je moguće realizirati i sa
manje thredova, ali bi performanse bile lošije, što je i za očekivat.

4 Performanse u izvođenju programa na različitim


arhitekturama
Testiranje performansi ćemo izvest na dvije slike i to dimenzija (512 x 512) i (2048
2048) piksela. U pogledu paralelizacije, program ćemo testirati na 2, 3, i 5 dretvi. Originalne
slike, kao i slike koje su nastale nakon filtriranja nalaze se u prilogu projekta u mapi image.

Slika 2. Testiranje slike 512 x 512 piksela(2 dretve)

9
Slika 3. Testiranje slike 512 x 512 piksela(3 dretve)

Slika 4. Testiranje slike 512 x 512 piksela(5 dretvi)

Slika 5. Testiranje slike 2048 x 2048 piksela(2 dretve)

10
Slika 6. Testiranje slike 2048 x 2048 piksela(3 dretve)

Slika 7. Testiranje slike 2048 x 2048 piksela(5 dretvi)

Sekvencijalna C11 izvedba


Sobel filter
izvedba 2 dretve 3 dretve 5 dretvi
Slika (512x512) 0.067 sec 0.051 sec 0.030 sec 0.032 sec
Slika(2048x2048) 1.040 sec 0.596 sec 0.477 sec 0.383 sec

Tablica 1. Rezultati performansi izvođenja programa

11
Zaključak

Detektirati rubove na slici spada u vjerojatno temeljne pojmove u odradi slike. Sama
detekcija po sebi i nema toliko značaja, međutim u nekoj daljnjoj analizi i obradi kao na
primjer u prepoznavanju objekata ima značajnu ulogu. Proces detekcije rubova
podrazumijeva da se za sve ulazne elemente neke slike, odrede nove vrijednosti na osnovu
njihovih susjednih članova. Tema ovog seminarskog rada je sobel filter, koji spada u jednu od
najpopularnijih metoda u detekciji rubova. Algoritam funkcionara na način da se najprije
detektiraju horizontalni, a zatim vertikalni rubovi, te se nad njihovom sumom dobivaju
konačni rezultati.

U ovom projektnom zadatku sobel filter je implementiran na 2 arhitekture, dakle


sekvencijalna izvedba i C11 izvedba. Testiranje performansi je izvršeno na slikama dimenzija
|512 x 512| i |2048 x 2048| piksela. Dobiveni su rezultati koji ukazuju da čak u nekim
slučajevima do 3 puta bolje performanse daje paralelna izvedba što je i za očekivat zbog
svoje velike moći paralelizacije programa. Kod slike |512 x 512| možemo primijetiti kad smo
povećali broj dretvi na 5 da nismo dobili očekivano ubrzanje, kao što je u slučaju druge slike
koja je veći dimenzija. Uspoređujući testiranja kao konačni zaključak možemo iznijeti
činjenicu povećavajući broj dretvi, kao i dimenzije ulazne slike dobivamo znatno bolje
performanse u paralelnoj izvedbi.

12
Literatura

http://www.zemris.fer.hr/~kalfa/ZR/Juric_ZR_2010.pdf,

http://www.akustika.hr/_download/repository/Lokalizacija_registarskih_plocica_v11.0.pdf

https://en.wikipedia.org/wiki/Edge_detection

http://homepages.inf.ed.ac.uk/rbf/HIPR2/sobel.htm

http://proceedings.informingscience.org/InSITE2009/InSITE09p097-107Vincent613.pdf

13

You might also like