• Rezultati Niso Bili Najdeni

Cannyjev detektor robov

3.4 Delovanje algoritmov

3.4.2 Cannyjev detektor robov

Cannyjev detektor robov je zelo poznan in uporaben algoritem za razpoznavanje robov na sliki. Metoda temelji na uporabi diferenčnih operatorjev na diskretizirani sliki, za razpoznavanje robov – območij, kjer je sprememba intenzitete slike največja [14]. V naslednjem koraku se nato izračuna normala na rob in nato se iterativno naprej izloča robove z uporabo glasovanja in dvojnega upragovanja. V predstavljenem delu je prepoznavanje robov ključnega pomena, saj tako lahko preko roba preoblikovanca izmerimo trenutni kot

Metodologija raziskave

preoblikovanja. Za uspešno izvedbo Cannyjevega detektorja robov je potrebno sliko najprej obdelati.

Pretvorba v sivinsko sliko

Običajno so slike zajete s kamero sestavljene iz treh komponent oziroma kanalov, in sicer rdeče, modre in zelene barve. Za to, da se izognemo dodatnemu delu iskanja robov po treh kanalih, se slike pretvorijo v sivinske, saj v nadaljevanju tekom razgradnje slike, se informacija o intenzivnosti posamezne slikovne pike izgubi. Sivinska preslikava se za vsako posamezno slikovno piko, vsake zajete slike, izvede preko naslednje enačbe:

𝐼 = 0,299 ∗ 𝑅 + 0,587 ∗ 𝐺 + 0,114 ∗ 𝐵 (3.4)

Na sliki 3.42 je prikazana transformacija iz barvne slike v BGR formatu, v črno-belo sliko.

Slika 3.42: Črno-bela transformacija barvne slike.

Algoritem v knjižici OpenCV:

cv.cvtColor( src, code[, dst[, dstCn]] )

Preglednica 3.13: Prikaz parametrov algoritma cv.cvtColor.

Parameter Opis

src Izvorna slika, na kateri bo uporabljen

algoritem.

Code Koda, ki kodira tip barvne konverzije – za

črno-belo je uporabljena

cv::COLOR_BGR2GRAY

dstCn Število kanalov izhodiščne slike.

dst Izhodiščna slika, ki ima enako velikost in

tip podatkov kakor src.

Metodologija raziskave

Glajenje slike

Pri uporabi Cannyjevega detektorja robov, moramo sliko pomnožiti z diferenčnimi operatorji, za potrebe razpoznavanja robov. Realne slike so vedno obremenjene tudi s šumom, ki je lahko problematičen pri uporabi diferenčnih operatorjev, saj ti ojačajo šum. V izogib temu je potrebno sliko najprej zgladiti z Gaussovimi jedri, z uporabo konvolucije. Na ta način preko slike vzpostavimo nizko prepustni filter, kjer se višje frekvence, ki se pojavijo na sliki, izgubijo.

Konvolucijsko jedro velikosti 5x5 za Gaussovo glajenje ima naslednjo strukturo:

Preglednica 3.14: Prikaz Gaussovega jedra za glajenje slike.

1 4 6 4 1 4 16 24 16 4 6 24 64 24 6 4 16 24 16 4 1 4 6 4 1

Jedro se aplicira na vse slikovne pike na sliki, torej je trenutno opazovana slikovna pika sredinski (označen z rumeno barvo).

Algoritem v programski knjižici OpenCV:

cv.GaussianBlur( src, ksize, sigmaX[, dst[, sigmaY[, borderType]]] )

Preglednica 3.15: Prikaz parametrov algoritma cv.GaussianBlur.

Parameter Opis

src Izvorna slika, na kateri bo uporabljen

algoritem.

Ksize Velikost konvolucijskega jedra, število

mora biti liho in pozitivno predznačeno.

Lahko je 0, kadar se uporabita sigmaX in sigmaY.

sigmaX Standardna deviacija konvolucijskega jedra

v x smeri.

dst Izhodiščna slika, ki ima enako velikost in

tip podatkov kakor src.

sigmaY Standardna deviacija konvolucijskega jedra

v y smeri.

borderType Metoda ekstrapolacije slikovnih pik na

robu.

Metodologija raziskave

Na sliki 3.43 je prikazano glajenje z Gaussovim filtrom. V primerjavi s sliko 3.42, vidimo, da je slika izgubila veliko ostrine, torej smo filtrirali vse visoke frekvence na sliki.

Slika 3.43: Prikaz slike po glajenju z Gaussovim filtrom.

Upragovanje

V naslednjem koraku je želja dobiti upragovljeno sliko, torej sliko na kateri nastopata le dve vrednosti na slikovnih pikah, in sicer 0 (črna barva) in 255 (bela barva). Na ta način povečamo razlike med področji, pred uporabo diferenčnih operatorjev za razpoznavanje robov.

Pri upragovanju se zamenja vrednost vsake slikovne pike na sliki z novo vrednostjo, v odvisnosti od tega, ali je trenutna vrednost slikovne pike večja ali manjša od pragovne vrednosti:

𝐼(𝑥, 𝑦) = { 0; 𝐼(𝑥, 𝑦) ≤ 𝑃

255; 𝐼(𝑥, 𝑦) > 𝑃 (3.5)

Izbira vrednosti P je ključnega pomena za pravilno razpoznavanje robov. Zaradi tega je potrebno uvesti samodejno izbiro vrednosti P, z uporabo Otsujeve metode. Otsujeva metoda v splošnem razdeli sliko na dve območji – ospredje in ozadje [15]. To naredi tako, da zmanjša varianco med razredi, ki je definirana kot utežena vsota med variancama dveh razredov:

𝜎𝑤2(𝑡) = 𝜔0(𝑡)𝜎02(𝑡) + 𝜔1(𝑡)𝜎12(𝑡) (3.6) kjer sta ω0, ω1 verjetnosti dveh razredov, razdeljeni z pragom t in σ02 σ12 sta varianci teh dveh razredov.

Verjetnost razredov je izračunana iz L košaric v histogramu slike:

Metodologija raziskave

kjer je p verjetnost posamezne košarice v histogramu.

Za dva razreda, je minimizacija med razredne variance enaka maksimizaciji variacije znotraj razreda:

σb2(𝑡) = 𝜎2− 𝜎𝑤2(𝑡) = 𝜔0(𝜇0− 𝜇𝑇)2+ 𝜔1(𝜇1− 𝜇𝑇)2

= 𝜔0(𝑡)𝜔1(𝑡)[𝜇0(𝑡) − 𝜇1(𝑡)]2 (3.9) kjer so ω verjetnosti razredov in μ pomenijo srednje vrednosti razredov:

𝜇0(𝑡) =𝑡−1𝑖=0𝑖𝑝(𝑖)

Algoritem nato deluje po naslednjem postopku:

1. Izračun histograma in verjetnosti za vsak nivo intenzitet, 2. Določitev začetnih vrednosti ωi(0) in μi(0),

3. Iteracija skozi vse možne pragove t = [0, 255], a. Osveži vrednosti ωi in μi,

b. Izračun 𝜎𝑏2(𝑡)

4. Željeni prag je enak maximumu funkcije 𝜎𝑏2(𝑡)

Zato, da je upragovanje čim bolj učinkovito, se za vsako sliko izvede omenjeni algoritem, da za posamezno sliko najde najustreznejšo pragovno vrednost.

Algoritem v programski knjižici OpenCV:

Metodologija raziskave

cv.threshold( src, thresh, maxval, type[, dst] )

Preglednica 3.16: Prikaz parametrov algoritma cv.threshold, pri uporabi Otsujevega upragovanja.

Parameter Opis

src Izvorna slika, na kateri bo uporabljen

algoritem.

thresh Pragovna vrednost.

maxval Največja vrednost za slikovne pike, ki

presežejo pragovno vrednost.

dst Izhodiščna slika, ki ima enako velikost in tip

podatkov kakor src.

type Tip upragovanja (uporabljeno:

cv.THRESH_BINARY+cv.THRESH_OTSU) Na sliki 3.44 je prikazano Otsujevo upragovanje, kjer je izhodiščna slika ustrezno upragovljena, torej najdena je ustrezna vrednost, ki loči med ozadjem in ospredjem slike.

Slika 3.44: Upragovljena slika.

Cannyjev algoritem

V tem koraku je slika pripravljena na Cannyjevo detekcijo robov. V prvem koraku je slika filtrirana z uporabo Sobelovega filtra, in sicer tako v horizontalni kakor v vertikalni smeri.

To naredimo tako, da uporabimo diskretno masko imenovano Sobelov operator, ki je prikazan na sliki 3.45. Ta operacija je narejena s pomočjo konvolucije po vseh slikovnih pikah na sliki, najprej v eni smeri, nato pa v drugi. V tem koraku sliko odvajamo, z namenom, da najdemo območja sprememb intenzitet na sliki – spomnimo se, da sedaj imamo črno-belo, zglajeno in upragovljeno sliko. S tem postopkom bomo torej dobili le konture (območja največjih sprememb) naših upragovljenih struktur.

Metodologija raziskave

Slika 3.45: Prikaz Sobelovega operatorja v x in y smeri.

V grobem so sedaj konture oziroma robovi najdeni, vendar pa to delovanje ni robustno, saj je izhodiščna slika lahko še vedno obremenjena z veliko šuma in ima veliko lažnih robov (slika 3.46). Zaradi tega je v nadaljevanju potrebno algoritem nekoliko razširiti.

Slika 3.46: Prikaz delovanja Sobelovega operatorja. Na levi strani je izhodiščna slika, na desni pa ista slika, na kateri je bil uporabljena diskretna konvolucija s Sobelovim operatorjem.

V naslednjem koraku je potrebno za vsako slikovno piko določiti intenziteto roba in njegovo usmeritev. To je razmeroma trivialno, saj smo v prejšnjem koraku dobili gradiente v x in y smeri na sliki. Intenziteto dobimo s seštevanjem absolutnih vrednosti gradienta v x in y smeri:

|𝐺| = |𝐺𝑥| + |𝐺𝑦| (3.13)

Nato pa dobimo še usmeritev θ roba preko naslednje enačbe:

𝜃 = arctan (𝐺𝑦

𝐺𝑥) (3.14)

Problem, ki se lahko pojavi pri uporabi zgornje enačbe je lahko deljenje z ničlo, ki se lahko zgodi, kadar je gradient v x smeri za neko slikovno pikoenak nič. Zaradi tega moramo upoštevati, da je takrat usmeritev roba enaka 90° ali pa 0°, odvisno od vrednosti gradienta v y smeri, in sicer če je Gy enak 0, potem ima rob usmeritev 0°, v nasprotnem primeru pa 90°.

Ker so ti koti lahko zelo različni med seboj, se v naslednjem koraku izvede diskretizacija možnih smeri, in le na sosednje slikovne pike. To pomeni, da »obstajajo« le naslednje možne

Metodologija raziskave

smeri, in sicer 0°, 45°, 90° in 135°. Nato se vsak izračunan kot, ki v splošnem zajema neko realno številsko vrednost, pripiše najbližji vrednosti izmed omenjenega nabora smeri. To je prikazano na sliki 3.47, kjer so prikazana območja, ki odstopajo za 22,5° na vsako stran od glavnih štirih smeri.

Slika 3.47: Prikaz diskretizacije smeri po kotih 0°, 45°, 90° in 135°.

Ko imamo poznane vse usmeritve, ki so bile tudi ustrezno pripisane po diskretnih smereh, se za vsako okolico vsake slikovne pike preveri intenziteta sosednjih slikovnih pik. V kolikor je intenziteta okoliških pik nižja kakor od trenutno opazovanega pike, se na to mesto pripiše vrednost 0 (slikovna pika se torej obarva črno). Tako dobimo sliko, ki vsebuje le tanke konture robov, z vrednostjo 255 oziroma bele barve, vse ostale vrednosti na sliki pa so enake 0 oziroma črne barve.

Zaradi obremenitve šuma na realnih slikah, so lahko te rezultirajoče črte prekinjene oziroma nezvezne. Zaradi tega se v naslednjem koraku uporabi še dvojno upragovanje. Določita se dva pragova T1 in T2, ki označujeta vrednost intenzitete, s pomočjo katerih določimo prave robove od nepravih. V kolikor je določena intenziteta slikovne pike, ki označuje rob, višja ali enaka prvemu pragu T1, se ta smatra kot končen rob. Če je intenziteta neke slikovne pike nižja kakor vrednost T2, so te slikovne pike avtomatsko zavržene in obarvani v črno. V kolikor pa se vrednosti slikovnih pik nahajajo med pragovoma T1 in T2, pa se za vsakega pogleda, ali ima v svoji bližnji okolici kakšen pika, ki ima vrednost višjo kakor prvi prag T1.

V tem primeru se to slikovno piko priključi k robnim pikam, v nasprotnem primeru pa se jo zavrže in obravnava kot ozadje – obarva se črno.. Na ta način dobimo sliko binarnih vrednosti, kjer bele slikovne pike predstavljajo robove.

Algoritem v programski knjižici OpenCV:

cv.Canny( image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]] )

Metodologija raziskave

Preglednica 3.17:Prikaz parametrov algoritma cv.Canny.

Parameter Opis

image Izvorna slika, na kateri bo uporabljen

algoritem. (8-bitna)

threshold1 Prvi prag za histerezno operacijo (Dobljen iz Otsujevega upragovanja)

threshold2 Drugi prag za histerezno operacijo (Dobljen iz Otsujevega upragovanja, običajno polovična vrednost prvega praga.)

edges Izhodiščna 8-bitna slika, ki ima enako velikost

in tip podatkov kakor src.

apertureSize Velikost odprtine za Sobelov operator.

L2gradient Zastavica, ki spremeni način izračuna

gradienta na sliki (privzeta vrednost je 0, torej uprabi se hitrejši in računsko manj zapleten način.)

Na sliki 3.48 je prikazana slika obdelana s Cannyjevim algoritmom. Z iskanjem gradientov in preko uprabe dvojnega upragovanja so bile na sliki najdeni praktično vsi robovi. Opazi se pa problem, da so lahko linije nekoliko »žagaste«, torej so lomljene. Ta problem se lahko reši v naslednjem koraku z uporabo Houghove preslikave pri iskanju ravnih linij, kar je prikazano v naslednjem poglavju - Houghova preslikava.

Slika 3.48: Slika po obdelavi z Cannyjevim algoritmom.