Professional Documents
Culture Documents
SEMINARSKI RAD
1 Uvod ................................................................................................................................... 3
Zaključak.................................................................................................................................. 12
Literatura .................................................................................................................................. 13
1 Uvod
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.
−1 0 1
𝐺𝑥 = [ −2 0 2] ∗ 𝐼
−1 0 1
−1 −2 −1
𝐺𝑦 = [ 0 0 0 ]∗𝐼
+1 +2 +1
Ž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
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:
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 sljedećoj slici možemo vidjeti primjer obrade slike koristeći sobel filter
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.
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.
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;
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.
9
Slika 3. Testiranje slike 512 x 512 piksela(3 dretve)
10
Slika 6. Testiranje slike 2048 x 2048 piksela(3 dretve)
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.
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